【发布时间】:2011-09-20 15:11:48
【问题描述】:
是否有一种标准方式(即由一些 Java/J2EE/etc. 规范定义)为 Java Servlet 容器提供自定义类加载器,该容器应该用于加载 WAR 文件?
在一个新项目中,我们正在扩展一个带有 Web 服务的大型商业 Java 软件包 (Foo),这需要一定的部署灵活性(作为单独的服务等)。特别是,我们希望避免在每个 WAR 文件中包含所有 Foo 软件依赖 Jar 文件的必要性,因为它们数量众多且很大,并且会随着我们开发的补丁/错误修复版本而改变。同样,非常不希望将所有依赖项复制到每个 Servlet 容器的“lib”目录中。
理想情况下,我想告诉 Java 应用程序服务器这些 WAR 文件必须使用我将提供的自定义类加载器来加载,该类加载器会自动包含 Foo 软件依赖项 Jars。像这样的东西(在 Java 伪代码中):
public class MyWarFileClassLoader extends ClassLoader {
protected URLClassLoader urlcl;
public MyWarFileClassLoader(File warFile) {
File installDir = System.getEnv("FOO_HOME");
List<File> fooEntries = new File(installDir, "jars").listFiles("*.jar");
fooEntries.add(new File(installDir, "resources"));
fooEntries.add(warFile);
this.urlcl = new URLClassLoader(fooEntries);
}
public Class<?> findClass(String name) {
return this.urlcl.findClass(name);
}
}
如果没有标准方法来做到这一点,是否有一种直接的方法可以为多个 WAR 文件实现相同的目标,而不管目标 Servlet 容器是什么?
[编辑]
换句话说:是否有一种通用模式允许 WAR 文件在运行时管理它们自己的依赖项,而不是依赖于 Servlet 容器配置?当然,我可以让 WAR 文件清单包含一个 Class-Path 属性,但是这些条目在构建时仍然是“硬编码”的,而不是在运行时自动检测到。
【问题讨论】:
标签: java jakarta-ee classloader war