在JAR文件和运行时库路径中包含子项目gradle构建输出

时间:2019-01-18 00:46:20

标签: java gradle java-native-interface

我有一个使用JNI的Java应用程序,并且正在使用gradle构建C ++共享库,其中包含我作为JNI的一部分加载的代码。 C ++构建是根构建的子项目。我可以从根项目的:jnisubproject:assembleReleaserun任务中对jar进行依赖,它们确实会建立共享库(位于jnisubproject/build/lib/main/release/libjnisubproject.so处),但是并没有添加共享库添加到我的JAR文件中,也没有设置我的Java库路径以能够在运行时访问共享库。有了一些黑客手段(我在运行任务中明确修改了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中。我尝试的最后一件事是上面的两个片段都带有显式依赖项,除了在输出目录上添加文件依赖项之外:

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

但是这两种感觉都非常骇人,无法正常工作,真是太棒了。如果我通过这样做将构建的文件明确地包含在JAR中,

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

然后,我的JAR文件最终不是清单文件,而是完全为空。

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

在您的根项目中尝试:

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

它将告诉主要processResources任务包括您的库。

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