我正在尝试在多项目Gradle构建中创建一个胖jar文件,如下所示:
root
+-- project1
+-- project2
project1提供了基本功能,然后project2使用它来创建可执行jar。可执行JAR需要包含依赖项中的所有代码,以便它可以独立运行。
对于外部依赖项,这很好用。在project2中,我创建了一个新配置:
apply plugin: 'maven'
apply plugin: 'java'
configurations {
// configuration for JARs that need to be included in the final packaging
includeInJar
}
然后添加依赖项:
dependencies {
includeInJar 'com.fasterxml.jackson.core:jackson-databind:2.2.3'
...
configurations.compile.extendsFrom(configurations.includeInJar)
}
然后包装看起来像这样:
jar {
manifest {
attributes "Main-Class": "com.acme.project1.MyTest"
}
// import all dependencies into the Jar so that it can be run easily
from {
configurations.includeInJar.collect {
it.isDirectory() ? it : zipTree(it)
}
}
}
使用外部依赖项中的所有文件正确构建jar。问题伴随着对project1的项目依赖:
includeInJar project(':project1')
当存在这种情况时,我在尝试组装JAR时遇到错误,因为它不能找到project1 project1-0.4.0.jar
目录中的jar(例如build/libs
)存在。消息是正确的,因为project1构建了一个SNAPSHOT jar(例如project1-0.4.0-SNAPSHOT.jar
)。
问题是,为什么在项目构建SNAPSHOT jar时配置会引用非SNAPSHOT jar?我能改变什么才能找到正确的罐子?
答案 0 :(得分:0)
作为评论:
在我看来,胖子并不是一个很棒的模式。也许Gradle application plugin符合您的需求?
答案 1 :(得分:0)
我找到了自己问题的答案。
问题是我们在项目级别有一些额外的脚本,在配置阶段结束时显然会对版本进行更改。
组装胖罐配置时,使用'普通'版本。然后在构建jar之前将其更改为-SNAPSHOT版本。
将from { ... }
代码包装到doFirst { ... }
中,将其包装到构建阶段就足以解决问题了,尽管真正的修复显然是为了避免在第一个代码中间更改版本的地方。