使用javax.tools.JavaCompiler编译循环依赖类

Bhanuka Yd

我一直在尝试使用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相同的结果?有人请指出正确的方向:)谢谢。

Bhanuka Yd

我找到了解决问题的方法,

在编译过程中,我制作了一个ArrayList来保存SimpleJavaFileObject(要编译的类)实例,相反,我添加了LinkedList。

与链接列表,它可以正常工作:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用javax.tools.JavaCompiler编译源代码时如何设置类路径?

使用javax.tools.JavaCompiler在内存中完全编译代码

javax.tools是否依赖JDK?

使用javax.tools在运行时编译Java源代码?

javax.tools编译器生成jar

如何在不使用JDK的情况下从tools.jar使用JavaCompiler

如何使用Haxe引用javax类?

如何使用JavaCompiler.getTask()的“类”参数?

使用Maven编译范围时jar中缺少依赖类

使用java -jar将spring.boot与tools.jar作为依赖项运行

使用javax.tool进行级联内存编译

使用引用的 C++ 类中的循环依赖项

使用javax包类将列表数据转换为Json

您需要使用JDK运行构建或在类路径上具有tools.jar

使用JavaCompiler和ClassLoader编译和运行用户代码

如何使用JavaCompiler获取编译错误消息

Java JavaCompiler.run() 也编译匿名类

处理“ javax / xml / parsers / DocumentBuilder.class”时遇到麻烦:核心类(java。*或javax。*)的不良使用或错误使用

如何使用不带标题的共享基类解决循环类依赖关系?

如何在使用 g++ 和 gcc 编译 obj 文件的 Makefile 中避免循环依赖?

在Spring 3.0.3中使用Velocity Tools

如何使用graphql-tools调用查询

使用 Gradle 进行 Hibernate Tools 逆向工程

使用Redux Dev Tools扩展和Typescript

使用OR-Tools表达多变量约束

将React Dev Tools与Preact结合使用

使用 Ajax 发布 Prestashop 表单 - Tools::getValue()

如何使用React Developer Tools单击按钮?

如何使用Gradle在Java / Android中正确处理类依赖关系以利用增量编译?