繁体   English   中英

Java的类加载器与jars-within-jars

[英]Java's classloader versus jars-within-jars

我们有一个可执行的JAR文件, 有时包含其他JAR文件。 (整个事情依赖于其他四个下载的JAR,位于太空中巨型部署乌龟的背面。)在运行时,我们动态加载嵌套的JAR文件,执行以下操作:

// wearyingly verbose error handling elided

URL nestedURL = the_main_system_classloader.getResource("path/to/nested.jar");
File temp = File.createTempFile (....);
// copy out nestedURL contents into temp, byte for byte

URL tempURL = temp.toURI().toURL();
URLClassLoader loader = URLClassLoader.newInstance(new URL[]{ tempURL });
Class<?> clazz = loader.loadClass("com.example.foo.bar.baz.Thing");
Thing thing = (Thing) clazz.newInstance();
// do stuff with thing

这种技术之前已在这里提出过; 链接包括这一个这一个 我们目前的代码有效...

...大多。 我真的想找到一些方法来避免临时文件的创建和复制(以及最终的清理,因为众所周知, deleteOnExit是邪恶的 )。 毕竟,在开始时获得的URL指向JAR:

URL nestedURL = the_main_system_classloader.getResource("path/to/nested.jar");
// nestedURL.toString() at this point is
// "jar:file:/C:/full/path/to/the/executable.jar!/path/to/nested.jar"
URLClassLoader loader = URLClassLoader.newInstance(new URL[]{ nestedURL });
Class<?> clazz = loader.loadClass("com.example.foo.bar.baz.Thing");

但是loadClass会抛出一个ClassNotFound。

URLClassLoader可以根本不处理这个JAR-in-a-JAR案例吗? 或者我是否需要对所涉及的一个或多个路径(nestedURL或传递给loadClass的字符串)执行某些操作才能使其工作?

香草URLClassloader的AFAIK无法处理它。

到目前为止,这是你的答案。

除了您的解决方案,我还有两个其他的可能性:

  1. 创建一个胖罐(p.ex.使用Maven Shade)
  2. 创建一个自定义类加载器,但这是一项艰苦的工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM