我想要一个 fat jar 子,但没有提供的依赖项。所以我使用了以下两个插件:
并有一个像这样的 build.gradle 文件:
apply plugin: 'nebula.provided-base'
apply plugin: 'com.github.johnrengelman.shadow'
archivesBaseName = 'range-cache-drivers'
group = 'com.engine'
version = '0.302-SNAPSHOT'
buildDir = 'target'
sourceCompatibility = 1.8
targetCompatibility = 1.8
dependencies {
provided project(':rangeCache')
// CSV, TSV, Fixe width
compile deps.univocityParsers
// MongoDB
compile deps.mongo
// Cassandra
compile deps.cassandradx
compile deps.cassandraSnappy
compile deps.cassandraLZ4
}
但是当我运行
gradle shadowJar
我的 fat jar 子里仍然有所有的 rangeCache 类。如何从我的胖 jar 中排除提供的依赖项?编辑 1:
这似乎也不起作用, transient 依赖项仍然被复制到胖 jar 中。
shadowJar {
dependencies {
exclude(project(':rangeCache'))
}
}
编辑 2:根据斯坦尼斯拉夫的回答,我做了以下工作以使事情正常工作:
configurations {
shadow
compile.extendsFrom provided
provided.extendsFrom shadow
}
dependencies {
provided project(':rangeCache')
// CSV, TSV, Fixe width
shadow deps.univocityParsers
// MongoDB
shadow deps.mongo
// Cassandra
shadow deps.cassandradx
shadow deps.cassandraSnappy
shadow deps.cassandraLZ4
testCompile deps.junit
}
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
task fatJar(type: ShadowJar) {
configurations = [project.configurations.shadow]
from(project.sourceSets.main.output)
}
最佳答案
看看this article关于排除 shadow jar 依赖项。
很快,根据这篇文章,通过 shadowJar
排除一些依赖的依赖项不足以排除其传递依赖项,正如您已经提到的那样。如何做到这一点的解决方案是修改运行时配置,从中排除一些依赖项,例如:
configurations {
runtime.exclude %what you need to exclude%
}
我希望,它可能会有所帮助。
关于Gradle shadow 插件还打包了所有 "provided"依赖项,这不应该是这种情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33525048/