当前位置: 首页 > 知识库问答 >
问题:

OpenCV和Java Gradle项目作为fat jar

严易安
2023-03-14

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

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

Plhd--7/>)在java.lang.ystem.load图书馆(ystem.java:1122)在图书馆。(ibrary.java: 9)

虽然,我知道如何在Gradle项目中手动设置本机库,但我不确定如何通过Gradle实现这一点,并将本机库包装到fat jar中。这是我的身材。格拉德尔

// 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时面临以下错误

[错误]无法执行目标组织。科德豪斯。mojo:properties maven插件:1.0.0:读取项目opencv上的项目属性(设置arch属性):无法从文件:/media/nitish/8EE47633E4761E21/opencv-3.4.0/build/build加载属性。属性-

没有建造。生成文件夹中存在属性文件。由于build文件夹仅由maven task创建,所以build。属性文件只能由maven创建。

共有1个答案

司寇阳朔
2023-03-14

下面是一个构建的工作示例。格雷德尔档案。确保阅读评论,并在适当时进行更改。通过运行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);
    }

建筑格拉德尔

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
}
 类似资料:
  • 我有一个使用Gradle作为构建工具的项目和第二个使用Maven的POM的子项目。我没有在子项目上更改构建工具的自由。 我想要实现的是将我的项目添加到Maven POM中,作为我的Gradle项目的依赖项。 其中root(当前目录)是我的Gradle项目,并包含,Maven项目位于下,POM文件就在该目录下。 我在我的< code>build.gradle文件中尝试了这些变化: 第一次尝试: 第二

  • 问题内容: 我需要通过代理服务器从Gradle进行Web访问,才能将Gradle / Artifactory集成用于Jenkins。为了减少可能的问题原因,我在build.gradle中手动添加了Artifactory插件,并从命令行运行它: 按照此描述,我在主目录的.gradle / gradle.properties中指定了以下内容: 使用上面的代理配置(已知可以正常工作),它将失败: 11:

  • 有人能从实用的角度详细说明一下为什么要用。jar而不是。war吗?有什么需要注意的问题吗? 编辑:也欢迎其他答案

  • 我通过这个链接将一个gradle项目作为依赖项导入另一个gradle项目。有没有办法将maven项目作为依赖项包含到gradle项目中?

  • 我想有一个使用Spring Boot的微服务项目,它通过通过Spring Data JPA项目创建的依赖项访问实体和DAO。这个想法是多个微服务可以获得该依赖项。 然而,当jar在Spring Boot Data JPA项目中组装时,它通过starter依赖项包含了许多依赖项。其中大多数也出现在使用它的Spring Boot Microservice项目中。 您将如何通过Spring Data J