2016-09-11 24 views
8

TLの間に必要なすべてのクラスをリスト; DR
私は私が特定のソースファイル用のJavaコンパイラが必要とするすべてのクラスをログに記録することができますjavacプラグインのAPIを探しています。Javaコンパイラは、コンパイル

もっとコンテキスト:
私はそこBazelが可能であることである、とモジュール」のより細かい粒粒度、恩恵MavenからBazelと課題(および機会)のいずれかに移行するためのツールを書いています"さらに、クラスパスのコンパイルに関しては、依存関係は推移的ではありません。私は、唯一の可能なコードの依存性グラフを構築しようとしていると(等定数、輸入のための)ソースコード上のバイトコードに加えヒューリスティックを使用しているが、私は恐怖エッジケースに上につまずいた

コンパイラプラグインを使用して解決してください。 ParentInterfaceはバイトコードまたはソースコードに表示されませんが、コンパイルのクラスパスにSomeInterfaceParentInterfaceの両方を必要とjavac次いでParentInterfaceを拡張インタフェースSomeInterfaceを受け入れるクラスConcreteにおける方法Foo考える

がに関して推移している依存関係は、クラスパスをコンパイルするが、これは非常にクラスパス(ソースdependneciesとビルドトリガーに関して主に興味深い)を広げるため、私はそれを避けるしたいので、これはMavenで解決されます。

compiler pluginsを使用して、特定のソースファイルに対してコンパイラが必要とするすべてのクラスを識別できるかどうかを確認しようとしています。これは、私が情報を収集し、この情報からグラフを生成するために私のビルドを一度実行することができるので、私を助けるでしょう。問題は、私はAPIに関して少し失われているということです。

ありがとうございます!

+1

SomeInterfaceを調べて、ParentInterfaceが必要であることを確認できます。リフレクションまたはバイトコード分析のいずれかを使用できます。それがあまりにも難しいと思うなら、私はこの情報を得るためにコンパイラを使用しようとすると10倍の難しさがあることを保証することができます。 –

+0

@PeterLawreyありがとう!ビルドの時間に興味があるので、おそらく私の助けとはならないでしょうが、バイトコードがうまくいくかもしれません。問題は、私が親を必要とするケースのうちのいくつかの場合に限られており、あなたのアプローチでは、これらのすべてのケースを学ぶか、すべての補助タイプとその祖先にスコープを拡大することが義務付けられています(そして、さらに)... – Ittai

+0

はい。また、実行時にリフレクションによって取得されたクラスが必要になります。 –

答えて

0

まあ、コンパイルにはどのクラスが必要かは推移的です。したがって、非推移的依存システムでこれをマップする方法はありません。同じモジュール内のすべてを引き継いでいる場合を除きます。

結局のところ、ノードはクラスであり、AとBの境界はBでAが使用されていることを示しているグラフです.Aから到達可能なすべてのクラスはAの依存関係にある必要があります接続された部分グラフとしてモジュールを構築できるはずです。

したがって、具体例を分析した後、SomeInterfaceを分析し、ParentInterfaceを分析します。直接依存関係のグラフを作成し、推移依存関係を自分で計算します。

自分で推移性を解決するため、必要なクラスを見つけるためにバイトコード分析(例:ASM経由)以外の操作は必要ありません。コンパイルで失われる唯一の依存関係は、未使用のインポートです。これを削除することができます(Javaスタイルのガイドの多くは、削除する必要があると言っています)。

PS:バーゼルを知らないと、小さなモジュールを作るように思えます。

+0

あなたが何を記述しているかは、私が望むものではない完全な推移的閉包です。私は、私が暮らすことができる最小の推移閉包を望んでおり、それは2つの方法のいずれかで達成することができます:1.必要なすべてのクラスをリストするコンパイラプラグイン。 2.これが必要な依存関係タイプを理解し、それらのためだけに準備する。 Scalaでは私は以前のアプローチを使用しています – Ittai

関連する問題