¿Cómo ejecutar proguard antes de jPackage?
Introducción
Estoy desarrollando una aplicación en JavaFx usando complementos de gradle y empaquetándola con jPackager, también usando los complementos de gradle.
Los principales complementos que estoy usando son:
id 'org.openjfx.javafxplugin' version '0.0.8'
id 'org.beryx.runtime' version '1.7.0'
id "com.github.johnrengelman.shadow" version "5.1.0"
Mi versión actual de gradle es: gradle-5.6.2-all
Descripción del problema
¿Cómo uso Proguard para que el código se ofusque y optimice antes de que jPackage haga su trabajo?
Puedo ejecutar las tareas de protección, pero cuando ejecuto jPackage, ¡el código no se ofusca!
Encontré un tutorial ( Tutorial ) para una versión anterior de gradle, sin embargo, no estoy seguro de cómo mezclar esto con los complementos actuales. He intentado algunos fragmentos de código pero todos fallaron al compilar y no quiero saturar este tema con un montón de código que no funciona.
Mi trabajo actual build.gradle
// 1. Include proguard dependency
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'net.sf.proguard:proguard-gradle:6.2.0'
}
}
plugins {
id 'java'
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.8'
id 'org.beryx.runtime' version '1.7.0'
id "com.github.johnrengelman.shadow" version "5.1.0"
}
dependencies {
compile "org.controlsfx:controlsfx:11.0.0"
compile "eu.hansolo:tilesfx:11.13"
compile "com.jfoenix:jfoenix:9.0.9"
compile "org.apache.httpcomponents:httpclient:4.5.9"
compile "org.json:json:20180813"
compile "mysql:mysql-connector-java:8.0.17"
compile "org.jasypt:jasypt:1.9.3"
compile "com.mchange:c3p0:0.9.5.4"
compile "com.sun.mail:javax.mail:1.6.2"
compile "commons-validator:commons-validator:1.6"
compile 'org.openjfx:javafx-base:11:win'
compile 'org.openjfx:javafx-controls:11:win'
compile 'org.openjfx:javafx-fxml:11:win'
compile 'org.openjfx:javafx-graphics:11:win'
}
repositories {
mavenCentral()
}
javafx {
version = "13"
modules = [ 'javafx.controls','javafx.graphics','javafx.fxml' ]
}
mainClassName = 'Main'
runtime {
options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
jpackage {
jpackageHome = 'C:/Program Files/Java/openjdk-14-jpackage+1-49_windows-x64_bin/'
if(org.gradle.internal.os.OperatingSystem.current().windows) {
installerType = 'msi'
imageOptions = []
installerOptions = ['--win-per-user-install',
'--win-dir-chooser',
'--win-menu',
'--win-shortcut',
'--verbose',
'--description','Test of proguard with jPackage',
'--name', 'Test-ProguardJPackage',
'--vendor','DoesItMatter']
}
}
}
compileJava {
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml'
]
}
}
run {
doFirst {
jvmArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml'
]
}
}
task cleanClasses(type: Delete) {
delete "${buildDir}/classes/java/main"
delete "${buildDir}/resources/java/main"
}
classes.dependsOn(cleanClasses)
// 2.2 Add proguard task
task proguard(type: proguard.gradle.ProGuardTask, dependsOn: classes) {
injars project.sourceSets.main.output
outjars "${buildDir}/proguard/output.jar"
libraryjars project.sourceSets.main.compileClasspath
configuration 'proguard.conf'
}
// 2.3 Clean after proguard task
task cleanAfterProguard(type: Delete, dependsOn: proguard) {
delete "${buildDir}/classes/java/main"
delete "${buildDir}/resources/java/main"
}
// 2.4 Extract output jar to buildDir
task unpackProguardOutput (type: Copy, dependsOn: cleanAfterProguard) {
from zipTree("${buildDir}/proguard/output.jar")
into file("${buildDir}/classes/java/main")
}
// 3. Create a task to run the app with the proguarded buildDir
task runProguard(type: JavaExec, dependsOn: unpackProguardOutput) {
classpath = sourceSets.main.runtimeClasspath
jvmArgs = ['--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml' ]
main = 'Main' // <-- this name will depend on the proguard result
}
Referencias
Empaquete una aplicación JavaFX no modular


compileJava,runy las dependencias JavaFX de la compilación, todo eso se ocupa del complemento JavaFX.compile “.org.openjfx:...”Consulte el manual , el
buildscriptbloque que proporciona la dependencia se ve completamente diferente:Si bien se queja, es cierto, es
unable to resolve class proguard.gradle.ProGuardTaskprobable que no haya ningunoproguard.gradle.ProGuardTask. YdependsOn: 'obfuscatedJar'es extraño, porquemyProguardTaskse supone que la tarea lo ofusca.También asegúrese de que
/usr/local/java/proguard/libesté instalado, por ejemplo. conlocate proguard, porque para Java no lo proporciona el SDK de Android, por lo que hay que proporcionarlo comobuildscriptdependencia. Luego tendrá que escribir una costumbreproguard.txt, basada en todas las advertencias que arroja cuando se ofusca.La actualización del
proguard-gradlecomplemento podría ser otra opción posible:Como referencia, sería ProGuardTask.java .
fuente