-1

嗨,我使用 HTMLUnit 编写了一个脚本,该脚本获取给定 url 的网页并对其执行某些操作。例如在页面上搜索字符串或单击链接等。我正在使用 Eclipse IDE 创建一个可运行的 jar。

HTML-Unit 由大约 21 个不同的库 jar 组成,我将它们提取到我的单个最终可运行 jar 中。这些依赖关系导致单个 jar 占用大约 9.3MB 的空间。我一直在尝试使用混淆来减小单个 jar 的大小。我正在使用一个名为 proguard 的工具。

这是一个示例 proguard 配置,我用它来混淆名为“commons-logging-1.1.1.jar”的单个库 jar:

 `-libraryjars  <java.home>/lib/rt.jar

  -injars       C:/Users/Desktop/Jars/commons-logging-1.1.1.jar

  -outjar       C:/Users/Desktop/SmallJars/commons-logging-1.1.1.jar

  -printmapping C:/Users/Desktop/SmallJars/out_commons-logging-1.1.1.map

  -renamesourcefileattribute SourceFile

  -dontnote

  -keepattributes InnerClasses,SourceFile,LineNumberTable,Deprecated

  -keep public class * {
   public protected *;
   }

  -keepclassmembernames class * {
   java.lang.Class class$(java.lang.String);
   java.lang.Class class$(java.lang.String, boolean);
   }

   -keepclasseswithmembernames class * {
    native <methods>;
    }

   -keepclassmembers class * implements java.io.Serializable 
    {
    static final long serialVersionUID;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
    }`

该配置与 proguard 网站上给出的配置几乎相同 -> 典型库。在 eclipse 中使用这 21 个简化的 jar 重建项目并运行它时,脚本在运行时失败,但有以下异常:

“java.lang.NoSuchMethodException:org.apache.http.conn.ssl.SSLSocketFactory.createDefaultSSLContext()”

看起来我已经以现在找不到某些方法的方式混淆了各个罐子。您能否指导我了解可能导致这些异常的原因。上面的配置文件有什么问题吗?如果是这样,这种情况下最好的 proguard 配置是什么。

我知道另一个成员正在寻找类似的问题。问题发布在链接:

[链接](确定使用的库以减小 JAR 文件大小

谢谢!!

4

1 回答 1

0

该方法是通过反射访问的,ProGuard 无法从其静态分析中知道这一点。您必须将其保留在您的配置中。参照。ProGuard 手册 > 故障排除 > NoSuchMethodException

作为一个整体处理应用程序将比单独处理库更有效,因为 ProGuard 可能会删除完全未使用的库或至少其中大部分。

于 2013-06-21T11:31:46.543 回答