javaを使用してStringでいくつかのJavaクラスをコンパイルしようとしています。 私は、javax.tools.JavaCompilerを使用してString内のClassesをコンパイルしました。javax.tools.JavaCompilerを使用して循環依存クラスをコンパイル
私はSimpleJavaFileObjectで作られているサブクラスによってSimpleJavaFileObjectのインスタンスを作ってきました。
import javax.tools.SimpleJavaFileObject;
import java.net.URI;
public class JavaSourceFromString extends SimpleJavaFileObject {
final String code;
public JavaSourceFromString(String name, String code) {
super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension),Kind.SOURCE);
this.code = code;
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return code;
}
}
、私はこのクラスのインスタンスを作ったが、その後、ArrayListにこれを追加しました)(
ToolProvider.SystemJavaCompilerを得ました。
して、コメントを追加コンパイルオプション。コンパイル
Iterable<? extends JavaFileObject> fileObjects = jsfsList;
JavaCompiler jc = ToolProvider.getSystemJavaCompiler();
if (jc == null) throw new Exception("Compiler unavailable");
List<String> options = new ArrayList<>();
options.add("-d");
options.add(Config.getProperty("DESTINATION_PATH"));
options.add("-classpath");
URLClassLoader urlClassLoader = (URLClassLoader)Thread.currentThread().getContextClassLoader();
StringBuilder sb = new StringBuilder();
for (URL url : urlClassLoader.getURLs()) {
sb.append(url.getFile()).append(File.pathSeparator);
}
sb.append(PiranhaConfig.getProperty("DESTINATION_PATH"));
options.add(sb.toString());
StringWriter output = new StringWriter();
boolean success = jc.getTask(output, null, null, options, null, fileObjects).call();
if (success) {
LOG.info("Class [" + compiledClasses + "] has been successfully compiled");
} else {
throw new Exception("Compilation failed :" + output);
}
これは、循環依存性を持つ3つのクラスでテストしました。それは参照のシンボルを見つけることができないというエラーを出します。 javacとは異なり、このコンパイラはリスト内の各項目を個別に調べて、それぞれを単独でコンパイルしようとします。
このコンパイラを使用してJavacと同じ結果を達成する方法は? 誰かが正しい方向に私を指摘してください:) ありがとう。
またこれら3つのテストクラスは3種類のパッケージ:) –
円形の相互依存関係パッケージ間が最初の場所でこのような良いアイデアではありませんフォーム... –
あることに注意して働くリンクリストと
私は質問が合理的に面白いと思うが、私はそれを閉じるよう投票した: "デバッグの助けを求める質問("なぜこのコードは動作しないの? ")は、必要な動作、特定の問題またはエラー、明確な問題文がない質問は、他の読者にとっては役に立たない。[最小限で完全で検証可能な例を作成する方法](http://stackoverflow.com/help/mcve)を参照してください。 " a)コンパイルできます。b)問題を再現します。c)見つかった特定のエラーが含まれています。 –