在 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
- 对于本机驱动程序,我只是将其与文件标记中的 JAR 文件一起列出
- 对于包含的类加载器,我需要将其作为 "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/>
我正在 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
- 对于本机驱动程序,我只是将其与文件标记中的 JAR 文件一起列出
- 对于包含的类加载器,我需要将其作为 "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/>