web-dev-qa-db-ja.com

javax.tools.JavaCompilerを使用してソースをコンパイルするときにクラスパスを設定するにはどうすればよいですか?

クラスjavax.tools.JavaCompiler(jdk6)を使用してソースファイルをコンパイルしますが、ソースファイルはいくつかのjarファイルに依存しています。 javax.tools.JavaCompilerのクラスパスを設定するにはどうすればよいですか?

41
Diablo.Wu

javax.tools.JavaCompiler#getTask() メソッドは、コンパイラオプションを設定できるoptionsパラメータを取ります。次の message は、呼び出し側プログラムのクラスパスにアクセスするためにそれらを設定する簡単な方法を説明しています。

標準のJavaファイルマネージャを設定して、jarファイルについて知る必要があります。これを行うには、コンパイラオプション引数を使用します。

デフォルトでは、Javaコンパイラオブジェクトは、クラスパスの観点から、bootclasspath、extdirs、およびendorseddirsディレクトリのデフォルトの場所のみを認識しているようです。

呼び出し側プログラムの現在のクラスパスをJavaコンパイラインスタンスに追加する必要があります。これは標準のファイルマネージャに渡され、jar内のクラスが検索されます。ファイル。

これが私がそれを行う方法です 私が書いたコンパイララッパー

List<String> optionList = new ArrayList<String>();
// set compiler's classpath to be same as the runtime's
optionList.addAll(Arrays.asList("-classpath",System.getProperty("Java.class.path")));

// any other options you want
optionList.addAll(Arrays.asList(options));

JavaCompiler.CompilationTask task = compiler.getTask(out,jfm,diagnostics,optionList,null,jfos);

必要なのは、呼び出し元のプログラムを実行するときに適切なクラスパスを設定することだけです。

40
Pascal Thivent

最近、同じ問題が発生しましたが、最終的に2つの回避策が見つかりました。ここに投稿された最初の回答が示すように、invoke StandardJavaFileManager.setLocation(StandardLocation.CLASS_PATH、 "YOUR_CLASS_PATH")またはCompiler.getTask(ARG_0、ARG_1、ARG_2、CLASS_PATH_OPTIONSのいずれかによってクラスパスを設定できます。

4
Wenlin.Wu