我试图将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参数中看到那里。我错过了什么?
答案 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 }
}