2011-12-07 9 views
1

私は10MBを作るpdfboxライブラリを使ってJavaアプリケーションを持っています。私はこのライブラリのいくつかのクラスを使用します。プロガードは、ライブラリの未使用クラスを除外できますか?

私は、ProGuardが自分のアプリケーション用のスタンドアロンのJarファイルを生成すると考えました。しかし、ProGuardによって生成されたjarファイルでは、実行するには/ libフォルダ内のpdfbox.jarが必要です。私は何か間違っているのですか?どうすれば目標を達成できますか? (私が使用しないライブラリクラスの99%を残して)。

コメント後注: - オリジナルjarファイルとそのライブラリは、NetBeansで生成されます。私は最初にProGuard GUIを使用しましたが、私がこの質問で受けたコメントに続いて、私はスクリプトに切り替えました。同じ結果:ライブラリがjarファイルの横にある/ libフォルダにある場合にのみ、アプリケーションは動作します。

ProGuardのスクリプト:

-injars  "C:\Users\C. Levallois\Documents\NetBeansProjects\ZoText\dist\ZoText.jar" 
-outjars  "C:\Users\C. Levallois\Documents\NetBeansProjects\ZoText\dist\ZoText_short.jar" 

-libraryjars <java.home>/lib/rt.jar 
-libraryjars "C:\Users\C. Levallois\Documents\NetBeansProjects\ZoText\dist\lib\Boilerpipe_short.jar" 
-libraryjars "C:\Users\C. Levallois\Documents\NetBeansProjects\ZoText\dist\lib\commons-io-2.1.jar" 
-libraryjars "C:\Users\C. Levallois\Documents\NetBeansProjects\ZoText\dist\lib\commons-lang3-3.0.1.jar" 
-libraryjars "C:\Users\C. Levallois\Documents\NetBeansProjects\ZoText\dist\lib\guava-10.0.1.jar" 
-libraryjars "C:\Users\C. Levallois\Documents\NetBeansProjects\ZoText\dist\lib\nekohtml.jar" 
-libraryjars "C:\Users\C. Levallois\Documents\NetBeansProjects\ZoText\dist\lib\pdfbox-app-1.6.0.jar" 
-libraryjars "C:\Users\C. Levallois\Documents\NetBeansProjects\ZoText\dist\lib\xercesImpl.jar" 


-printmapping proguard.map 

-keep public class proguard.ProGuard { 
    public static void main(java.lang.String[]); 
} 

-keepparameternames 
-renamesourcefileattribute SourceFile 
-keepattributes Exceptions,InnerClasses,Signature,Deprecated, 
       SourceFile,LineNumberTable,*Annotation*,EnclosingMethod 

-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 enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

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

プロガードがそうするでしょう。あなたはそれを試してみましたか?また、必要なクラスをコピーして使用することもできます。 –

+0

私はProguardについて私の質問に言及しましたが、あなたのコメントの後に私はそれを明確にするために編集しました。どうも。 – seinecle

+0

スクリプトの関連部分を投稿できますか? – vaughandroid

答えて

1

マニュアルの私の読書によると、ProGuardのは、それがプロセスJARファイル用の未使用のクラスを除外しません。だから私はあなたがpdfbox.jarファイルを処理していないと思う。つまり、クラスパス上にあるだけです。


GUIではなくスクリプトからProguardを実行することをお勧めします。これにより、難読化ステップをメインビルドスクリプトに組み込み、バージョン管理スクリプトを使用して、他の人にスクリプトを表示してアドバイス/ヘルプを得ることができます。

2

-libraryjarsは、実行時に最適化されたアプリで使用できると思われるコードを保持します。つまり、Proguardはそれらを出力に含めません。それは単に-injarsのコードを処理しているので参照のためだけに必要です。

Proguardをすぐに削除してください。元の最適化されていないJARは、このライブラリクラスがなくても動作しません。 Proguardはそれを変更しません。

最適化された出力にまとめてパッケージ化する場合は、入力に入力する必要があります。これらの追加のjarファイルを-injarsとして含めるか、出力にJARredを入力して最初に入力する必要があります。

しかし、はい:Proguardは、この他のライブラリからビルドしたものも含めて、未使用のクラスを削除することができます。

関連する問題