一Jar和动态类加载

8
我们目前正在研究在应用程序中使用OneJar(由于一些原因),但我们的应用程序使用了许多自定义的URLClassloader来加载应用程序扩展。当打包为“OneJar” Jar时,我们会遇到ClassNotFound异常。所涉及的类位于捆绑的Jar中,我们只是依赖类加载机制来解析父/子关系。也就是说,我们有一个通用的接口存储在捆绑的Jar中(应该在父类加载器上下文中),扩展实现了这个接口(允许我们调用扩展),并依赖于子类加载器能够使用父类加载器的资源查找功能。有没有人对此有任何经验或能够阐述如何解决这个问题。我对其他类似机制感兴趣(将我们的库Jar捆绑到单个Jar资源中,而不需要将所有内容解压缩并打包到单个文件中)。

你知道吗,如果有人在不留下任何评论的情况下对你进行了负面评价,那么你必须要欣赏他们的勇气。这样做对任何人都没有好处。如果没有一些解释,很难知道如何在未来改进问题/答案。 - MadProgrammer
1个回答

7
我发现我对我们的类加载器如何被创建做了一些假设。
我以为类加载器会使用它的类加载器作为父级(即getClass().getClassLoader()),但实际上并不是这样。
相反,它使用了SystemClassLoader。这意味着当子类加载器寻找共享接口时,它找不到它(因为它在查找SystemClassLoader而不是OneJar类加载器)。
我通过将CustomClassLoader.class.getClassLoader()添加到我们自定义类加载器的构造函数中来纠正这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接