2013-06-19 55 views
-1

您好我已经使用HTMLUnit编写了一个脚本,该脚本提取给定url的网页并对它们执行某些操作。例如在页面上搜索字符串或单击链接等。我正在使用eclipse IDE创建一个可运行的jar。减少HtmlUnit库的jar大小

HTML-Unit包含大约21种不同的库罐,我在我的单个最终可运行jar中提取。这些依赖关系导致单个jar占用大约9.3MB的空间。我一直试图通过使用模糊处理来减少单个jar的大小。我正在使用一个名为proguard的工具。

这里有一个例子proguard的配置,我使用的的“共享记录-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网站上使用 - >典型库。在使用这21个缩小的jar重新编译项目并运行它时,脚本在运行时会失败,例外:

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

看起来像我混淆了个别瓶子的方式,现在不会找到某些方法。你能指导我什么可能导致这些例外。并且上面的配置文件有什么问题。如果 那么对于这种情况什么是最好的proguard配置。

我知道另一个成员正在追逐类似的问题。现在的问题是张贴在链接:

[链接](Determine used libraries to reduce JAR file size

谢谢!!

回答

0

该方法通过反射进行访问,ProGuard无法从其静态分析中获知该方法。您必须将其保存在您的配置中。 (CFR)。 ProGuard手册>故障排除>NoSuchMethodException

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

+0

感谢埃里克,帮助! – Chiseled