我曾经在 java 8 上使用 proguard 5,但由于我现在使用 Java 11,我已经下载了 proguard 6.1.1,但我遇到了问题。
1 - 由于 proguard 没有在java.awtor 中找到基本类,所以产生了很多警告java.lang:
Warning: ...: can't find referenced class java.awt.image.BufferedImage
Warning: ...: can't find referenced class javax.swing.JPanel
Warning: ...: can't find referenced class java.lang.management.ManagementFactory
Run Code Online (Sandbox Code Playgroud)
我可以通过添加 global 或 specifics 来删除所有警告-dontwarn,但我认为这并不理想。有更好的解决方案吗?
2 - 如果我使用选项删除警告,-dontwarn则会生成错误:
Unexpected error while performing partial evaluation:
Class = [...]
Method = [<init>()V]
Exception = [java.lang.IllegalArgumentException] (Can't find common super class of [softwares/progeria/nuclei/NucleiLabeling] (with 1 known super classes) and [java/lang/InterruptedException] (with 4 known super classes))
Unexpected error while preverifying:
Class = [...]
Method = [<init>()V]
Exception = [java.lang.IllegalArgumentException] (Can't find common super class of [...] (with 1 known super classes) and [java/lang/InterruptedException] (with 4 known super classes))
Error: Can't find common super class of [...] (with 1 known super classes) and [java/lang/InterruptedException] (with 4 known super classes)
Run Code Online (Sandbox Code Playgroud)
生成此错误的类扩展了 JFrame 并完美运行。我该如何解决这个错误?
小智 3
您的应用程序依赖于您需要告诉 ProGuard 的各种运行时库。
在 Java 8 之前,所有内置 java 库(例如AWT等Swing)都捆绑在一起在rt.jar. 您可以向 ProGuard 提供类似以下参数的内容:
-libraryjars <java.home>/lib/rt.jar
Run Code Online (Sandbox Code Playgroud)
或者如果使用 Ant:
<libraryjar file="${java.home}/jre/lib/rt.jar" />
Run Code Online (Sandbox Code Playgroud)
从 Java 9 开始,这些运行时库被打包为<java.home>/jmods. 您可能至少需要:
-libraryjars <java.home>/jmods/java.base.jmod(!**.jar;!module-info.class)
Run Code Online (Sandbox Code Playgroud)
或者如果使用 Ant:
<libraryjar file="${java.home}/jmods/java.base.jmod(!**.jar;!module-info.class)" />
Run Code Online (Sandbox Code Playgroud)
但是,这不包括 AWT 或 Swing,它们现在位于java.desktop.jmod. 确切地说,您需要链接哪个 jmod 将取决于您的应用程序使用哪个 Java 运行时库。
在你的情况下看起来你需要
-libraryjars <java.home>/jmods/java.base.jmod(!**.jar;!module-info.class)
-libraryjars <java.home>/jmods/java.destop.jmod(!**.jar;!module-info.class)
-libraryjars <java.home>/jmods/java.management.jmod(!**.jar;!module-info.class)
Run Code Online (Sandbox Code Playgroud)
或者
<libraryjar file="${java.home}/jmods/java.base.jmod" jarfilter="!**.jar" filter="!module-info.class" />
<libraryjar file="${java.home}/jmods/java.desktop.jmod" jarfilter="!**.jar" filter="!module-info.class" />
<libraryjar file="${java.home}/jmods/java.management.jmod" jarfilter="!**.jar" filter="!module-info.class" />
Run Code Online (Sandbox Code Playgroud)
网络搜索jmod <some class or package>或 只是JDK Module Summary应该可以帮助您识别您可能需要的任何其他内容。
注意:如果没有 <java.home>/jmods 文件夹,并且您使用 openjdk,请注意,它有一个单独的包,搜索 java-11-openjdk-jmods 以安装正确的包
| 归档时间: |
|
| 查看次数: |
536 次 |
| 最近记录: |