问题呈现
我尝试将 OpenCV 安装为 JBoss-as 实例的全局模块。版本是:
- JBoss-as:7.1.1 最终版
- OpenCV:2.4.5(编译时支持 Java)
我从全新安装 Ubuntu Server 12.04 64 位开始,仅安装了 JBoss-as 和 OpenCV。
Preamble
OpenCV java 包装器使用 JNI 调用。因此需要两件事:
- opencv-245.jar
- libopencv_java245.so
并可在/usr/share/OpenCV/java/
(关于安装)
我还指出一些观察:
- JBoss安装正确(应用程序可以部署并且正在运行)
- 具有java支持的OpenCV的编译和安装是正确的(使用OpenCV的Java类正在工作)
- 一个使用 OpenCV 的基本 Web 应用程序,并通过 Maven 部署在 JBoss 上(即
opencv-245.jar
被列为依赖项pom.xml
,从而打包成war
)
问题描述
一旦我将 OpenCV 定义为 JBoss 全局模块(设置<scope>provided</scope>
在 pom.xml 中)会引发此异常:
java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_Mat()J
org.opencv.core.Mat.n_Mat(Native Method)
org.opencv.core.Mat.<init>(Mat.java:441)
WS.printMessage(WS.java:15)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:616)
org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:155)
org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:257)
org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:222)
org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:211)
org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:525)
org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:502)
org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:119)
org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208)
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55)
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50)
javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
看来 OpenCVjar
找到库是因为从中引发了异常。它也不会抱怨找不到某些库,例如(取自最后的第一个链接):
java.lang.UnsatisfiedLinkError: no xxxx in java.library.path
因此我猜libopencv_java245.so
不是问题。具体的配置如下所述。
配置
我定义了org.opencv
模块输入modules/org/opencv/main/module.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="org.opencv">
<resources>
<resource-root path="opencv-245.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
</dependencies>
</module>
然后我把它放在同一个文件夹中opencv-245.jar
并且libopencv_java245.so
in lib/linux-x86_64/
子文件夹(如中所述本机库 https://docs.jboss.org/author/display/MODULES/Native+Libraries)
为了将该模块定义为全局模块,我修改了standalone/configuration/standalone.xml
:
<subsystem xmlns="urn:jboss:domain:ee:1.0">
<global-modules>
<module name="org.opencv" slot="main"/>
</global-modules>
</subsystem>
最后使用我设置的全局模块src/main/webapp/WEB-INF/jboss-deployment-structure.xml
:
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="org.opencv" />
</dependencies>
</deployment>
</jboss-deployment-structure>
我还提醒我已经把<scope>provided</scope>
在我的专家中pom.xml
.
另外,放置:
System.loadLibrary("opencv_java245");
或者不在代码中不会改变任何东西。
额外观察
我还注意到,用ear
应用程序,由一个组成war
和一个jar
,即使“序言”中第 3 点中描述的过程也不起作用,并给出与上面相同的异常。也许这些信息可以提供帮助。
有人有一些指示或解决方案吗?
相关问题
- JBOSS 7.1.1 中 DLL 的路径设置 https://stackoverflow.com/questions/12775827/path-setting-for-dlls-in-jboss-7-1-1
- JBoss 7 正在尝试从 JBoss bin 加载模块库 https://stackoverflow.com/questions/12896950/jboss-7-is-trying-to-load-modules-libraries-from-jboss-bin