Ich habe versucht, einige Java-Klassen in einem String mit Java zu kompilieren. Ich habe javax.tools.JavaCompiler verwendet, um die Klassen in den Strings zu kompilieren.Kompilieren zirkuläre Abhängigkeit Klassen mit javax.tools.JavaCompiler
Ich habe Instanzen von SimpleJavaFileObject von einer Subklasse gemacht, die ich von SimpleJavaFileObject gemacht habe.
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;
}
}
und ich habe Instanzen dieser Klasse gemacht, hat es zu einem Arraylist, dann bekam die
ToolProvider.SystemJavaCompiler();
und hinzugefügte Kompilierungsoptionen. und dann kompiliert
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);
}
Ich habe dies mit 3 Klassen getestet, die Kreisabhängigkeit haben. es gibt den Fehler, dass es das Symbol einer Referenz nicht finden kann. Es scheint, dass dieser Compiler im Gegensatz zu javac jedes Element in der Liste einzeln betrachtet und versucht, jedes einzeln zu kompilieren.
Wie erreiche ich das gleiche Ergebnis wie Javac mit diesem Compiler ?? Jemand bitte zeigen Sie mir in die richtige Richtung :) Danke.
beachten Sie auch, dass diese drei Testklassen Form 3 verschiedene Pakete sind :) –
Kreis Abhängigkeiten zwischen den Paketen sind nicht so eine gute Idee, in erster Linie ... –
Obwohl ich denke, dass die Frage einigermaßen interessant ist, habe ich beschlossen, sie zu schließen: "Fragen, die Debugging-Hilfe suchen (" Warum funktioniert dieser Code nicht? ") Müssen das gewünschte Verhalten, ein spezifisches Problem oder einen Fehler und den kürzesten erforderlichen Code enthalten um es in der Frage selbst zu reproduzieren. Fragen ohne eine klare Problembeschreibung sind für andere Leser nicht nützlich. Siehe: [Wie man ein minimales, vollständiges und überprüfbares Beispiel erstellt] (http://stackoverflow.com/help/mcve). " Können Sie Ihr Beispiel aktualisieren, so dass a) wir es kompilieren können, b) es das Problem reproduziert, c) es spezifische Fehler enthält, die Sie gefunden haben. –