2 回答

TA貢獻1951條經驗 獲得超3個贊
問題
當您運行 Gradle 任務時,您必須根據任務的依賴關系考慮之前將執行的任務。
您可以看到 proguard 自定義任務在它們之間連接起來,當您運行 時./gradlew runProguard
,實際上您會得到以下任務順序:
:cleanClasses
:compileJava
:processResources
:classes
:proguard
:cleanAfterProguard
:unpackProguardOutput
:runProguard
如果您現在想添加runtime插件,對于類似runtime或 之類的任務jpackage,您將得到以下命令:
:cleanClasses
:compileJava
:processResources
:classes
:jar
:startScripts
:installDist
:jre
:runtime
你看到問題了嗎?根本沒有調用 proguard 任務,因為我們沒有修改任務runtime以依賴 proguard。
解決方案
正如您所看到的,runtime和都jpackage依賴于項目的 jar。因此,一個簡單的修復方法是將任務連接到任務proguard中jar,因此我們從 proguarded 類而不是原始類中創建一個 jar。
在你的構建中類似這樣的東西應該可以工作:
jar.dependsOn(unpackProguardOutput)
但是,資源存在問題(受到混淆的 FXML 文件將被原始文件覆蓋),因為原始資源會再次復制到 jar 中。
所以我們可以修改jar任務來代替:
jar {
? ? dependsOn 'cleanAfterProguard'
? ? manifest {
? ? ? ? attributes(
? ? ? ? ? ? ? ? 'Main-Class': 'org.openjfx.Launcher'
? ? ? ? )
? ? }
? ? from zipTree("${buildDir}/proguard/output.jar")
}
現在這將是任務順序:
:cleanClasses
:compileJava
:processResources
:classes
:proguard
:cleanAfterProguard
:jar
:startScripts
:installDist
:jre
:runtime
現在運行./gradlew clean runtime將生成一個基于 proguarded 的運行時映像hellofx.jar。跑步build/image/bin/hellofx應該有效。
這同樣適用于jpackage:
:cleanClasses
:compileJava
:processResources
:classes
:proguard
:cleanAfterProguard
:jar
:startScripts
:installDist
:jre
:jpackageImage
:jpackage
在這張圖片中,您可以看到 hellofx.app 中包含的 jar 僅包含 proguarded 類。

TA貢獻1836條經驗 獲得超3個贊
buildscript
提供依賴項的塊看起來完全不同:
buildscript {
? ? repositories {
? ? ? ? flatDir dirs: '/usr/local/java/proguard/lib'
? ? }
? ? dependencies {
? ? ? ? classpath ':proguard:'
? ? }
}
雖然它抱怨說確實如此unable to resolve class proguard.gradle.ProGuardTask,但很可能不會有任何proguard.gradle.ProGuardTask。這dependsOn: 'obfuscatedJar'很奇怪,因為任務myProguardTask應該會混淆它。
task myProguardTask(type: proguard.gradle.ProGuardTask) {
? ? ...
}
還要確保/usr/local/java/proguard/lib甚至已安裝,例如。,locate proguard因為對于 Java,Android SDK 不提供它 - 因此必須將其作為buildscript依賴項提供。然后,您必須proguard.txt根據混淆時拋出的所有警告編寫一個自定義。
更新proguard-gradle插件可能是另一種可能的選擇:
dependencies {
? ? classpath 'net.sf.proguard:proguard-gradle:6.2.0'
}
添加回答
舉報