gpt4 book ai didi

java - 带有 Java Gradle 项目的 OpenCV 作为胖 jar

转载 作者:行者123 更新时间:2023-12-02 16:37:59 27 4
gpt4 key购买 nike

我实际上是在尝试在基于 Java 的 Gradle 项目中使用 OpenCV。因为,OpenCV 需要本地库和 Jar 文件才能执行。我正在尝试使用 gradle 将 native 库和 Jar 包装在一起,但这样做时遇到了错误。

当我尝试运行项目时,项目无法找到 opencv jar 的 native 库并给我以下错误

Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java340 in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867) at java.lang.Runtime.loadLibrary0(Runtime.java:870) at java.lang.System.loadLibrary(System.java:1122) at Library.(Library.java:9)



虽然,我知道如何在 Gradle 项目中手动设置 native 库,但我不确定如何通过 Gradle 进行设置并将 native 库包装在 fat jar 中。这是我的 build.gradle
// Apply the java-library plugin to add support for Java Library
apply plugin: 'java-library'

// In this section you declare where to find the dependencies of your project
repositories {
// Use jcenter for resolving your dependencies.
// You can declare any Maven/Ivy/file repository here.
jcenter()
}

configurations {
// configuration that holds jars to include in the jar
openCVLibs
}

dependencies {
openCVLibs fileTree(dir: 'libs', include: '*.jar')
openCVLibs fileTree(dir: 'libs', include: '*.so')
configurations.compile.extendsFrom(configurations.openCVLibs)
}

jar {
from {
configurations.openCVLibs.collect { it.isDirectory() ? it : zipTree(it) }
}
manifest {
attributes('Implementation-Title': project.name,
'Implementation-Version': project.version)
}
}

还包括 sample eclipse project的链接

所以这里是编辑
根据@kerry 的评论,我尝试在 openCV Maven 之后创建 mvn Artifact ,但现在我在创建 mvn build 时遇到以下错误

[ERROR] Failed to execute goal org.codehaus.mojo:properties-maven-plugin:1.0.0:read-project-properties (set-arch-properties) on project opencv: Properties could not be loaded from File: /media/nitish/8EE47633E4761E21/opencv-3.4.0/build/build.properties -> [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:properties-maven-plugin:1.0.0:read-project-properties (set-arch-properties) on project opencv: Properties could not be loaded from File: /media/nitish/8EE47633E4761E21/opencv-3.4.0/build/build.properties



build 文件夹中没有 build.properties 文件。由于 build 文件夹仅由 maven 任务创建,因此 build.properties 文件应仅由 maven 创建。

最佳答案

下面是一个 的工作示例。 build.gradle 文件。请务必阅读评论并在适当时进行更改。
通过运行 gradle fatJar您可以使用内部的 OpenCV 创建应用程序的工作 Java Jar。

但是,除了在 Java Jar 中包含 OpenCV 库之外,您还需要在代码开头加载 OpenCV native 文件。
他们有两种方法可以做到这一点:

1)通过提供完整路径加载文件:

System.load("my/full/path/opencv.dll");

2)如果您的 native 文件位于您的 Java 库路径中:
System.loadLibrary("opencv");

请注意,在第二种情况下,您只需要提供 native 文件的名称(不包括其扩展名)。

默认 Java 库路径取决于操作系统:

在 Windows 上,它映射到 PATH
在 Linux 上,它映射到 LD_LIBRARY_PATH
在 OS X 上,它映射到 DYLD_LIBRARY_PATH

如果要设置自己的 Java 库路径:
    try {
System.setProperty("java.library.path","YOUR/PATH");
Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
fieldSysPath.setAccessible(true);
fieldSysPath.set(null, null);
} catch (Exception ex) {
System.out.println("Failed to set Java Library Path: " + ex.getMessage);
}

build.gradle
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'application'

mainClassName = "YourMainClass" // You Main Class name

repositories{
mavenCentral()
}

task fatJar(type: Jar) {
manifest.from jar.manifest
classifier = 'all'
from {
configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) }
} {
exclude "META-INF/*.SF"
exclude "META-INF/*.DSA"
exclude "META-INF/*.RSA"
exclude "build/libs/philipath/**"
}
with jar
}

artifacts {
archives fatJar
}


dependencies {

// Local libraries
compile fileTree('lib') // assuming there is a folder named 'lib' in your project root with your OpenCV jar inside

// other dependencies
}

关于java - 带有 Java Gradle 项目的 OpenCV 作为胖 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48200543/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com