所以我有一个包含使用本机库代码的代码的Web服务。我根据本文https://docs.jboss.org/author/display/MODULES/Native+Libraries设置了一个模块:
com
myco
mymodule
main
myjar.jar
myjar2.jar
myjar3.jar
module.xml
lib
linux-x86_64
libTimeFunc.so
这是我的module.xml
文件:
<module name="com.myco.mymodule" xmlns="urn:jboss:module:1.3">
<resources>
<resource-root path="myjar.jar"/>
<resource-root path="myjar2.jar"/>
<resource-root path="myjar3.jar"/>
</resources>
</module>
myjar.jar
取决于myjar2.jar
取决于myjar3.jar
。 myjar3.jar
使用libTimeFunc.so
进行一些本机库调用。那篇文章说64位Linux有lib/linux-x86_64
,这就是我正在运行的。
当服务尝试拨打电话时,我会收到UnsatisfiedLinkError: Unable to load library 'TimeFunc': Native library (linux-x86-64/libTimeFunc.so) not found in resource path (/jboss/wildfly-10.0.0.CR2/jboss-modules.jar)
。
我注意到它似乎在寻找linux-x86-64/libTimeFunc.so
,而不是linux-x86_64/libTimeFunc.so
,但当我尝试更改文件夹名称以使用破折号时,我仍然遇到同样的错误。
我的服务的pom.xml
文件依赖于模块具有以下内容(插件中还有其他条目,这只是相关部分):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifestEntries>
<Dependencies>
com.myco.mymodule
</Dependencies>
</manifestEntries>
</archive>
</configuration>
</plugin>
为什么找不到libTimeFunc.so
文件?根据我的理解,我应该只能将它放在lib/linux-x86_64
之下,它应该自动查找它。
答案 0 :(得分:0)
由于这是在应用程序服务器的上下文中运行,因此您应该使用用于加载应用程序的类加载器来加载共享库。这样,当您的应用程序执行时,本机库就会被卸载。
Map options = new HashMap();
options.put(Library.OPTION_CLASSLOADER, loader);
Native.loadLibrary("libTimeFunc", options);
然后,您需要将linux-x86-64
目录移动到归档的根目录,以便类加载器可以在那里找到它。
或者,您可以指定库的绝对路径,例如
Native.loadLibrary("/com/myco/mymodule/main/lib/linux-x86-64/libTimeFunc.so", options);
请注意,您的应用程序服务器可能不会特别满意您的应用程序将资源复制到磁盘然后尝试加载它。您的SecurityManager
里程可能会有所不同。
您可能还会遇到应用程序服务器已加载的JNA版本。