-1

こんにちは、HTMLUnit を使用して、URL を指定して Web ページを取得し、特定の操作を実行するスクリプトを作成しました。たとえば、ページで文字列を検索したり、リンクをクリックしたりします。Eclipse IDE を使用して実行可能な jar を作成しています。

HTML-Unit は、約 21 の異なるライブラリ jar で構成されており、最終的に 1 つの実行可能な jar に抽出しています。これらの依存関係により、単一の jar が約 9.3MB のスペースを占有します。難読化を使用して個々の jar サイズを縮小しようとしています。そのために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 の Web サイトで使用されているものとほとんど同じです -> 典型的なライブラリ。これらの 21 個の削減された jar を使用して Eclipse でプロジェクトを再構築して実行すると、実行時にスクリプトが失敗し、次の例外が表示されます。

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

特定のメソッドが見つからないように、個々の jar を難読化したようです。これらの例外の原因について教えてください。上記の構成ファイルに何か問題がありますか。もしそうなら、このシナリオに最適なプロガード構成は何でしょうか。

別のメンバーが同様の問題を追跡していたことを知っています。質問はリンクに投稿されています:

[リンク] ( JAR ファイルのサイズを減らすために使用されるライブラリを決定する)

ありがとうございました!!

4

1 に答える 1

0

このメソッドはリフレクションによってアクセスされますが、これは ProGuard が静的分析から知ることはできません。構成に保存する必要があります。Cfr. ProGuard マニュアル > トラブルシューティング > NoSuchMethodException

アプリケーション全体を処理する方が、ライブラリを個別に処理するよりもはるかに効果的です。これは、ProGuard が使用されていないライブラリ全体、または少なくともそれらの大部分を削除する可能性があるためです。

于 2013-06-21T11:31:46.543 に答える