我目前正处于JBoss迁移项目的中间,从版本4.2.2GA到Wildfly 8.0.0.Final。该项目使用Oracle OCI驱动程序进行数据库访问,使用Oracle AQ。现在,我用环境变量“LD_LIBRARY_PATH'”启动Wildfly。设置为OCI本机实现所在的位置,一切正常,但AQ除外。这是我在使用AQ API时遇到的错误:oracle.jms.AQjmsSession.ociinit([JIIZSII)J: java.lang.UnsatisfiedLinkError: oracle.jms.AQjmsSession.ociinit([JIIZSII)J
这是我的模块:
路径:$ {WILDFLY_HOME} / modules / oracle / aq / api / main
内容:aqapi.jar,module.xml
module.xml:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="oracle.aq.api">
<resources>
<resource-root path="aqapi.jar" />
</resources>
<dependencies>
<module name="javax.api" />
<module name="javax.jms.api" />
<module name="oracle.jdbc" />
</dependencies>
</module>
现在的问题是,Wildfly不会传播“LD_LIBRARY_PATH”的原因是什么?到模块类加载器?
对于较旧的JBoss版本,我发现了这个问题:https://issues.jboss.org/browse/SOA-3570传播将aqapi.jar放入服务器lib文件夹,就像我们为JBoss 4所做的那样。但是我怎样才能解决Wildfly的这个问题?任何想法?
谢谢!
答案 0 :(得分:0)
解决方案是将两个模块组合到一个jdbc / aq模块中,这样:
路径:$ {WILDFLY_HOME} / modules / oracle / jdbcaq / main
内容:ojdbc5.jar,aqapi.jar,orai18n.jar,module.xml
module.xml:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="oracle.jdbcaq">
<resources>
<resource-root path="aqapi.jar" />
<resource-root path="ojdbc5.jar"/>
<resource-root path="orai18n.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.jms.api" />
<module name="javax.transaction.api"/>
</dependencies>
</module>
我认为这与wildfly的模块类加载器有某种关系。也许两个模块之间的通信(jdbc和aq)要求本机实现由同一个类加载器加载,这在使用两个模块而不是单个模块时会导致此错误。
答案 1 :(得分:0)
JBoss / WildFly模块也可以自动在模块中查找本机库,而不是设置LD_LIBRARY_PATH
:https://docs.jboss.org/author/display/MODULES/Native+Libraries
因此,您可以通过复制${WILDFLY_HOME}/modules/oracle/jdbcaq/main/lib/linux-x86_64/
文件或感谢符号链接在.so
中加载共享库。