Gradle-我可以包括任务';项目依赖项中的输出

Gradle-我可以包括任务';项目依赖项中的输出,gradle,Gradle,我有一个任务生成java源代码和一组来自这些源代码的JAR(比如,projecta)。我想将这些JAR导出到相关项目(例如,projectb)。下面是我现在的大致情况: //a.gradle 配置{ 生成罐 } 任务生成器(类型:JavaExec){ //生成罐子。。。 outputs.files+=//在此处追加生成的JAR } 依赖关系{ generatedJars generateJars.outputs.files } //b、 格拉德尔 依赖关系{ 项目(路径:':a',配置:'ge

我有一个任务生成java源代码和一组来自这些源代码的JAR(比如,project
a
)。我想将这些JAR导出到相关项目(例如,project
b
)。下面是我现在的大致情况:

//a.gradle
配置{
生成罐
}
任务生成器(类型:JavaExec){
//生成罐子。。。
outputs.files+=//在此处追加生成的JAR
} 
依赖关系{
generatedJars generateJars.outputs.files
}
//b、 格拉德尔
依赖关系{
项目(路径:':a',配置:'generatedJars')
}
它工作正常,只是添加
generateJars.outputs.files
作为依赖项并不会告诉gradle在还没有生成JAR时必须运行
generateJars
任务。我曾尝试将任务本身添加为依赖项,希望它能以与将jar/zip任务添加到工件配置(例如
artifacts{myJarTask}
)时相同的方式工作,但它抛出一个错误,告诉我我无法这样做。当然,在
:b
开始计算之前,我可以将
generateJars
任务注入构建过程中的某个地方,但这既笨拙又脆弱,因此我希望避免它

我觉得应该将生成的JAR添加到项目的
工件{…}
,但我不确定如何使它们对依赖项目可见。有没有更好的方法来实现这一点

依赖项目(project
b
)需要设置IntelliJ IDEA模块类路径,以指向project
a
生成的JAR。类似这样的内容(伪代码):

//b.gradle
意念{
模块{
scopes.COMPILE.plus+=项目(路径:':a',配置:'generatedJars')。文件
}
}
到目前为止,我已经尝试简单地在
:b
中添加对
:a
生成的JAR
的项目依赖性,但是Idea插件简单地将模块
:a
添加为模块依赖性,并假设它导出生成的JAR(这可能是正确的假设),因此,不会将生成的JAR添加到
:b
的类路径中


任何帮助都将不胜感激

首先,您需要单独的配置吗?也就是说,您是否有
a
的客户端不应该看到生成的jar?如果没有,您可以将生成的jar添加到
归档文件
配置中,这将简化工作

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

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

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

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


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

< P>我的用例中,我有一个C++项目,它生成了java项目需要加载的一些本地库,以便运行。 在项目中:本机“build.gradle: 在project java application build.gradle中:
谢谢将任务添加到
artifacts
在模块中可以很好地工作,但是我不知道如何引用project
b
中的那些jar(不发布它们)。是的,可以只生成源并将其导出为模块源。这应该是可行的,但它为这个想法创造了额外的工作,所以我希望它能以某种方式被规避。为了使钩住
ideaModule->generateJars
工作正常,我还需要添加
b:ideaModule->a:ideaModule
,我有大约3个模块都需要这样做。我希望我能把它设置成自动解析<代码>项目(路径:“a”,配置:“generatedJars”)ad 2。“额外工作”重要吗?(您可以对未生成的代码使用相同的参数。)在任何情况下,您都应该使用Gradle而不是JavaExec task.ad3编译文件。为什么需要添加
b:ideaModule->a:ideaModule
?无论如何,根据何时需要重新生成源,您可能必须手动调用
generateJars
,而
ideaModule->generateJars
可能并不重要。您可以将其设置为外部工具。1)我指的是来自
idea.module
block的引用
project()
仅在
dependencies
子句中出现。2) 是的,它增加了构思构建的时间(比预先构建的jar要长),并且在构思中加入了检查警告,我们对此无能为力。3) 因为
b.iml将在没有jar的情况下生成,除非jar存在于磁盘上。我想这里真正的依赖是
b:ideaModule->a:generateJars
。每当
a
中的某些相关源被修改时,都需要(重新)生成源。从功能上讲,它应该像project
a
下的任何其他源一样工作。。。也许那就应该是1:S
artifacts {
    generatedJars generateJars
}
task compile(type: Exec, group: 'build') {
    dependsOn ...

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

    ...
}
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
    }
}