OpenCV作为JBoss-作为全局模块

2024-03-22

问题呈现

我尝试将 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/(关于安装)

我还指出一些观察:

  1. JBoss安装正确(应用程序可以部署并且正在运行)
  2. 具有java支持的OpenCV的编译和安装是正确的(使用OpenCV的Java类正在工作)
  3. 一个使用 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

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

问题不在路径上libopencv_java245.so,但是在 JBoss 类加载器中。

对于序言第 3 点中描述的情况(有效),加载war文件与加载的文件相同opencv-245.jar(它被嵌入到war),并调用System.loadLibrary("opencv_java245")我的代码中对同一个类加载器有影响,因为它已经加载了包含此方法调用的类。所有这些都对同一个类加载器起作用并且一切正常。

现在它不与ear跟进这一事实ear有自己的类加载器,然后每个子部署作为另一个子部署。第一个类加载器部署ear,其中包含opencv-245.jar依赖,然后另一个类加载器部署war包含在ear。因为打电话System.loadLibrary("opencv_java245")在里面war,该命令的效果对ClassLoader有影响war,但是opencv-245.jar被加载到ear类加载器。因此,当尝试调用本机库时,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 产生影响。解决办法是修改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");
}

And the System.loadLibrary呼叫被拨入opencv-245.jar将会对加载该类的同一个类加载器产生影响opencv-245.jar。然后本机调用被正确链接,因为两个库,jarso,被加载到同一个类加载器中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV作为JBoss-作为全局模块 的相关文章

  • 在 PLSQL Oracle 中抛出特定错误消息...在休眠中捕获?

    是否可以在 PL SQL oracle 存储过程中抛出特定的错误消息 并在调用它时在 Hibernate 中捕获它 您可以从 PL SQL 代码中抛出用户定义的错误消息 20000 到 20999 之间的错误代码保留用于用户指定的错误消息
  • GSON 是一个 Java Throwable

    我有一个对象 其中包含一段数据和关联的异常 Public class MyBean Private String data Private Exception problem 当我尝试GSON toJSON 对象 它给了我一个循环引用抱怨
  • 如何替换引号之间出现的任何单词

    我需要能够替换所有出现的单词 and 仅当它出现在单引号之间时 例如 将字符串中的 and 替换为 XXX This and that with you and me and others and not her and him 结果是 T
  • 添加样式后如何重置回默认CSS?

    基本上 我通过添加如下样式类来更改 javafx 中文本字段的 css textfield getStyleClass add textfieldstyle 但后来我希望能够将其恢复到原来的样子 但由于本例中的原始外观是 JavaFX 的默
  • WAR 文件在 Tomcat 服务器中抛出 OutOfMemoryError

    我有一个 Spring MVC WAR 文件 可以在我的本地计算机 程序和网站 中完美运行 一旦我将文件上传到服务器 aTomcat 7 并尝试访问它 catalina 日志文件表明java lang OutOfMemoryError 我尝
  • 从相对路径读取文件

    我知道这个问题之前已经被问过 1000 次了 我确实尝试了所有解决方案 Java项目中如何从相对路径读取文件 java io File 找不到指定的路径 https stackoverflow com questions 3844307 h
  • 如何使用jsp上传服务器文件夹上的文件[重复]

    这个问题在这里已经有答案了 我正在尝试使用 servlet jsp 将一些图像上传到位于我的服务器上的文件夹中 下面是我的代码 它在我的本地计算机上运行 import java io import java util import java
  • 将分区扩展到另一级

    根据下图来自春季批量文档 http docs spring io spring batch reference html scalability html partitioning 主步骤被划分为六个从步骤 它们是主步骤的相同副本 我的问题
  • 实现一个java UDF并从pyspark调用它

    我需要创建一个在 pyspark python 中使用的 UDF 它使用 java 对象进行内部计算 如果它是一个简单的 python 我会做类似的事情 def f x return 7 fudf pyspark sql functions
  • 将一组 Java 对象转换为另一组对象的最佳方式是什么?

    这是一个真正的新手提出的基本 Java 问题 我有一组实现某个接口 接口 MyIfc 的Java对象 属于 MyClass 类 我有一组这些对象存储在我的类中的私有变量中 声明如下 protected Set
  • 什么时候使用弱引用? [复制]

    这个问题在这里已经有答案了 我了解什么是 Java WeakReference 我想知道的是它通常用于解决哪种具体问题 有没有包含它们的模式 WeakReference and SoftReference当您想保留某些东西以备再次需要时使用
  • 谷歌gson LinkedTreeMap类转换为myclass

    我知道这个问题以前已经被问过 由于我对java和android的新手技能 我一个多星期都无法解决这个问题 我和我的一位朋友正在开发一个 Android 项目 其中有一些类似的事情 最奇怪的部分是 只有当我从 Google Play 商店下载
  • 有人使用 Hibernate 使用 Elasticache 作为二级缓存吗?

    我发现一些线程说这是可行的 但没有找到具体的说明或配置信息 我也想从 Beanstalk 执行此操作 应用程序应该部署到 beanstalk 并使用将 hibernate 指向 elasticache 实例的配置 是的 我们能够使用二级缓存
  • Java如何处理IF语句和效率

    我只是好奇 Java 实际是如何工作的if声明 注意 当我在下面说 组件 时 我指的是语句检查的各个部分 例如a b c 哪个在计算方面更有效 if a b c do stuff or if a if b if c do stuff 我之所
  • 字符串包含相同的字符但仍然不同[重复]

    这个问题在这里已经有答案了 我正在尝试读取一个 txt 文件并使用每个句子作为团队的名称 同时使用该名称查找另一个 txt 文件以获取其内容 所有 txt 文件都位于我的资产文件夹的根目录中 第一个 txt 文件工作正常 我使用assetm
  • 使用 JSeperator - Java 时出现异常间隙

    我一直在开发 Swing GUI 并在添加后出现一些不寻常和不需要的间隙JSeperator 知道如何删除它们吗 或者任何其他选择来很好地实现这一目标 视觉描述 之前差距就很明显了JLabel 速度 及之后JSlider 相关代码 cont
  • “该选择不能在任何服务器上运行”

    我一直在 Eclipse 中开发一个动态 Web 项目 我收到这个错误 该选择不能在任何服务器上运行 早些时候它工作得很好 但现在我收到了这个错误 我删除了服务器并再次添加 Project gt Right Click gt Propert
  • 三角形未在 OSX 上的 OpenGL 2.1 中绘制

    我正在学习有关使用 OpenGL 在 Java 中创建游戏引擎的教程 我正在尝试在屏幕上渲染一个三角形 一切运行良好 我可以更改背景颜色 但三角形不会显示 我还尝试运行作为教程系列的一部分提供的代码 但它仍然不起作用 教程链接 http b
  • Java 中的引用变量里面有什么?

    我们知道对象引用变量保存表示访问对象的方式的位 它不保存对象本身 但保存诸如指针或地址之类的东西 我正在阅读 Head First Java 第 2 版 一书 书中写道 第 3 章第 54 页 在 Java 中我们并不真正知道什么是 在引用
  • 像 Java 一样覆盖 Objective-C 类中的方法

    我经常使用此语句来扩展类 而不需要编写整个单独的文件 假设 ClassFromFramework 是库中包含的框架的一部分的类 public ClassFromFramework public String myMethod operati

随机推荐