我们目前正在研究在我们的应用程序中使用OneJar(由于多种原因),但我们的应用程序使用了许多自定义URLClassloader
来加载应用程序扩展。
当捆绑为“OneJar”Jar时,我们会获得ClassNotFound
个例外。有问题的类存在于捆绑的Jar中,我们只是依靠类加载器机制来解析父/子关系。
就是这样。我们有一个共同的interface
,它存储在捆绑的Jar中(应该在父类的类加载器上下文中)。扩展实现了这个interface
(允许我们调用扩展)并依赖于子类加载器使用父类加载器的资源查找功能的能力。
是否有任何人对此有任何经验或对我们如何解决它有任何启示。
我对其他类似的机制感兴趣(将我们的库Jar捆绑到一个Jar资源中,不需要用来解开所有东西,将Jar放到一个文件中)
答案 0 :(得分:7)
我发现我对如何创建类加载器做了一些假设。
我认为类加载器会使用它的类加载器作为它的父级(即getClass()。getClassLoader())但它不是
相反,它使用的是SystemClassLoader
。这意味着当子类加载器寻找共享接口时,它找不到它(因为它正在查看SystemClassLoader
而不是OneJar类加载器。)
我通过将CustomClassLoader.class.getClassLoader()
添加到我们的自定义类加载器