Gradle-我可以包括任务';项目依赖项中的输出
我有一个任务生成java源代码和一组来自这些源代码的JAR(比如,projectGradle-我可以包括任务';项目依赖项中的输出,gradle,Gradle,我有一个任务生成java源代码和一组来自这些源代码的JAR(比如,projecta)。我想将这些JAR导出到相关项目(例如,projectb)。下面是我现在的大致情况: //a.gradle 配置{ 生成罐 } 任务生成器(类型:JavaExec){ //生成罐子。。。 outputs.files+=//在此处追加生成的JAR } 依赖关系{ generatedJars generateJars.outputs.files } //b、 格拉德尔 依赖关系{ 项目(路径:':a',配置:'ge
a
)。我想将这些JAR导出到相关项目(例如,projectb
)。下面是我现在的大致情况:
//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添加到项目的工件{…}
,但我不确定如何使它们对依赖项目可见。有没有更好的方法来实现这一点
依赖项目(projectb
)需要设置IntelliJ IDEA模块类路径,以指向projecta
生成的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
在模块中可以很好地工作,但是我不知道如何引用projectb
中的那些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
中的某些相关源被修改时,都需要(重新)生成源。从功能上讲,它应该像projecta
下的任何其他源一样工作。。。也许那就应该是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
}
}