webapp中的自定义类加载器,JSP执行和资源检索

时间:2011-11-06 11:51:39

标签: java jsp classloader

由于项目要求,我需要创建一个webapp,在执行时,允许一些用户上传像小应用程序一样的zip文件,并包含.class文件,资源(图像,css,js,...)甚至是lib文件。该zip文件几乎就像一个war文件。

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

编辑:webapp必须管理加载的应用程序,没有办法实现这个,如下面的回答,因为webapps需要“主”webapp生存。此外,“master”webapp允许应用程序的版本控制。用户将能够上传新版本并升级到新版本,甚至在新版本开始失败时进行降级。

2 个答案:

答案 0 :(得分:1)

没有简单的方法可以做到这一点。这是很多工作。类加载器是非常挑剔的野兽。可以说,创建像Tomcat这样的东西的大部分工作都在争论类加载器,其余的只是配置。即使经过这么多年,我们仍然有问题。

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

最新版本的Glassfish具有(或将具有)版本应用程序部署的能力。你可能会好运,只需攻击Tomcats内部路由和映射代码来管理版本控制。

如果您正在运行EJB容器,您可以将核心服务放在EJB中并让WAR与它们通信(您可以在通用servlet容器中使用Web服务执行此操作,但许多EJB容器可以转换远程语义in to Local语义,用于调用同一容器。)

您还可以查看OSGI。这是管理的另一个真正的痛苦,但它可能有足够的粒度甚至可以为您提供版本控制,但您的用户都不会想要使用它。我提到它真的很痛苦吗?我们这样做是为了动态加载Web内容和逻辑,但我们不对此进行版本化。

如果你必须让一切都在一个WAR的控制之下,那么最好的办法就是在Java上使用脚本语言。您倾向于对脚本环境的运行时有更多的控制,特别是如果您不让它们访问任意Java类。

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

版本化环境可能很难实现。如果你不关心原子地做它,它显然更容易。如果你能负担得起“停机时间”(让v1脱机然后调出v2),那就容易多了。如果您要上传每个版本的全部内容,那真的很容易。我的系统允许增量更改并具有写时复制语义,因此要困难得多。但我真的不想为每个版本上传几个Gb媒体。

基本的要点是,在处理类加载器时,会有龙 - 对于那些人来说没有什么是容易的,并且有替代方案实际上将代码输入生产而不是创造疤痕和生气的龙。使用脚本语言极大地简化了这一过程。所有其余的都是调度,可以使用过滤器或servlet完成。

您将获得重新实现HTTP协议的一大块实现这一目标的巨大乐趣,这一直是一种享受,因为servlet容器并没有真正向您公开该功能。也就是说,如果你想成为网络上的好公民,你会想要这样做。你总是可以不断地将内容推向客户的喉咙,缓存和代理被诅咒。

答案 1 :(得分:0)

您可以在Web容器webapps目录中手动创建类似WAR的结构,并将类,JAR和JSP放在那里。

鉴于您的Web容器中启用了热重新部署,它会自动为它找到的新Web应用程序指定一个单独的类加载器。

在大多数情况下,Web容器会将包含有效web.xml文件的WEB-INF子文件夹的任何文件夹视为Web应用程序。您可以通过修改位于META-INF / context.xml中的上下文配置来限制对此新Web应用程序的访问。

控制热重新部署,类加载器策略等取决于您的Web容器的类型,但我希望您不会比Tomcat更糟糕,它可以处理所有这些。