Gradle - 我可以在项目依赖项中包含任务的输出

时间:2012-10-02 13:21:48

标签: gradle

我有一个从这些来源生成java源和一组jar的任务(例如,项目a)。我想将这些罐子导出到依赖项目(比如项目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作为依赖项并不告诉gradle当没有生成jar时它必须运行generateJars任务。我已经尝试将任务本身添加为依赖项,希望它的工作方式与将jar / zip任务添加到工件配置(例如artifacts{ myJarTask })时的工作方式相同,但它会抛出错误告诉我我不能这样做。当然,我可以在generateJars开始评估之前在构建过程中的某处注入:b任务,但这很笨拙,所以我想避免它。

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

依赖项目(项目b)需要设置IntelliJ IDEA模块类路径以指向项目a生成的jar。像这样的东西(伪代码):

//b.gradle

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

到目前为止,我尝试在:ageneratedJars的{​​{1}}添加项目依赖项,但Idea插件只是将模块:b添加为模块依赖项,假设它导出了它生成的jar(这可能是一个正确的假设),因此不会将生成的jar添加到:a的类路径中。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

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

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

artifacts {
    generatedJars generateJars
}

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

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

第四,为什么需要JavaExec任务来生成Jars?您是否可以将生成的源添加到某个源集并让Gradle构建它们?

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

答案 1 :(得分: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
    }
}