将所有gradle构建构件组装到单个目录中
我们正从Maven搬到Gradle,我们正在为一件事奋斗。 我们有一个基于Maven的POMs的多项目Gradle项目。 大部分工作正常,但我们无法找到收集WAR文件和ZIP文件的方法,这些文件是构建子项目的结果。每个子项目代表一个微服务。 我们已经找到了(也在Stackoverflow上)将所有JAR和第三方LIB收集到一个目录中的方法。然而,我们正在寻找一种方法来收集每个微服务的资源和库。 在Maven,我们做了如下工作:将所有gradle构建构件组装到单个目录中,gradle,multi-project,Gradle,Multi Project,我们正从Maven搬到Gradle,我们正在为一件事奋斗。 我们有一个基于Maven的POMs的多项目Gradle项目。 大部分工作正常,但我们无法找到收集WAR文件和ZIP文件的方法,这些文件是构建子项目的结果。每个子项目代表一个微服务。 我们已经找到了(也在Stackoverflow上)将所有JAR和第三方LIB收集到一个目录中的方法。然而,我们正在寻找一种方法来收集每个微服务的资源和库。 在Maven,我们做了如下工作: <plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<outputDirectory>Publish/</outputDirectory>
<artifactItems>
<artifactItem>
<groupId>....</groupId>
<artifactId>...</artifactId>
<version>${project.version}</version>
<type>zip</type>
</artifactItem>
<artifactItem>
<groupId>....</groupId>
<artifactId>...</artifactId>
<version>${project.version}</version>
<type>war</type>
</artifactItem>
在每个产生工件(例如zip)的项目中,您将把工件添加到配置中。看 例如: 然后,在uber项目中,您将使用另一个配置来引用工件,并使用zip任务来捆绑它们
configurations {
uber
}
dependencies {
uber project(path: ':project1', configuration: 'archives')
uber project(path: ':project2', configuration: 'archives')
uber project(path: ':project3', configuration: 'archives')
}
task uberZip(type: Zip) {
from configurations.uber
archiveName 'uber.zip'
destinationDir "$buildDir/uber"
}
下面的解决方案是手工实现的,但很简单,如果您需要调整任何内容,它可以提供灵活性 下面是根目录中的
build.gradle
。对于每个子项目,它将:
- 定义一个
任务,将copyArtifacts
和war
文件从子项目的zip
文件夹(使用适当的build/libs
,baseName
等)复制到version
root/dist
- 如果找到
任务,则对其进行配置,使其随后运行war
copyArtifacts
看起来很有趣,因为它使用内置功能。但是,我不想要uber zip,而是希望将几个默认工件(战争和拉链)复制到一个中心目录。我不知道这些功能是否也可以实现这一点?很简单,只需将
uberZip
任务替换为uberCopy
类型的Copy
任务即可。您可以保留中的,这几乎可以正常工作,但拉链存储在分发目录中。我为构建ZIP的项目添加了第二个任务。它可以工作,我只需要更改主build.gradle,而不需要更改任何子项目。这似乎更容易管理。
configurations {
archives
}
task myZip(type: Zip) { ... }
artifacts {
archives myZip
}
configurations {
uber
}
dependencies {
uber project(path: ':project1', configuration: 'archives')
uber project(path: ':project2', configuration: 'archives')
uber project(path: ':project3', configuration: 'archives')
}
task uberZip(type: Zip) {
from configurations.uber
archiveName 'uber.zip'
destinationDir "$buildDir/uber"
}
subprojects { Project subProject ->
task copyArtifacts {
doLast {
def baseName = subProject.archivesBaseName
def version = subProject.version
def group = subProject.group
def DIST_DIR = "${rootDir}/dist"
def SRC_DIR = "${buildDir}/libs"
ant.mkdir(dir: DIST_DIR)
ant.copy(todir: DIST_DIR) {
fileset(dir: SRC_DIR,
includes: "${baseName}*${version}*.war,${baseName}*${version}*.zip")
}
}
}
afterEvaluate {
def warTask = subProject.tasks.find { it.name == 'war' }
if (warTask) {
warTask.finalizedBy(copyArtifacts)
}
}
}