2009-09-04 3 views
4

時々顧客に提供される機能を含むライブラリEclipseプロジェクト/ワークスペースがあります。私たちはすべての研究者ですので、これは非常に非公式に行われています。私はJARとWordファイルを文書化して、それらに送付します。1つのソースファイルの依存関係に基づいてJava Eclipseプロジェクトのサブセットを作成します

単純化するために、実際に必要なものだけを含むJARファイルを送信することをお勧めします。クラスX、Y、Z、Wが必要な場合は、X、Y、Z、Wを含むJARファイルとそれらに依存するすべてのクラスを送信します。

今私は絶望的に手作業でこれをやっています(新しいプロジェクトを作成し、X、Y、Z、Wをドラッグして、コンパイラエラーを修正するために必要なものをドラッグします)。 Eclipseで自動化する正しい方法は何ですか?

EDIT:関心のあるEclipseプロジェクトには、顧客が実際に必要とするよりも多くのクラスが含まれています。

EDIT:また、反射は含まれません。私はコンパイラが何が起こっているのかを知っていると確信することができます。私はコードを書いた人で、ペストのような反射は避けます。私がリフレクションを使用した唯一の場所は、Collections.toArray()を模倣することです。その場合、問題の原因となる唯一のクラスは、ユーザーが提供したクラスだけです。

答えて

3

Eclipseのプラグインが役立ちますが、これはSourceforgeから削除されています。徹底的な自動化されたプロセスを得ることではなく、依存関係を決定することにあります。私はガニメデ/ガリレオに取り組むことができるかどうかは分かりません。

更新

それははあなたに正確タスクを実行するプラグインを作成するためにを使用することができることを、プラグイン拡張APIが付属していますので、Class Dependency Analyzerツールは、より有用であることを証明するかもしれませんやりたい

アップデート#2

あなたはアリの使い方に疑問を抱いた場合、あなたは、クラスと依存関係のリストを取得するためにClassFileSetタイプを使用することができます。これはコピータスク内で参照され、必要なクラスファイルがコピーされます。これはソースファイルをコピーしないことに注意してください。

内部的には、このメソッドはBCEL libraryによって異なります。したがって、ソースのコピーを実行する場合は、.classファイルの依存関係を調べ、ソースを別のディレクトリにコピーすることができます。

2

あなたは、あなたが生成されたJARに含めるファイルを選択する選択肢を与えられているエクスポート]コマンドを使用すると、この

+0

が、私はコンパイルアクションに入れてみました関係する特定のクラスについては、それらをコンパイルしただけで、依存関係を引き出すことはありませんでした。依存しているクラスをコンパイルするにはどうすればよいでしょうか? – jprete

1

のようなものを自動化するAntを使用することができます。

+0

私はXYZWクラスのみを選択すると、自動的に必要なクラスを独自に追加しますか?その設定を ".jardesc"として保存すると、XYZWの依存関係の変更に基づいて出力が動的に更新されますか? – jprete

+0

残念ながら、必要なクラスは追加されません。それらをすべて選択する必要があります。 私はjardescファイルについて知りません。申し訳ありません。 –

2

現在、コンパイラを満足させるのに十分なクラスファイルをコピーしています。しかし、実行中のアプリケーションを満足させるのに十分なクラスファイルをコピーしていますか??一部のアプリケーションは、実行時にreflectionを経由して自分のクラスをロードします。この例では

String className = "org.my.company.Foo"; 
Class<?> fooClass = Class.forName(className); 
Object foo = fooClass.newInstance(); 

を、コンパイラはあなたがorg.my.company.Fooクラスをコピーしていない場合でも、文句はありません。ただし、実行中のアプリケーションは、クラスを見つけることができない場合、最も確かに不平を言うでしょう。

あなたは両方の状況に対応する場合は、実行中のアプリケーションによってロードされているすべてのクラスを記録したカスタムClassLoaderを書いて試すことができます:

public class RecordingClassLoader extends ClassLoader { 

    private FileWriter classNameWriter; 

    public RecordingClassLoader(ClassLoader parent) throws IOException { 
     super(parent); 
     classNameWriter = new FileWriter(System.getProperty("loaded.classes.file", "C:\\classes.txt")); 
    } 

    @Override 
    public Class<?> loadClass(String name) throws ClassNotFoundException { 
     try { 
      classNameWriter.write(name); 
      classNameWriter.write("\r\n"); 
      classNameWriter.flush(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      throw new RuntimeException("Could not record class loading", e); 
     } 

     return super.loadClass(name); 
    } 

} 

あなたは、このようなあなたのアプリケーションを実行できます。

 
java 
    -Djava.system.class.loader=RecordingClassLoader 
    -Dloaded.classes.file=loaded_classes.txt 
    YourApplication 

loaded_classes.txtファイルは次のようになります:

 
java.lang.System 
java.nio.charset.Charset 
java.lang.String 
... 
... 
YourApplication 

java.パッケージから読み込まれているクラスを無視するように、クラスローダーを変更することができます。アプリケーションを実行したら、このファイルに記述されているクラスを小さなプログラムで自動的にコピーさせることができます。

+0

私はコードを記述しましたが、反映は関係ないと確信しています(編集の質問を参照してください)。しかし、それはやや異なる質問に対するかなり良い答えになるでしょう。 :) – jprete

1

このようなリファクタリングをサポートするためにEclipse enhancement requestを提出しました。その間、私は、デカップリングと依存関係分析を助ける有望なツールをいくつか見つけました。

  • eDepend要素の依存関係を表示 クラス/パッケージの依存関係図、ライブラリ/他のプロジェクトとの依存サイクルの 関係を含む依存ビューアプラグインです。 には、依存関係の原因となったクラスの検索も表示されます。 Javaの
  • ため
  • STAN構造解析
  • nWire
  • Class Dependency Analyzer
  • Dependency Finder

関連した質問:1

私はANTに初心者だ
関連する問題