java - 带有 OpenCV 的 IntelliJ 可执行 Jar 文件

标签 java opencv intellij-idea jar

我正在尝试使用 IntelliJ 导出一个使用外部库的 Java 项目,在本例中为 OpenCV。最初,我一直收到“不满意的链接错误”,即使外部库已经设置为依赖项。上网查了一下,发现必须要在这里设置VM:

enter image description here

所以我将库路径设置为计算机中有 openCV 的位置。在我这样做之后,程序运行并正确编译。

我现在的任务是将项目导出到一个可运行的 jar 文件中,而目标计算机不需要安装 openCV。我听从了 this post 的建议.这是我的设置 Artifact 的样子:

enter image description here

所以在我导出后,尝试双击它,它什么也没做。然后我用“java -jar .jar”运行它,这导致了“不满意的链接错误”这个老问题:

enter image description here

我很清楚问题出在哪里,但我不知道如何解决它...如何在可执行文件中设置 VM 选项以指向提取的 jar 文件?

最佳答案

我认为您还应该在 build/lib 中包含来自 OpenCV 的 native 库文件

我在 Mac 上的例子是 libopencv_java310.dynlib

Screenshot of artifact description

在我的屏幕截图中,您可以看到 OpenCV java 库 (.jar),加上我的模块的编译输出,另外我还包含了共享库的两个版本(Mac 的 .dynlib 和 Linux 的 .so)。

如果您使用的是 Windows,那么我猜您的 OpenCV 构建/安装将为您提供一个您还应该包含的 .dll。

如果您希望在您运行/开发时从您的文件系统中找到共享库文件,但希望它的干净分发并且在其他人运行它时在 JAR 文件中找到它,那么您可能想要用这样的代码加载它,而不是处理这两种情况:

import cz.adamh.utils.NativeUtils;

class SimpleSample {
  static {
    try {
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    } catch (UnsatisfiedLinkError e) {
      try {
        NativeUtils.loadLibraryFromJar("/" + System.mapLibraryName(Core.NATIVE_LIBRARY_NAME));
      } catch (IOException e1) {
        throw new RuntimeException(e1);
      }
    }
  }

您可以在他的 GitHub 上找到 cz.adamh.utils.NativeUtils 的实用程序类 https://github.com/adamheinrich/native-utils/blob/master/src/main/java/cz/adamh/utils/NativeUtils.java

JAR 中文件的路径必须以“/”开头。在我的示例中,我的 native 库位于 JAR 的根目录中,因此“/”是前置的。如果您将 native 扩展放在 JAR 的子文件夹中,则在上面的代码中指定它的路径。

然后在不同的平台上,我相信 JVM 会在您尝试在运行时加载它时找到要使用的“正确”共享 native 库。

我已经用 SimpleSample(在 samples/java/ant 中)做到了这一点。

然后我使用 IntelliJ 菜单“Build > Built Artifacts”生成 JAR。

然后我可以使用:

java -jar ../opencv-java-sample/out/artifacts/SimpleSample_jar/SimpleSample.jar

关于java - 带有 OpenCV 的 IntelliJ 可执行 Jar 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30447425/

相关文章:

Java Swing GUI 不可见

java - Spring 配置: component-scan

c++ - haar 创建示例解析错误

opencv - 精明的边缘与骨架化

c++ - OpenCV 具有相似颜色背景的颜色检测

java - 多态性的例子? (替换原理和后期动态绑定(bind))

java - 在不同的文件类 java Android 中调用 EditText 值

java - IntelliJ 不显示堆栈跟踪

intellij-idea - Karma 没有选择更改,必须运行两次测试

postgresql - 错误 : cannot execute UPDATE in a read-only transaction in IntelliJ IDEA with PostgreSQL