【问题标题】:Including subproject gradle build outputs in JAR file and runtime library path在 JAR 文件和运行时库路径中包含子项目 gradle 构建输出
【发布时间】:2019-01-22 22:19:05
【问题描述】:

我有一个使用 JNI 的 Java 应用程序,我正在使用 gradle 构建 C++ 共享库,其中包含我作为 JNI 的一部分加载的代码。 C++ 构建是根构建的子项目。我可以从我的根项目的runjar 任务中依赖:jnisubproject:assembleRelease,这确实构建了共享库(在jnisubproject/build/lib/main/release/libjnisubproject.so),但它不会将该共享库添加到我的JAR 文件中,也不会它是否设置了我的 Java 库路径以便能够在运行时访问共享对象。通过一些hackery(在我的运行任务中显式修改java.library.path 系统属性),当我使用gradle run 时,我可以让它工作,但我希望能够构建一个JAR 文件以进行重新分发。

我尝试通过添加将子项目添加为运行时依赖项

dependencies {
    runtime project(":jnisubproject")
    // runtime ":jnisubproject:assembleRelease" also doesn't work
}

到我的根项目的依赖项,但这不足以让gradle jar 构建子项目,也不足以将其文件包含在 JAR 中;这实际上似乎什么也没做。如果我在 JAR 任务中添加显式依赖项,如下所示:

jar {
    dependsOn ":jnisubproject:assembleRelease"
}

当我运行gradle jar 时,它将构建我的子项目,但不出所料,共享库不会在 JAR 中结束。我尝试的最后一件事是上面的 sn-p 除了在输出目录上添加文件依赖外,还具有显式依赖:

dependencies {
    runtime files('jnisubproject/build/lib/main/release/*')    
}

但这两者都感觉非常hacky并且不起作用,一个很棒的组合。如果我通过这样做在 JAR 中明确包含构建的文件

jar {
    include 'jnisubproject/build/lib/main/release/*'
}

然后我的 JAR 文件除了清单之外完全是空的。

简而言之,我的问题是这样的:

  • 我有一个构建共享库的子项目
  • 我希望根项目(Java 项目)表达对该共享库的依赖。
  • 我希望该依赖项能够将共享库添加到 java.library.path 和我的输出 JAR 文件中。

有什么想法吗?

【问题讨论】:

    标签: java gradle java-native-interface


    【解决方案1】:

    在您的根项目中尝试:

    processResources {
        from project(':jnisubproject').buildDir + '/lib/main/release/*'
    }
    

    它会告诉processResources 主任务包含你的库。

    关于java.library.path 的补充,我认为不可能从 Jar 内部直接链接库。更多信息here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      相关资源
      最近更新 更多