0

複数のソース ファイル ( .java) をコンパイルし、対応するクラス ファイル ( .class) を実行時に生成する必要があるアプリケーションで作業している場合、これはアプリケーションの起動時に発生します。

現在、クラス生成に以下のコードを使用しています:

int errorCode = com.sun.tools.javac.Main.compile(new String[] {
        "-cp", classPath,
        "-d", pOutputPath,
        srcFile.getAbsolutePath() },new PrintWriter(out));

すべての *.java ファイルは、1 つのメソッドを含む約 40 行のコードではありません。ただし、上記のコードのコンパイルにかかる時間は、ファイルごとに約2 秒です。

アプリケーションには 1000 個以上、場合によっては 2000 個以上の Java ファイルがあります。そのため、アプリケーションの起動時間が 2000 秒または 4000 秒を超えるのは望ましくありません。

に代わるものはありcom.sun.tools.javac.Main.compileますか?

または、ランタイム コンパイルとクラス ファイル生成のためのより良い方法またはより高速な方法はありますか?

シングルスレッド環境のため、マルチスレッドは使えません。

4

3 に答える 3

0

最近、同様のケースで ToolProvider を使用しました。javax.tools.ToolProvider.getSystemJavaCompiler()

例:

protected static boolean compileFiles(List<String> additionalOptions,ArrayList<String> sources){
  JavaCompiler compiler=ToolProvider.getSystemJavaCompiler();
  if (compiler == null)   return false;
  StandardJavaFileManager fileManager=compiler.getStandardFileManager(null,null,null);
  List<String> options=new ArrayList<String>();
  options.add("-d");
  options.add(getOutBuildDir().getAbsolutePath());
  options.add("-s");
  options.add(getOutSrcDir().getAbsolutePath());
  options.add("-verbose");
  if (additionalOptions != null)   options.addAll(additionalOptions);
  Iterable<? extends JavaFileObject> compilationUnits=fileManager.getJavaFileObjectsFromStrings(sources);
  CompilationTask task=compiler.getTask(mOutputWriter,fileManager,null,options,null,compilationUnits);
  return task.call();
}

ここから: http://www.programcreek.com/java-api-examples/javax.tools.ToolProvider

実行時にコンパイルするもう 1 つの方法は、JIMCy ライブラリ ( https://github.com/Krever/JIMCy )などを使用したインメモリ コンパイルです。実際には Scala で書かれていますが、Java API があります。

于 2015-11-06T06:26:38.233 に答える