4

ベストプラクティスではないかもしれませんが、サードパーティのjarファイルから未使用のクラスを削除する方法はあります。私のクラスがライブラリを使用している方法を調べ、ある種のカバレッジ分析を行ってから、手つかずのクラスをすべて削除して別のjarファイルを吐き出します。

明らかにこれには問題があります。具体的には、私が言った使用シナリオでは、常にすべてのクラスを使用するとは限りません。

しかし、これらの問題を無視すると、原則としてそれを行うことができますか?

4

7 に答える 7

8

やり方がある。

JarJar プロジェクトはこの AFAIR を行います。JarJar プロジェクトの最初の目標は、必要に応じてパッケージ構造を変更して、独自の jar にサードパーティのライブラリを埋め込むことができるようにすることです。そうすることで、不要なクラスを取り除くことができます。

http://code.google.com/p/jarjar/で確認してください。

jar の縮小に関するリンクは次のとおりです。http://sixlegs.com/blog/java/jarjar-keep.html

于 2008-09-01T23:14:40.343 に答える
2

これにはProGuardを使用します。優れた難読化ツールであるだけでなく、複数の JAR を組み合わせて未使用のクラスまたはクラス メンバーを削除できるコード縮小フェーズがあります。それは収縮に​​れた仕事をします。

于 2009-11-24T07:47:12.163 に答える
2

Ant には classfileset と呼ばれるツールがあります。必要なルート クラスのリストを指定すると、classfileset がそれらのコードを再帰的に分析して、すべての依存関係を見つけます。

または、必要なすべての機能を実行する優れたテスト スイートを開発し、テスト カバレッジ ツールでテストを実行することもできます。このツールは、どのクラス (およびその中のステートメント) が実際に使用されたかを示します。これにより、静的解析で得られるものよりもさらに小さなコード セットが得られる可能性があります。

于 2008-09-02T17:08:56.203 に答える
1

以前の仕事では、Java難読化ツールを使用して、コードを難読化するだけでなく、使用されていないクラスとメソッドも削除しました。「Class.byName」またはその他のタイプのリフレクションを実行している場合、リフレクションによって呼び出されたクラスまたはメソッドをコードで調べることによって難読化ツールが判断できないため、難読化ツールに通知する必要がありました。

もちろん、問題は、サードパーティライブラリの他の部分がリフレクションを行っているかどうかわからないことです。したがって、「未使用」のクラスを削除すると、テストしていないあいまいなケースで問題が発生する可能性があります。

于 2008-09-01T19:20:53.947 に答える
0

jarは単なるzipファイルなので、できると思います。ソースにたどり着くことができれば、それはよりクリーンです。たぶん、クラスを分解してみてください。

于 2008-09-01T19:13:55.617 に答える
0

この質問に加えて、それはパフォーマンスを向上させることができますか?使用されていないクラスはJITコンパイルされないため、起動時間が改善されますか、それともJavaはバイトコードへのコンパイル中にそれを自動的に検出し、使用されていないコードも処理しませんか?

于 2008-09-01T19:16:11.570 に答える
0

これは興味深いプロジェクトになるでしょう (誰かがすでにそれを行ったことがありますか?)

開始点としてツールに jar を指定し、ライブラリ jar をクリーンアップすることをお勧めします。リフレクションを使用して、jar(s) が直接参照するクラスと、呼び出しツリーで間接的に使用されるクラスを判断できます (これは簡単なことではありませんが、実行可能です)。2 つの場所のいずれかでリフレクション コードが検出された場合は、非常に大きな警告が表示されます。

于 2008-09-01T20:18:57.817 に答える