6

我有一个任务,它从这些源(比如 project a)生成 java 源和一组 jar。我想将这些 jar 导出到依赖项目(例如 project b)。所以这大致是我现在所拥有的:

//a.gradle

configurations{
  generatedJars
}

task generateJars(type: JavaExec) { 
  //generate jars ... 

  outputs.files += //append generated jars here
} 

dependencies{
  generatedJars generateJars.outputs.files
}


//b.gradle

dependencies{
  project(path: ':a', configuration: 'generatedJars')
}

它工作正常,除了添加generateJars.outputs.files为依赖项不会告诉 gradlegenerateJars在还没有生成 jars 时它必须运行任务。我尝试将任务本身添加为依赖项,希望它的工作方式与将 jar/zip 任务添加到工件配置(例如artifacts{ myJarTask })时的工作方式相同,但它会抛出一个错误,告诉我我不能这样做. 当然,我可以在开始评估generateJars之前在构建过程中的某个地方注入任务:b,但这既笨拙又脆弱,所以我想避免它。

我觉得我应该将生成的 jar 添加到artifacts{ ... }项目中,但我不确定如何使它们对依赖项目可见。有没有更好的方法来实现这一目标?

依赖项目 (project b) 需要设置 IntelliJ IDEA 模块类路径以指向 projecta生成的 jars。有点像这样(伪代码):

//b.gradle

idea{
  module{
    scopes.COMPILE.plus += project(path: ':a', configuration: 'generatedJars').files
  }
}

到目前为止,我已经尝试简单地在:a's generatedJarsin上添加一个项目依赖项:b,但 Idea 插件只是将模块添加:a为模块依赖项并假设它导出其生成的 jars(这可能是一个正确的假设),因此不将生成的 jars 添加到:b的类路径。

任何帮助将不胜感激!

4

2 回答 2

2

首先,您需要单独的配置吗?也就是说,您是否有a应该看到生成的罐子的客户?如果没有,您可以将生成的 Jars 添加到配置中,这将简化事情。archives

其次,将生成的 Jars 添加到配置中的正确方法是(而不是dependencies块):

artifacts {
    generatedJars generateJars
}

这应该确保generateJars任务在需要时自动运行。

第三,我会省略+=after outputs.files,尽管它可能没有什么不同。您还应该添加必要的输入。

第四,为什么你需要一个JavaExec任务来生成罐子?您可以将生成的源代码添加到某个源集并让 Gradle 构建它们吗?

第五,IDEA没有对应Gradle的项目配置依赖的概念。一个 IDEA 模块要么完全依赖于另一个模块,要么完全不依赖。您有两个选择:要么使用模块依赖项并将生成的源代码作为依赖模块的源文件夹(最好在 Gradle 和 IDEA 构建中),或者将生成的 Jars 作为外部依赖项传递给 IDEA。在任何一种情况下,您都应该将任务依赖项添加ideaModule到适当的生成任务中。如果这仍然不能带来令人满意的 IDEA 设置,您可以考虑将 Jars 的生成移到单独的子项目中。

于 2012-10-05T18:50:57.727 回答
0

对于我的用例,我有一个 C++ 项目,它生成了一些本机库,我的 java 项目需要加载这些库才能运行。

在项目 ':native' build.gradle 中:

task compile(type: Exec, group: 'build') {
    dependsOn ...

    outputs.files(fileTree('/some/build/directory') {
        include 'mylib/libmy.so'
    })

    ...
}

在项目 java 应用程序 build.gradle 中:

configurations {
    nativeDep
}

// Add dependency on the task that produces the library
dependencies {
    nativeDep files(project(':native').tasks.findByPath('compile'))
}

// Unfortunately, we also have to do this because gradle will only
// run the ':native:compile' task if we needed the tasks inputs for another
// task
tasks.withType(JavaCompile) {
    dependsOn ':native:compile'
}

run {
    doFirst {
        // Use the configuration to add our library to java.library.path
        def libDirs = files(configurations.nativeDep.files.collect {it.parentFile})
        systemProperty "java.library.path", libDirs.asPath
    }
}
于 2019-06-29T00:08:02.243 回答