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的主要内容,如果未能解决你的问题,请参考以下文章

在 Intellij 中无法识别 Gradle 依赖项

使用 Gradle 时如何排除传递依赖项的所有实例?

如何告诉 Grails 使用 Gradle 解决依赖关系

Gradle - 排除嵌套的传递依赖

Gradle-5.3:依赖-管理依赖的版本(传递(transitive)排除(exclude)强制(force)动态版本(+))

Gradle 中获取 gradle 依赖项缓存中 jar 文件路径的最简洁方法