Error message:
[proguard] error[1004]: proguard.evaluation.exception.IncompleteClassHierarchyException
[proguard] --> com/oracle/truffle/js/scriptengine/GraalJSEngineFactory : getScriptEngine()Ljavax/script/ScriptEngine; at areturn
[proguard] 6 | new #120
[proguard] 9 | dup
[proguard] 10 | aload_0 v0
[proguard] 11 | invokespecial #122
[proguard] 14 | goto +11
[proguard] 25 | areturn
[proguard] | ^^^^^^^ Can't find common super class of [com.oracle.truffle.js.scriptengine.PlaceholderScriptEngine] (with 1 known super classes: com.oracle.truffle.js.scriptengine.PlaceholderScriptEngine and 1 unknown classes: javax.script.AbstractScriptEngine) and [com.oracle.truffle.js.scriptengine.GraalJSScriptEngine] (with 1 known super classes: com.oracle.truffle.js.scriptengine.GraalJSScriptEngine and 1 unknown classes: javax.script.AbstractScriptEngine)
[proguard] Variables: [P0:P0:Lcom/oracle/truffle/js/scriptengine/GraalJSEngineFactory;=!]
[proguard] Stack: [20:17:N17:Lcom/oracle/truffle/js/scriptengine/PlaceholderScriptEngine;=!]
[proguard]
[proguard] Unexpected error while performing partial evaluation:
[proguard] Class = [com/oracle/truffle/js/scriptengine/GraalJSEngineFactory]
[proguard] Method = [getScriptEngine()Ljavax/script/ScriptEngine;]
[proguard] Exception = [proguard.evaluation.exception.IncompleteClassHierarchyException] (Can't find common super class of [com.oracle.truffle.js.scriptengine.PlaceholderScriptEngine] (with 1 known super classes: com.oracle.truffle.js.scriptengine.PlaceholderScriptEngine and 1 unknown classes: javax.script.AbstractScriptEngine) and [com.oracle.truffle.js.scriptengine.GraalJSScriptEngine] (with 1 known super classes: com.oracle.truffle.js.scriptengine.GraalJSScriptEngine and 1 unknown classes: javax.script.AbstractScriptEngine))
[proguard] Unexpected error while preverifying:
[proguard] Class = [com/oracle/truffle/js/scriptengine/GraalJSEngineFactory]
[proguard] Method = [getScriptEngine()Ljavax/script/ScriptEngine;]
[proguard] Exception = [proguard.evaluation.exception.IncompleteClassHierarchyException] (Can't find common super class of [com.oracle.truffle.js.scriptengine.PlaceholderScriptEngine] (with 1 known super classes: com.oracle.truffle.js.scriptengine.PlaceholderScriptEngine and 1 unknown classes: javax.script.AbstractScriptEngine) and [com.oracle.truffle.js.scriptengine.GraalJSScriptEngine] (with 1 known super classes: com.oracle.truffle.js.scriptengine.GraalJSScriptEngine and 1 unknown classes: javax.script.AbstractScriptEngine))
[proguard] Unexpected error
[proguard] java.lang.RuntimeException:
[proguard]
[proguard] It appears you are missing some classes resulting in an incomplete class hierarchy,
[proguard] please refer to the troubleshooting page in the manual:
[proguard] https://www.guardsquare.com/en/products/proguard/manual/troubleshooting#superclass
[proguard]
[proguard] at proguard.ProGuard.execute(ProGuard.java:268) ~[proguard-base-7.4.1.jar:7.4.1]
[proguard] at proguard.ProGuard.main(ProGuard.java:648) ~[proguard-base-7.4.1.jar:7.4.1]
My project environment:
Mac os inter
JDK17.0.10
javafx21.0.2
proguard-maven-plugin
My MVN configuration:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.12.1</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<mainClass>com.potato.potatotool.ToStart</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.8</version>
<configuration>
<jlinkImageName>PotatoTool</jlinkImageName>
<launcher>launcher</launcher>
<mainClass>com.potato.potatotool/com.potato.potatotool.ToStart</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<attach>true</attach>
<attachArtifactClassifier>pg</attachArtifactClassifier>
<libs>
<lib>${java.home}/jmods/java.base.jmod</lib>
</libs>
<obfuscate>true</obfuscate>
<injar>${project.build.finalName}-jar-with-dependencies.jar</injar>
<outjar>${project.build.finalName}-proguard.jar</outjar>
<outputDirectory>${project.build.directory}</outputDirectory>
<proguardInclude>${project.basedir}/proguard.conf</proguardInclude>
</configuration>
</plugin>
My confusion rule:
-target 17
-dontnote
-dontshrink
-dontoptimize
-dontusemixedcaseclassnames
-useuniqueclassmembernames
-adaptresourcefilenames **.fxml,**.png,**.css,**.properties,**.json,**.js,**.xdb,**.txt,**.csv,**.dat
-adaptresourcefilecontents **.fxml
-adaptclassstrings
-printmapping out.map
-renamesourcefileattribute SourceFile
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-keepnames interface ** { *; }
-keepparameternames
-keepclassmembers enum * { *; }
-keepclassmembers class * {
@javafx.fxml.FXML *;
@javax.inject.Inject *;
@javax.annotation.PostConstruct *;
}
-keepclasseswithmembernames,includedescriptorclasses class * {
native <methods>;
}
-dontnote com.potato.potatotool.**
-printconfiguration
-keep public class com.potato.potatotool.ToStart {*;}
-keep class javafx.** {*;}
-dontwarn javafx.**
-keep class org.** {*;}
-dontwarn org.**
-keep class com.google.** {*;}
-dontwarn com.google.**
-keep class com.ibm.** {*;}
-dontwarn com.ibm.**
-keep class com.leewyatt.** {*;}
-dontwarn com.leewyatt.**
-keep class com.oracle.** {*;}
-dontwarn com.oracle.**
-keep class com.strobel.** {*;}
-dontwarn com.strobel.**
-keep class com.sun.** {*;}
-dontwarn com.sun.**
-dontwarn com.potato.**
I shouldn’t add -dontpreverify. Adding -dontpreverify would require me to add -noverify for the application to run, which I don’t want.