我已经在开放的自由中托管了一个Web应用程序,我正在尝试类加载一些位于jar中的第三方Java类。我将文件夹添加为包含 jar 文件的库,并将该库添加为类加载器。但是当我尝试加载它时,我遇到了一个找不到类的异常。
此外,当我使用URLClassLoader时,它工作得很好。但是我想将URLClassLoader更改为System ClassLoader
我的服务器.xml包含以下行。
<application location="${application.name}"
type="war"
id="${application.name}"
name="${application.name}" context-root="<URL>">
<classloader apiTypeVisibility="spec, ibm-api, api, stable, third-party" commonLibraryRef="Lib"/>
</application>
<library id="Lib" apiTypeVisibility="spec, ibm-api, api, stable, third-party">
<folder dir="${wlp.install.dir}/../custom-java/" />
</library>
对此的任何帮助都非常感谢。
如果你有一个jar文件,你需要使用<file>
或<fileset>
而不是<folder>
。
对于单个罐子:
<library id="Lib" apiTypeVisibility="spec, ibm-api, api, stable, third-party">
<file name="${wlp.install.dir}/../custom-java/myjar.jar" />
</library>
对于包含多个 jar 的目录:
<library id="Lib" apiTypeVisibility="spec, ibm-api, api, stable, third-party">
<fileset dir="${wlp.install.dir}/../custom-java/" includes="*.jar" scanInterval="5s" />
</library>
我相信只有当您有一个要加载Class.getResource()
的文件文件夹时,或者如果您的目录结构包含不在 jar 中的.class
文件时,才会使用<folder>
。
有关更多详细信息,请参阅知识中心
更新:像这样将库添加到应用程序后,您应该能够访问库中的类,就像访问应用程序中的类一样。
例如,这些应该有效:
new MyLibraryObject()
Class.forName("com.example.MyLibraryObject")
Thread.currentThread().getContextClassLoader().loadClass("com.example.MyLibraryObject")
但是,专门使用系统类加载器仍然不起作用。
在 OpenLiberty 中,系统类装入器加载一组最小的类。Liberty 内部使用 OSGi 加载,OSGi 有自己的一组类加载器,应用程序类由一个特殊的应用程序类加载器加载,该类加载器可以装入应用程序类、API 类和共享库,但无权装入任何 liberty 内部类。
经过大量的摆弄,想出了答案。 问题是我如何定义类加载器。我将类加载器更改为使用应用程序类加载器(这是 Azquelt 回复中提到的(而不是系统类加载器。
此外,只需添加库路径就足够了。 无需在服务器的类装入器中指定.xml
感谢您的投入@Azquelt