我看过这篇文章Gradle multi project distribution,但仍有一些疑问。
我想创建以下项目布局
root |--lib-java-module |--spring-boot-module |--3PP_A_module # not java | |-- custom scripts, config |--3PP_B_module # not java | |-- custom scripts, config |--dist-module
您可能已经猜到了,我希望dist模块使用libjava.jar,sprintbootapp.jar,3pp-a.tar,3pp-b.tar构建myapp-dist.tar.gz。
myapp-dist.tar.gz libjava.jar sprintbootapp.jar 3pp-a.tar 3pp-b.tar.
3pp-a模块和3pp-b模块仅包含一些配置文件和启动脚本。没有Java或任何已编译的代码。如何将它们分别打包为tar文件(不压缩)?
如何在dist-module中定义对其他模块的依赖关系?从dist-module触发构建时是否可以构建其他模块?
更新:
我根据@ marco-r的答案设置了我的测试项目,除了打包war文件之外,它都有效。从github https://github.com/KiranMohan/study-spring-boot检出测试项目。
这是您感兴趣的项目设置。
include ':sb-2.1-multi-package', ':sb-2.1-multi-package:hello-rest-lib',
':sb-2.1-multi-package:hello-rest-standalone-jar',
':sb-2.1-multi-package:hello-rest-war'
include 'sb-2.1-3pp-resources'
include 'sb-2.1-build'
但是,向sb-2.1-build.tar.gz添加hello-rest-war失败。
而不是war文件,而是打包的依赖项。
dependencies {
archivesDeps project(path: ':sb-2.1-3pp-resources', configuration: 'archives')
javaDeps project(":sb-2.1-multi-package:hello-rest-war")
}
...
task copyJavaDeps(type: Copy) {
inputs.files(configurations.javaDeps)
from configurations.javaDeps
into "${ARCHIVE_DIRECTORY}/lib"
}
...
// create distribution bundle
distributions {
main {
contents {
from ARCHIVE_DIRECTORY
into "/springapp/multimodule"
}
}
}
包装内容
springapp/multimodule/lib/classmate-1.4.0.jar
springapp/multimodule/lib/hello-rest-lib-0.0.1-SNAPSHOT.jar
springapp/multimodule/lib/hibernate-validator-6.0.16.Final.jar
...
springapp/multimodule/lib/tomcat-embed-websocket-9.0.17.jar
springapp/multimodule/lib/validation-api-2.0.1.Final.jar
springapp/multimodule/sb-2.1-3pp-resources/config/3pp.json
如何打包war文件(hello-rest-war模块)并且没有所有传递依赖项?
答案 0 :(得分:1)
这是一个多问题的场景,所以我将分部分解决。
- 由于所有
3PP_X_module
具有相同的构建要求,因此在每个子模块中创建一个build.gradle
,这些子模块引用具有所需通用功能的实际构建gradle:
apply from: '../tarArtifact.gradle'
- 在父文件夹中,创建先前引用的
tarArtifact.gradle
,以具有对引用子项目的子文件夹(任意选择为contents
)的内容进行TAR功能的功能:
apply plugin: 'base'
task tarContents(type: Tar) {
from 'contents'
archiveName = "${project.name}.tar"
destinationDir file('build/tar')
}
artifacts {
archives file: tarContents.archivePath, type: 'tar', builtBy: tarContents
}
由于archives
配置连接到tarContents
(builtBy: tarContents
)的输出,因此archives
配置可用于检索所需的{{1} }作为自然构建此项目的结果。
- 在
TAR
中创建以下dist-module
文件:
build.gradle
此gradle文件包括以下内容:
apply plugin: 'distribution'
plugins.withType(DistributionPlugin) {
distTar {
compression = Compression.GZIP
extension = 'tar.gz'
}
}
configurations {
wholeProjectDist
}
dependencies {
wholeProjectDist project(path: ':3pp-a-module', configuration: 'archives')
wholeProjectDist project(path: ':3pp-b-module', configuration: 'archives')
wholeProjectDist project(':lib-java-module')
wholeProjectDist project(':spring-boot-module')
}
distributions {
main {
contents {
from configurations.wholeProjectDist
}
}
}
文件。tar.gz
插件的distTar
任务配置为使用DistributionPlugin
使用它压缩任何生成的TAR
。GZIP
来捕获wholeProjectDist
本身的依赖关系;我们将在分发插件的任务中使用它。dist-module
的依赖项声明为兄弟姐妹的子项目输出的工件;使用新创建的dist-module
。wholeProjectDist
配置为将main
中的所有文件都作为contents
- 在
configurations.wholeProjectDist
下创建一个settings.gradle
文件,以允许其使用dist-module
访问其兄弟模块:
includeFlat
- 在父文件夹中包含一个
includeFlat '3pp-a-module', '3pp-b-module', 'lib-java-module', 'spring-boot-module'
文件,以包含所有子子模块(作为根项目):
settings.gradle
- 通过调用gradle命令(从根文件夹)来构建所需的
includeFlat '3pp-a-module', '3pp-b-module', 'lib-java-module', 'spring-boot-module'
文件:
tar.gz
希望这会有所帮助。