如何在单个构建中将一个Gradle子项目生成的jar复制到另一个子项目中



在使用复制任务时,多项目Gradle构建(下面是最小复制(似乎无法从一个项目中提取jar文件,并将其作为jar文件导入另一个项目。

生成文件:

buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "gradle.plugin.com.dorongold.plugins:task-tree:1.5"
}
}
subprojects { subproject ->
subproject.apply plugin: com.dorongold.gradle.tasktree.TaskTreePlugin
}
project(":jarBuild") {
apply plugin: "java"
}
project(":assemblyBuild") {
apply plugin: "maven"
configurations {
compile
}
dependencies {
compile(project(path: ":jarBuild"))
}
task copyFiles {
copy {
from configurations.compile
into buildDir
}
}
copyFiles.dependsOn(project(':jarBuild').tasks.assemble)
build.dependsOn(copyFiles)
}
task clean
clean.dependsOn(subprojects.collect { it.tasks.matching { it.name == "clean" } })

此命令演示问题:

gradle clean && gradle build && find . -name '*.jar' && gradle build && find . -name '*.jar'

命令输出:

BUILD SUCCESSFUL in 594ms
2 actionable tasks: 2 executed
BUILD SUCCESSFUL in 617ms
1 actionable task: 1 executed
./jarBuild/build/libs/jarBuild.jar
BUILD SUCCESSFUL in 590ms
1 actionable task: 1 up-to-date
./assemblyBuild/build/jarBuild.jar
./jarBuild/build/libs/jarBuild.jar

在第一个build之后,在assemblyBuild的构建目录中没有任何jar包。在build的第二次运行中,jar被复制。

已验证适当的任务依赖性:

gradle :assemblyBuild:build taskTree
> Task :assemblyBuild:taskTree
------------------------------------------------------------
Project :assemblyBuild
------------------------------------------------------------
:assemblyBuild:build
+--- :assemblyBuild:assemble
+--- :assemblyBuild:check
--- :assemblyBuild:copyFiles
--- :jarBuild:assemble
--- :jarBuild:jar
--- :jarBuild:classes
+--- :jarBuild:compileJava
--- :jarBuild:processResources

我尝试了许多不同的方法,包括通过引用直接路径复制jar文件,但都没有成功。

我想明白了。复制命令是在任务配置期间执行的,而不是在执行期间执行的。用这个替代了任务定义:

task copyFiles {
doLast {
copy {
from configurations.compile
into buildDir
}
}
}

最新更新