问题陈述
我尝试将OpenCV安装为JBoss-as实例的全局模块。版本如下:
- JBoss-as: 7.1.1 Final
- OpenCV: 2.4.5(带Java支持编译)
我从一个只安装了JBoss-as和OpenCV的Ubuntu Server 12.04 64位新安装开始。
引言
OpenCV Java包装器使用JNI调用。因此需要以下两个文件:
- opencv-245.jar
- libopencv_java245.so
并位于/usr/share/OpenCV/java/
(根据安装位置而定)中。
我也指出了一些观察结果:
- JBoss的安装是正确的(可以部署应用程序并且运行正常)
- 使用Java支持编译和安装OpenCV的操作是正确的(使用OpenCV的Java类也能正常工作)
- 使用OpenCV的基本Web应用程序已经使用Maven部署在JBoss-as上运行正常,
opencv-245.jar
在pom.xml
中被列为依赖项,并随war
打包)
问题描述
一旦我将OpenCV定义为JBoss全局模块(在pom.xml中设置<scope>provided</scope>
),就会引发以下异常:
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)
看起来 OpenCV 的 jar
库已找到,因为异常是由它引发的。而且它没有像第一个链接中提到的那样抱怨找不到某些库:
java.lang.UnsatisfiedLinkError: no xxxx in java.library.path
因此,我猜测
libopencv_java245.so
不是问题所在。具体配置如下。
配置
我在modules/org/opencv/main/module.xml
中定义了org.opencv
模块:
<?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
放在同一个文件夹中,还放在了lib/linux-x86_64/
子文件夹中(如Native Library所述)。
为了将该模块定义为全局模块,我在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>
放入我的Maven pom.xml
中。此外,还可以加入:
System.loadLibrary("opencv_java245");
在代码中使用或不使用不会有任何变化。
额外观察
我还注意到,对于一个由一个war
和一个jar
组成的ear
应用程序,即使按照“前言”中第3点所述的过程也无法工作,并且会产生与上述相同的异常。也许这些信息可以帮助解决问题。
有人有一些指针或解决方案吗?
new org.opencv.osgi.OpenCVNativeLoader().init();
即可。 - Carlos Rafael Ramirez