如何确保 Gradle 获取所有声明的和传递的依赖项并将它们添加到输出 jar?我正在尝试使用此处概述的配方,但它似乎实际上并未包含传递依赖项。
我希望包含这些依赖项,以便 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的代码示例。MavenCentral的POM将 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?