1

如何确保 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?

4

1 回答 1

1

查看itextpdf的 POM,它的所有依赖项要么是测试依赖项,要么是可选的。因此,除非您声明进一步的依赖关系,否则只有itextpdf它自己会包含在您的 fat Jar 中。

于 2013-09-04T23:41:56.150 回答