WebSphere Liberty中加载本地库及多应用共享库配置咨询
问题背景
我需要在Linux环境的WebSphere Liberty中部署多个应用,所有应用都要引用同一个包含本地驱动的共享库,并且这个库必须加载到独立的类加载器中。在传统WebSphere 8+版本中可以通过UI轻松配置,但Liberty的配置方式不同。我根据IBM文档设计了如下配置,想确认是否有效,以及是否需要在jvm.options中添加-Djava.library.path=/usr/acc/lib/3rdparty:
<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>
回答
你的配置已经满足核心需求,不过可以通过一些优化来更精准地匹配“独立类加载器”的要求,同时关于本地驱动的加载也有明确的结论:
共享库的独立类加载器实现
你当前的配置中,全局定义的MyLibrary会被Liberty加载到一个共享的类加载器中,所有通过commonLibraryRef引用它的应用都会复用这个类加载器——这正好对应传统WebSphere中“使用独立类加载器”的效果,避免每个应用重复加载库文件,实现资源共享。
如果想要更严格的隔离(防止共享库的类与应用类发生冲突),可以给library添加isolated="true"属性,强制共享库使用完全独立的类加载器:<library id="MyLibrary" isolated="true"> <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>本地驱动
driver.so的加载
按照IBM文档的方式将.so文件直接放在library的file标签中是完全正确的,Liberty会自动识别并从你指定的完整路径加载这个本地库,不需要额外在jvm.options中设置java.library.path。
唯一的例外情况是:如果driver.so依赖其他未在library中声明的本地库文件,这时才需要通过java.library.path指向依赖库的目录,但如果只是这个单一的driver.so,你的配置已经足够。多应用共享的配置示例
要让多个应用都引用这个共享库,只需给每个应用的application元素添加相同的classloader配置即可:<application id="app1" location="app1.war" name="App1" type="war" autoStart="true"> <classloader commonLibraryRef="MyLibrary"/> </application> <application id="app2" location="app2.war" name="App2" type="war" autoStart="true"> <classloader commonLibraryRef="MyLibrary"/> </application>
内容的提问来源于stack exchange,提问作者JoshDM

