在Gradle中使用Proguard - 找不到引用的类java.lang.String

10

我正在尝试将ProGuard配置为我的Gradle构建脚本的一部分,用于Ubuntu中的Java应用程序,通过bash访问,但是我似乎做不对。我以前从未使用过这两种技术。使用ProGuard手册,我编写了以下任务,我目前在调用一个预先存在的jar文件时尝试使其工作。

task obfuscate(type: proguard.gradle.ProGuardTask) {
  injars         'build/libs/myapplication.jar'
  outjars        'build/libs/myapplication_out.jar'
  libraryjars    '<java.home>/lib/rt.jar'
  printmapping   'myapplication.map'

  keep 'public class mypackage.MyMainClass {  \
    public static void main(java.lang.String[]);  \
  }'
}

我收到了很多行缺失内置Java库文件的错误提示,例如:

Warning: myclasses: can't find referenced class java.lang.String

在列表底部,我还看到:
Could not call ProGuardTask.proguard()

如果我检查输出目录,可以看到它创建了目录结构,但没有jar文件。如果我在gradle任务上运行堆栈跟踪,就会看到以下内容:
Caused by: org.gradle.api.GradleException: Could not call ProGuardTask.proguard() on task

我查看了Proguard故障排除页面,上面说我应该确保指定了平台的运行时库,对于JSE来说,这是lib/rt.jar。你可以在库jar参数中看到它。那我理解错了什么?


首先需要弄清楚的是Could not call ProGuardTask.proguard()是来自Gradle还是ProGuard。也许可以展示完整的堆栈跟踪。can't find referenced class java.lang.String听起来像是ProGuard没有正确配置。 - Peter Niederwieser
2个回答

11

ProGuard无法读取运行时jar文件,因为其名称应该有所不同。

在ProGuard配置文件中,您可以编写:

-libraryjars <java.home>/lib/rt.jar

在 Gradle 的构建文件中,你应该使用 Gradle 的风格:

libraryjars "${System.getProperty('java.home')}/lib/rt.jar"

9
你知道在JDK 10中该如何找到rt.jar或其等效文件吗?看起来它不再随着JDK一起提供了。 - MariusVolkhart
1
@MariusVolkhart 自JDK 9起,rt.jar已被移除。 - G. Ciardini

2

这是我设置Gradle Proguard任务的类路径的方法。我使用了一个复制任务,收集Play中的所有jar文件,然后在Proguard任务中引用它们。

task prepare(type: Copy) {

    dependsOn 'jar'

    destinationDir = file("$buildDir/assemble/izpack")
    includeEmptyDirs = true

    into('lib') {
        from configurations.compile
    }
    into('proguard') {
        from configurations.runtime {  include '*truelicense*.jar' }
    }
}


task proguard (type: proguard.gradle.ProGuardTask) {

    dependsOn 'prepare'

    configuration "proguard.conf"

    injars jar.archivePath
    fileTree("$buildDir/assemble/izpack/proguard").include("*.jar").each { f ->
        injars f.path, filter: '!META-INF/MANIFEST.MF'
    }

    outjars "$buildDir/assemble/izpack/web/WEB-INF/lib/${jar.baseName}-${jar.version}.${jar.extension}"

    libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
    libraryjars "${System.getProperty('java.home')}/lib/jce.jar"
    fileTree("$buildDir/assemble/izpack/lib").include("**/*.jar").collect { f -> libraryjars f.path }
    fileTree("$buildDir/assemble/izpack/web").include("**/*.jar").collect { f -> libraryjars f.path }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接