現在、コンパイラを満足させるのに十分なクラスファイルをコピーしています。しかし、実行中のアプリケーションを満足させるのに十分なクラスファイルをコピーしていますか??一部のアプリケーションは、実行時に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.
パッケージから読み込まれているクラスを無視するように、クラスローダーを変更することができます。アプリケーションを実行したら、このファイルに記述されているクラスを小さなプログラムで自動的にコピーさせることができます。
が、私はコンパイルアクションに入れてみました関係する特定のクラスについては、それらをコンパイルしただけで、依存関係を引き出すことはありませんでした。依存しているクラスをコンパイルするにはどうすればよいでしょうか? – jprete