0

我已经在开放的自由中托管了一个 Web 应用程序,我正在尝试类加载一些在 jar 中的第三方 Java 类。我将该文件夹添加为包含 jar 文件的库,并将该库添加为类加载器。但是当我尝试加载它时,我得到了一个找不到类的异常。

此外,当我使用 URLClassLoader 时,它工作得非常好。但我想将 URLClassLoader 更改为 System ClassLoader

我的 server.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>

对此高度赞赏的任何帮助。

4

2 回答 2

1

如果您有 jar 文件,则需要使用<file>or<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>

我相信<folder>只有当你有一个要加载的文件文件夹Class.getResource(),或者你有一个.class不在 jar 中的文件的目录结构时才使用它。

有关更多详细信息,请参阅知识中心

更新:当您像这样向应用程序添加库时,您应该能够访问库中的类,就像访问应用程序中的类一样。

例如,这些应该工作:

  • new MyLibraryObject()
  • Class.forName("com.example.MyLibraryObject")
  • Thread.currentThread().getContextClassLoader().loadClass("com.example.MyLibraryObject")

但是,专门使用系统类加载器仍然不起作用。

在 OpenLiberty 中,系统类加载器加载最小的类集。Liberty 内部使用 OSGi 加载,它有自己的一组类加载器,应用程序类由一个特殊的应用程序类加载器加载,该类加载器可以加载应用程序类、API 类和共享库,但无权加载任何自由内部类。

于 2019-12-09T14:58:01.863 回答
0

经过一番折腾得出了答案。问题是我如何定义类加载器。我将类加载器更改为使用 Application 类加载器(这是 Azquelt 回复中提到的),而不是系统类加载器。

也只需添加一个库路径就足够了。无需在 server.xml 的类加载器中指定

谢谢你的意见@Azquelt

于 2020-01-16T03:00:07.047 回答