在 Websphere Liberty 中加载原生库的做法是什么?

What is the practice for loading native libraries in Websphere Liberty?

我正在 Linux 中的 Websphere Liberty 下安装多个应用程序。每个应用程序都需要引用同一个共享库,它加载一个本地驱动程序;该库必须加载到它自己的类加载器中。

在之前的 Websphere (8+) 版本中,使用 UI 以这种方式配置库非常简单:设置作用域,为其命名,识别类路径中的 jars,提供本机库路径,然后勾选 "use an isolated class loader"。 Liberty 则不同。

在Websphere Liberty下做类似的做法是什么?

假设如下:

类路径:

/usr/acc/lib/jars/firstjar-1.0.jar
/usr/acc/lib/jars/secondjar-1.0.jar
/usr/acc/lib/3rdparty/thirdjar-1.0.jar

本机驱动程序:

/usr/acc/lib/3rdparty/driver.so

According to IBM:

  1. 对于本机驱动程序,我只是将其与文件标记中的 JAR 文件一起列出
  2. 对于包含的类加载器,我需要将其作为 "commonLibraryRef" 引用。

这意味着以下应该正确:

<library id="MyLibrary">
    <file name="/usr/acc/lib/jars/firstjar-1.0.jar"/>
    <file name="/usr/acc/lib/jars/secondjar-1.0.jar"/>
    <file name="/usr/acc/lib/3rdparty/thirdjar-1.0.jar"/>
    <file name="/usr/acc/lib/3rdparty/driver.so"/>
</library>

<application id="applicationWAR" location="application.war" name="applicationName" type=”war” autoStart="true">
    <classloader commonLibraryRef="MyLibrary"/> 
<application/>

是否有效,还是我需要将 -Djava.library.path=/usr/acc/lib/3rdparty 添加到 jvm.options 文件?

在提出这个问题时,对 Liberty 实例的访问受到限制,因此 apps.xml 的设计是通过推测,需要这个问题。

以上正确; apps.xml 中的库声明应保持在任何应用程序声明之上。没有必要更新 jvm.options。使用 fileset 的简写也是可以接受的,一个应用程序可以引用多个库,以逗号分隔;演示如下:

<!-- library from above question -->
<library id="MyLibrary">
    <file name="/usr/acc/lib/jars/firstjar-1.0.jar"/>
    <file name="/usr/acc/lib/jars/secondjar-1.0.jar"/>
    <file name="/usr/acc/lib/3rdparty/thirdjar-1.0.jar"/>
    <file name="/usr/acc/lib/3rdparty/driver.so"/>
</library>

<!-- short-hand using fileset -->
<library id="AnotherLib">
    <fileset dir="/usr/acc/lib/2ndparty/" includes="*.jar" />
    <file name="/usr/acc/lib/2ndparty/driver.so" />
</library>

<!-- short-hand using fileset and no .so file; includes can be *.* -->
<library id="ThirdLib">
    <fileset dir="/usr/acc/lib/3/" includes="*.jar" />
</library>

<application id="applicationWAR" location="application.war" name="applicationName" type=”war” autoStart="true">
    <classloader commonLibraryRef="MyLibrary,AnotherLib,ThirdLib"/> 
<application/>