8

我们目前正在调查我们的应用程序中 OneJar 的使用(出于多种原因),但我们的应用程序使用了一些 customURLClassloader来加载应用程序扩展。

当捆绑为“OneJar”Jar 时,我们会遇到ClassNotFound异常。有问题的类驻留在捆绑的 Jar 中,我们只是依靠类加载器机制来解决父/子关系。

那是。我们有一个通用interface的存储在捆绑的 Jar 中(应该在父类加载器上下文中)。扩展实现了这一点interface(允许我们调用扩展)并依赖子类加载器使用父类加载器的资源查找功能的能力。

有没有人对此有任何经验或阐明我们如何解决它。

我会对其他类似的机制感兴趣(用于将我们的库 Jar 捆绑到单个 Jar 资源中,不需要使用将所有内容和 Jar 解压缩到单个文件中)

4

1 回答 1

7

我发现我对我们的类加载器是如何创建的做了一些假设。

我假设类加载器将使用它的类加载器作为它的父级(即 getClass().getClassLoader()),但事实并非如此

相反,它使用的是SystemClassLoader. 这意味着当子类加载器去寻找共享接口时,它找不到它(因为它正在查看SystemClassLoader而不是 OneJar 类加载器)。

我通过添加CustomClassLoader.class.getClassLoader()到我们的自定义类加载器的构造函数来纠正这个问题

于 2012-08-16T04:58:36.287 回答