我实际上是在基于Java的Gradle Project中尝试使用OpenCV。因为,OpenCV需要本机库和Jar文件来执行。我正在尝试使用gradle将本机库和Jar包装在一起,但我在这样做时遇到错误。
当我尝试运行项目时,项目无法找到opencv jar的本机库并给我以下错误
线程中的异常" main" java.lang.UnsatisfiedLinkError:在java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)的java.library.path中没有opencv_java340,位于java.lang.System的java.lang.Runtime.loadLibrary0(Runtime.java:870)图书馆.loadLibrary(System.java:1122)。(Library.java:9)
虽然,我知道如何在Gradle项目中手动设置本机库,但我不知道如何通过Gradle进行设置并在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)
}
}
的链接
所以这是编辑 基于@kerry的评论,我试图在openCV Maven之后创建mvn工件,但是现在我在创建mvn build时面临跟随错误
[错误]无法执行目标 org.codehaus.mojo:属性 - Maven的插件:1.0.0:读项目的属性 项目opencv上的(set-arch-properties):属性不能 从文件加载:/media/nitish/8EE47633E4761E21/opencv-3.4.0/build/build.properties - > [帮助1] org.apache.maven.lifecycle.LifecycleExecutionException:失败 执行目标 org.codehaus.mojo:属性 - Maven的插件:1.0.0:读项目的属性 项目opencv上的(set-arch-properties):属性不能 从文件加载:/media/nitish/8EE47633E4761E21/opencv-3.4.0/build/build.properties
构建文件夹中没有build.properties文件。由于build文件夹仅由maven任务创建,因此build.properties文件应仅由maven创建。
答案 0 :(得分:0)
以下是 build.gradle 文件的工作示例。请务必阅读评论并在适当时进行更改。
通过运行gradle fatJar
,您可以使用OpenCV在内部创建应用程序的Java Jar。
但是,除了在Java Jar中包含OpenCV库之外,您还需要在代码的开头加载OpenCV本机文件。 他们有两种方法:
1)通过提供完整路径加载文件:
System.load("my/full/path/opencv.dll");
2)如果您的本机文件位于Java库路径中:
System.loadLibrary("opencv");
请注意,在第二种情况下,您只需提供原生文件的名称(不带扩展名)。
默认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
}