将jar-Files加载到ClassLoader中,即使它们位于jar

时间:2018-03-23 15:41:06

标签: java url classloader

我们有一些外部Libs(让我们称之为magic.jar),我们必须在一个单独的ClassLoader中加载它们。

(背景:有不同版本的lib:magic.12.jar,magic.13.jar,...不同的版本包含很多相同的类,这意味着,我们不能将它们放在同一个类中类加载器。)

jar文件位于我们项目的资源文件夹中。

直到这里,没有问题。但现在是棘手的部分:

我们的项目有不同的构建分布。所以调用获取jar-Resource-URL

URL url = JarExtractor.class.getResource("/lib/magic.jar");

返回不同的网址:

// if we start from IntelliJ
// -> lib is directly on drive
file:/../workspace/our-application/out/production/resources/lib/magic.jar

// if we build normal artifact
// -> lib is included in our application.jar
jar:file:/tmp/our-application.jar!/BOOT-INF/classes!/lib/magic.jar

// if we build with a wrapping artifact
// -> lib is included in our application.jar which itself is included in a wrapping application
jar:file:/tmp/our-application-wrapped.jar!/BOOT-INF/lib/our-application.jar!/lib/magic.jar

我们预计URLClassLoader()也会处理交错目标。当我们意识到这不起作用时,我们构建了一个util,它解析给定的url并将jar文件解压缩到一个临时文件夹,我们可以在其中找到一个简单的"文件:/ tmp /...& #34; -URL。

首先,我们的解决方案感觉很脏。其次,我们不能指望总是有一个可访问的文件系统。那么,有解决方案(lib)还是至少更好的方法?

实际上,我们正在尝试使用内存网址(inspired by)。我们的想法是拥有一个带有自己的URLConnection实现的URL。这种方法似乎很有希望,但URLClassLoader只是忽略了它。

0 个答案:

没有答案