我在Gradle构建生命周期中苦苦挣扎;特别是在configuration
和execution
阶段之间进行拆分。我已经阅读了Gradle手册中的许多部分,并且在线上看到了很多想法,但是没有找到以下问题的解决方案:
我想运行一个特定任务以在java-library-distribution
构建的末尾生成 Artifact ,该 Artifact 是runtime
配置jar的扁平版本。也就是说,我只想在运行特定任务来创建 Artifact 时产生 Artifact 。
我创建了以下任务:
task packageSamplerTask(type: Tar, dependsOn: distTar) {
description "Packages the build jars including dependencies as a flattened tar file. Artifact: ${distsDir}/${archivesBaseName}-${version}.tar"
from tarTree("${distsDir}/${archivesBaseName}-${version}.tar").files
classifier = 'dist'
into "${distsDir}/${archivesBaseName}-dist-${version}.tar"
}
尽管此任务确实产生了所需的 Artifact ,但该任务在gradle的
configuration
阶段运行。此行为具有以下后果:packageSamplerTask
任务始终运行,通常不必要地运行;和clean
,则构建将在下次运行时失败,因为$distsDir
阶段(显然)期间configuration
不存在。 看来,如果我以这种方式扩展
Copy
任务,我总是会得到这种过早的行为。有没有一种方法可以使用
<< closure
/ doLast
声明来获取我想要的东西?还是还有其他我想念的事情/应该做什么?更新
经过进一步的工作,我澄清了我的要求,并如下(具体地)解决了我的问题:
"I want to package my code and my code's dependencies as a flat archive of jars that can be deployed as a jMeter plugin. The package can then be installed by unpacking into the jMeter
lib/ext
directory, as is. The package, therefore, must not include the jMeter jars (and their dependencies) which are used for building and testing"
因为
Gradle
似乎不支持类似Maven的provided
依赖项管理,所以我为我的程序包创建了一个新配置,其中不包括jMeter jar。configurations {
jmpackage {
extendsFrom runtime
exclude group: 'org.apache.jmeter', name: 'ApacheJMeter_core', version: '2.11'
exclude group: 'org.apache.jmeter', name: 'ApacheJMeter_java', version: '2.11'
}
}
然后创建以下任务(使用Peter Niederwieser的闭包建议):
task packageSamplerTask(type: Tar, dependsOn: assemble) {
from { libsDir }
from { configurations.jmpackage.getAsFileTree() }
classifier = 'dist'
}
该解决方案似乎可以正常工作,它使我也可以仅使用
Gradle
java
插件。
最佳答案
任务声明很好,但是也需要推迟展平:
...
from { tarTree("${distsDir}/${archivesBaseName}-${version}.tar").files }
另外,应以更抽象的方式引用Tar文件。例如:
from { tarTree(distTar.archivePath).files }
关于gradle - 使用Gradle创建构建后复制任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25226318/