我们有一个可执行的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
这种技术之前已经提到过;链接包括this one和this one。我们现有的代码有效......
...居多。我真的想找到一些方法来避免临时文件的创建和复制(以及最终的清理,因为众所周知,deleteOnExit is evil)。毕竟,在开始时获得的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的字符串)执行某些操作才能使其工作?
答案 0 :(得分:1)
AFAIK vanilla URLClassloader无法处理它。
到目前为止,这是你的答案。
除了你的解决方案之外,我还有其他两种可能性: