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

时间:2014-04-02 13:06:36

标签: java gradle proguard

我试图将ProGuard配置为Ubuntu中Java应用程序的Gradle构建脚本的一部分,通过bash访问,但我似乎无法正确使用它。我之前从未使用过这两种技术。使用ProGuard Manual我编写了以下任务,当我尝试使用某些工作时,我现在调用一个预先存在的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。你可以在库jars参数中看到那里。我错过了什么?

2 个答案:

答案 0 :(得分:8)

ProGuard没有读取运行时jar,因为它的名称应该以不同的方式指定。

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

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

在Gradle构建文件中,您应该使用Gradle的样式:

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

答案 1 :(得分:2)

以下是我为gradle proguard任务设置classpath所做的工作。使用复制任务收集播放中的所有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 }
}