如何在EAR中的jar和共享库之间的Websphere Liberty Profile中获取类加载器可见性

Dav*_* G. 1 java ear classloader java-ee websphere-liberty

我正在尝试在Websphere Liberty Profile(最新版本16)中使用一些遗留代码.

这段代码以一组架构的库的形式出现,我将其设置为WLP中的共享库,以及作为EAR的应用程序

我遇到一个问题,其中一个库中的jar中的某些代码试图实例化一个位于EAR内部的类(在lib文件夹中的jar中).

我得到这个堆栈跟踪:

Caused by: java.lang.ClassNotFoundException: com.isb.holamu.fnegocio.ln.AAL_FNegocioFactory <-- This class (1) is inside a .jar inside the EAR
       at com.ibm.ws.classloading.internal.AppClassLoader.findClassCommonLibraryClassLoaders(AppClassLoader.java:491)
       at com.ibm.ws.classloading.internal.AppClassLoader.findClass(AppClassLoader.java:274)
       at java.lang.ClassLoader.loadClass(Unknown Source)
       at com.ibm.ws.classloading.internal.AppClassLoader.findOrDelegateLoadClass(AppClassLoader.java:469)
       at com.ibm.ws.classloading.internal.AppClassLoader.loadClass(AppClassLoader.java:441)
       at java.lang.ClassLoader.loadClass(Unknown Source)
       at java.lang.Class.forName0(Native Method)
       at java.lang.Class.forName(Unknown Source)
       at com.isb.bs.bl.base.MetaFacadeFactory.createFactoryInstance(MetaFacadeFactory.java:74) <-- This class (2) is in the shared library in WLP.
Run Code Online (Sandbox Code Playgroud)

这些是来自server.xml的相关位:

   <!-- Server shared library -->

   <library id="architecture" >
         <fileset dir="${server.config.dir}/lib/jars" includes="*.jar" scanInterval="5s"/>  <-- (2) is here

   </library>

   <enterpriseApplication autoStart="true" id="sample" location="sample.ear" name="sample"> <-- (1) is here
         <classloader commonLibraryRef="architecture" delegation="parentFirst"/>
   </enterpriseApplication>
Run Code Online (Sandbox Code Playgroud)

似乎EAR类可以访问共享库类加载器及其类,但共享库类无法在EAR中找到它们.

任何人都可以提供任何关于如何使这个工作的线索?

谢谢!

小智 6

这不起作用,因为常见的库使用自己的类加载器,而不是引用它们的应用程序.

要使其工作,请将commonLibraryRef更改为privateLibraryRef.这将有效地将库内容添加到应用程序的类路径中.

--joe