Gradle:获取传递依赖项并导出到最小的运行时 fat jar
Posted
技术标签:
【中文标题】Gradle:获取传递依赖项并导出到最小的运行时 fat jar【英文标题】:Gradle: Fetch transitive dependencies and export to minimal runtime fat jar 【发布时间】:2013-09-08 12:20:35 【问题描述】:如何确保 Gradle 获取所有已声明和传递的依赖项并将它们添加到输出 jar?我正在尝试使用here 概述的配方,但它似乎实际上并未包含传递依赖项。
我希望包含这些依赖项,以便 ProGuard 可以正确优化和缩小输出。
这是一个示例 build.gradle
,它表明传递依赖项没有被拉取:
apply plugin: 'java'
repositories
mavenCentral()
dependencies
compile('com.itextpdf:itextpdf:5.4.3') transitive = true
buildscript
repositories
mavenCentral()
dependencies
classpath 'net.sf.proguard:proguard-gradle:4.10'
jar
dependsOn configurations.runtime
from
configurations.runtime.collect
it.isDirectory() ? it : zipTree(it)
task proguard(type: proguard.gradle.ProGuardTask, dependsOn: build)
configurations.runtime.each
println it
injars jar.archivePath
outjars 'output.jar'
libraryjars "$System.getProperty('java.home')/lib/rt.jar"
keep "public class part1.** * ; "
//dontnote
//dontwarn
dontobfuscate
对于这个示例项目,我使用来自http://itextpdf.com/examples/iia.php?id=12 的代码示例。 POM at MavenCentral 表示 BouncyCastle 库作为编译依赖项,但上面的 build.gradle
没有将它们打包到输出 JAR 中,甚至没有将它们拉到 ~/.gradle
工件缓存中。
结果是,当我在启用警告的情况下运行gradle proguard
时,由于org.bouncycastle.*
类未解析,构建失败。例如:
Warning: com.itextpdf.text.pdf.security.TSAClientBouncyCastle: can't find referenced class org.bouncycastle.tsp.TimeStampTokenInfo
如果无法使用 ProGuard 解决此问题(禁用警告在这里有效,但在我的较大项目中无效,同样由于类似的错误消息),是否有另一种方法让 Gradle 缩小完整运行时的 fat-jar ?
【问题讨论】:
【参考方案1】:查看itextpdf
的 POM,它的所有依赖项要么是测试依赖项,要么是可选的。因此,除非您声明进一步的依赖关系,否则只有 itextpdf
本身会包含在您的 fat Jar 中。
【讨论】:
以上是关于Gradle:获取传递依赖项并导出到最小的运行时 fat jar的主要内容,如果未能解决你的问题,请参考以下文章
Gradle-5.3:依赖-管理依赖的版本(传递(transitive)排除(exclude)强制(force)动态版本(+))