有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

webapp内部的java自定义类加载器、JSP执行和资源检索

由于项目的需要,我需要创建一个webapp,在执行时,它将允许一些用户上传类似于小型应用程序的zip文件,并将包含。类文件、资源(图像、css、js等)甚至还有lib文件。这个zip文件几乎就像一个war文件

有什么方法可以轻松编写代码吗?好吧,我想我知道如何编写自定义类加载器来从zip文件(Java - Custom ClassLoader - trying to load a class using class file full path)内部加载类,甚至在浏览器请求时编写资源检索代码,但不知道如何执行zip文件中的JSP文件或在zip文件中加载jar lib文件

编辑:webapp必须管理加载的应用程序,无法实现下面的回答,因为webapp需要“主”webapp才能运行。另外,“主”webapp允许应用程序的版本控制。用户将能够上传新版本并升级到它,甚至在新版本开始失败时进行降级


共 (2) 个答案

  1. # 1 楼答案

    要做到这一点并不容易。工作量很大。上课的人是非常挑剔的动物。可以说,创建Tomcat之类的东西的大部分工作都与类加载器有关,其余的只是配置。即使这些年过去了,我们仍然有问题

    例如,Tomcat非常积极地尝试卸载现有的Web应用程序,使用Java类库的内部信息来寻找类加载器泄漏的位置等。尽管他们做出了努力,但仍然存在问题

    Glassfish的最新版本已经(或将要)能够对应用程序部署进行版本化。你可能很幸运,只要侵入Tomcats内部路由和映射代码来管理版本控制

    如果您正在运行一个EJB容器,那么您可以将核心服务放在EJB中,让WAR与它们对话(您可以使用通用servlet容器中的web服务来实现这一点,但是许多EJB容器可以将远程语义转换为本地语义,以便调用同一容器)

    你也可以看看OSGI。这是另一个真正需要管理的难题,但它可能有足够的粒度,甚至可以为您提供版本控制,但您的用户都不想使用它。我有没有提到这真的很难处理?我们这样做是为了动态加载web内容和逻辑,但我们不提供版本

    如果你必须在一场战争中控制一切,那么你最好的选择就是在Java上下赌注,而不是使用脚本语言。您倾向于对脚本环境的运行时有更多的控制,尤其是如果您不允许他们访问任意Java类的话

    有了它,你可以上传任何你想要的负载,自己处理所有的分派到静态资源和逻辑(这意味着你可以处理版本控制方面)。在“JSP”页面上使用Velocity之类的工具,然后在逻辑上使用Javascript或其他工具

    版本化环境可能很难实现。如果你不在乎原子化,这显然更容易。如果你能负担得起“停机时间”(先让v1离线,然后再让v2上线),那就容易多了。如果你上传每个版本的全部内容,这真的很容易。我的系统允许增量更改,并且具有写时复制语义,所以这要困难得多。但我真的不想为每个版本上传几Gb的媒体

    最基本的收获是,在处理类加载器时,可能会有龙——这些东西没有什么容易的,而且还有一些替代方法,可以让代码进入生产,而不是制造伤疤和愤怒的龙。使用脚本语言可以极大地简化这一过程。剩下的就是分派,这可以通过过滤器或servlet来完成

    您将从重新实现HTTP协议的坚实部分中获得巨大的乐趣,因为servlet容器并没有真正向您公开该功能,所以这样做也总是一件好事。也就是说,如果你想在网络上成为一个好公民,你就会想这么做。你总是可以不断地把内容塞进客户的喉咙里,缓存和代理都会被诅咒

  2. # 2 楼答案

    您可以在web容器webapps目录中手动创建一个类似战争的结构,并将类、JAR和JSP放在那里

    考虑到web容器中启用了热重新部署,它会自动为找到的这个新web应用程序指定一个单独的类加载器

    在大多数情况下,Web容器考虑任何具有Web-INF子文件夹的文件夹,该文件夹包含有效的Web。xml文件是一个web应用程序。您可以通过修改META-INF/context中的上下文配置来限制对这个新webapp的访问。Tomcat中的xml

    控制热重新部署、类加载器策略等取决于您的web容器的类型,但我希望您的web容器不比Tomcat差,Tomcat可以处理所有这些