私は、最大10個の外部ライブラリを使用するアプレットを作成しています。これらを合わせると、2メガバイト以上を占めます。一部のライブラリでは1〜2クラスしか使用しないため、他の多くのライブラリは安全に削除できます。では、問題は、jarライブラリから未使用のクラスを削除する方法ですか?
他の多くの質問はProguardにリンクしています。しかし、それはライブラリを処理せず(または私が何か間違ったことをしている)、リフレクションを使用するコードの一部を台無しにします。
ProGuardは、ライブラリと一緒にコードを処理できます(オプション-injarsを使用)。処理したくない外部ライブラリーは引き続き保持できます(オプション-libraryjarsを使用)。
自動縮小ツールには、反射の問題があります。ProGuardはいくつかの基本的なリフレクションを認識し、リフレクションのために保持する必要がある内部APIの部分を指定できます。ProGuardはいくつかの強力な構成をサポートしていますが、ライブラリへの反映の量によっては、試行錯誤が必要になる場合があります。
maven-shade-plugin を使用して、コードとライブラリを組み合わせた最小化された jar ファイルをビルドするように指示できます。
使用するクラスを静的に識別するClassDepのようなものを使用できます。
ただし、これは簡単にだますことができます。コードの一部に次が含まれていると想像してください。
Class.forName(className);
そのため、クラス名を動的に構築してそのクラスをロードできます。のようなツールでClassDep
はこれらのケースを特定できないため、収縮した jar に対して包括的なテストを実行する必要があります。
JARを「解凍」し、それぞれから必要なクラスのみを取得して、カスタムアーカイブに配置するだけです。ブライアンA.は、これらのクラスといくつかの警告を識別する方法について良い提案をしました。ライセンスに違反している可能性があることを付け加えておきます...