我有一个从这些来源生成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
}
}
到目前为止,我尝试在:a
中generatedJars
的{{1}}添加项目依赖项,但Idea插件只是将模块:b
添加为模块依赖项,假设它导出了它生成的jar(这可能是一个正确的假设),因此不会将生成的jar添加到:a
的类路径中。
非常感谢任何帮助!
答案 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项目需要加载这些本机才能运行。
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
}
}