2008-09-01 21 views
4

ベストプラクティスではないかもしれませんが、サードパーティのjarファイルから未使用のクラスを削除する方法があります。私のクラスがライブラリを使用していて、何らかのカバレッジ分析を行っている様子を見て、手つかずのクラスをすべて削除した別のジャーを吐き出すもの。サードパーティのライブラリから毛羽立ちを除去するにはどうすればよいですか?

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

しかし、これらの問題を無視して、原則的に行うことはできますか?

答えて

8

方法があります。

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

http://code.google.com/p/jarjar/でご覧ください。ここで

は縮小瓶についてのリンクです:classfilesetと呼ばれるのAntでのツールがhttp://sixlegs.com/blog/java/jarjar-keep.html

0

jarはちょうどzipファイルですので、できると思います。あなたがソースに到達することができれば、それはよりきれいです。おそらく、クラスを逆アセンブルしてみてください。

0

この質問に追加すると、パフォーマンスが向上する可能性がありますか?使用されていないクラスはJITコンパイルされていないので、起動時間が改善されるか、Javaは自動的にバイトコードにコンパイルする間にそのコードを検出し、使用されていないコードを処理しないでしょうか?

1

以前の職場では、Java obfuscatorを使用してコードを難読化し、使用されていないクラスとメソッドも削除しました。 "Class.byName"や他のタイプのリフレクション用のものを実行していた場合は、リフレクションによって呼び出されたクラスやメソッドをコードで調べることができないため、難読化者に伝える必要がありました。

もちろん、第三者図書館の他の部分が反映されているかどうかわからないことがあるため、「未使用」クラスを削除すると、隠されている不明瞭なケーステストされていません。

0

これは興味深いプロジェクト(誰もがすでにそれを行ったのか?)

私はあなたが出発点としてツールをあなたのjarファイル(複数可)を与えるだろうと推測し、ライブラリのjarファイルをクリーンアップすることです。あなたのjarが直接参照するクラスと、コールツリーの間接的に使用されるクラス(これは簡単ではありませんが、実行可能です)を判別するためにリフレクションを使用できます。 2つの場所のいずれかで反射コードが検出された場合は、非常に大きな警告が表示されます。

2

があります。必要なことを知っているルートクラスのリストを指定すると、クラスファイルセットはそのコードを再帰的に分析してすべての依存関係を検索します。

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

2

私はこれにProGuardを使用します。優れた難読化ツールであるだけでなく、複数のJARを結合して未使用のクラスやクラスメンバーを取り除くコード短縮フェーズを備えています。それは縮んで優秀優秀な仕事を行います。

関連する問題