2014-04-02 32 views
2

我想配置ProGuard作爲我的Gradle構建腳本的一部分,用於在Ubuntu中通過bash訪問Java應用程序,但我無法看到做對了。我以前從未使用過任何一種技術。使用ProGuard Manual我寫了下面的任務,我現在調用一個預先存在的jar文件,而我試着去做一些工作。在Gradle中使用Proguard - 找不到引用類java.lang.String

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文件,這是我看到如果我用stacktrace運行我的gradle任務:

Caused by: org.gradle.api.GradleException: Could not call ProGuardTask.proguard() on task 

我看了一下proguard故障排除頁面,它說我應該確保我指定了我的平臺的運行時庫,而對於JSE,這是lib/rt.jar。你可以看到在圖書館罐子裏的爭論。我錯過了什麼?

+0

首先要弄清楚的是,'不能調用ProGuardTask.proguard()'來自Gradle或ProGuard。也許顯示完整的堆棧跟蹤。 '找不到引用類java.lang.String'聽起來像ProGuard沒有正確配置。 –

回答

4

ProGuard未讀取運行時jar,因爲它的名稱應該用不同的方式指定。

在ProGuard的配置文件,你可以這樣寫:

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

在搖籃構建文件,你應該使用搖籃的風格:

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

這裏是我做的設置我的類路徑中我的gradle產出proguard任務。使用複製任務收集所有正在播放的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 } 
} 
相關問題