我一直在尝试使用Java在字符串中编译一些Java类。我使用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相同的结果?有人请指出正确的方向:)谢谢。
我找到了解决问题的方法,
在编译过程中,我制作了一个ArrayList来保存SimpleJavaFileObject(要编译的类)实例,相反,我添加了LinkedList。
与链接列表,它可以正常工作:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句