使用Java Gradle Project的OpenCV作为胖罐

时间:2018-01-11 05:49:36

标签: java eclipse maven opencv gradle

我实际上是在基于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)
    }
}

还包含sample eclipse project

的链接

所以这是编辑 基于@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创建。

1 个答案:

答案 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
}