托管在 OpenLiberty 中的 Web 应用程序无法通过系统类装入器找到类



我已经在开放的自由中托管了一个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

相关内容

  • 没有找到相关文章

最新更新