OpenCV的是JBoss的全球模块(OpenCV as JBoss-as global modul

2019-08-31 23:03发布

问题陈述

我尝试安装OpenCV作为JBoss的作为实例的全局模块。 该版本是:

  • JBoss的为:7.1.1决赛
  • OpenCV的:2.4.5(编译Java支持)

我从一个全新安装的Ubuntu服务器只安装JBoss的作为和OpenCV 12.04 64位开始。

前言

OpenCV的Java包装使用JNI调用。 因此,两两件事是必需的:

  • OpenCV的-245.jar
  • libopencv_java245.so

而提供/usr/share/OpenCV/java/ (关于安装)

我还点了一些意见:

  1. JBoss的安装是否正确(应用程序可以部署并正在努力)
  2. OpenCV的与Java支持的编译和安装,正确的是(Java中使用类OpenCV的上班)
  3. 使用OpenCV的和部署,与Maven一个基本的Web应用程序,在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)

看来,OpenCV的jar库被发现,因为异常是从它提出。 此外,它不会抱怨没有找到像(摘自第一个链接在结束)的一些库:

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.jarlibopencv_java245.solib/linux-x86_64/子文件夹(说明本地库 )

要定义这个模块中修改全局I 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");

或者没有在代码中不会改变任何东西。

额外的意见

我还注意到,与ear的应用,一个组成war ,一个jar ,甚至点3在“序言”中描述的过程不工作,并给予同样的异常如上。 也许这些信息可以帮助。

有人有一些指针或解决方案?

相关问题

  • 路径JBOSS 7.1.1设置DLL的
  • 的JBoss 7正试图从JBoss的仓加载模块的库

Answer 1:

我终于解决了这个问题,在这里写答案,以帮助其他人。

这个问题是不是在路径libopencv_java245.so ,但在JBoss的类加载器。

对于在序言第3点(其中工作)描述下的情况下,加载的类加载器war文件是相同的是负载opencv-245.jar (被嵌入的war ),并调用System.loadLibrary("opencv_java245")在我的代码对这个相同的类加载器的效果,因为它已加载包含该方法调用的类。 所有这些,都在同一个类加载器和一切工作的效果。

现在为什么它不与工作的原因ear从一个事实跟进ear都有自己的类加载器,然后将每个子部署为一个又一个。 第一类加载器部署的ear ,它包含了opencv-245.jar dependecy,然后又ClassLoader的部署war包含进ear 。 因为调用System.loadLibrary("opencv_java245")是在war ,这个命令的作用对的ClassLoader的效果war ,但opencv-245.jar被加载到ear的ClassLoader。 因此,试图调用本机库时,JAVA找不到链接,因为它们是在不同的类加载器。

最后在这里关注的点是一个JBoss模块。 当描述一个模块作为在我的最初的问题构成,这是一个高层次的JBoss类加载器,其装载opencv-245.jar 。 类加载器也会自动知道去哪里寻找本地库:在$MODULE_PATH/lib/linux-x86_64/ 。 但问题是加载库。 要调用System.loadLibrary("opencv_java245")必须在已经收取同样的类加载器来完成opencv-245.jar 。 因此,它是不可能装载库这样在你的代码:

static {
    System.loadLibrary("opencv_java245");
}

因为它将对有加载类,而不是JBoss的一个ClassLoader的效果。 该解决方案是修改opencv-245.jar并添加到它org.opencv.core.Loader例如类,它只有一个方法:

package org.opencv.core

class Loader
{
    public static void loadLibrary(String name)
    {
        System.loadLibrary(name);
    }
}

然后在你的类,你可以把:

static {
    Loader.loadLibrary("opencv_java245");
}

System.loadLibrary调用被放置在opencv-245.jar才会有效果一个加载相同的ClassLoader opencv-245.jar 。 然后,本机调用是否正确链接,因为这两个函数库, jarso ,在同一个类加载器加载。



Answer 2:

如果您使用的OpenCV(org.openpnp包)3.4.2+代替:

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

您可以使用:

OpenCV.loadLocally();

我使用JBoss wildfly,并有问题做一个以上的部署时间。 本地类已经加载,但这个固定的问题。



Answer 3:

该libopencv_java245.so文件添加到您的OpenCV的模块创建的目录。 然后将其添加为所以它会被添加到类路径的资源,并在运行时可用。

所以,你的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"/>
        <resource-root path="."/>
    </resources>
    <dependencies>
        <module name="javax.api"/>
    </dependencies>
</module>


Answer 4:

发现这个链接,让上加载本地库指令

https://docs.jboss.org/author/display/MODULES/Native+Libraries



文章来源: OpenCV as JBoss-as global module