【问题标题】:The Java Compiler API does not work I keep getting unable to resolve class javax.tools.JavaCompilerTool and other similar onesJava Compiler API 不起作用我一直无法解析类 javax.tools.JavaCompilerTool 和其他类似的类
【发布时间】:2011-08-03 17:01:02
【问题描述】:

我读到 Java 6 有一个编译器 api,它允许您从其他 java 代码编译 java 文件。但是,每当我尝试导入任何此类(例如 javax.tools.JavaCompilerTool)时,我都会得到一个

unable to resolve class javax.tools.JavaCompilerTool

我在jdk1.6.0_26安装目录下的所有jar文件中查找,在javax.tools包中的任何jar文件中都没有引用JavaCompilerTool。

我的理解是这个功能在 1.6 JDK 中。我正在使用 \bin 目录而不是 \jre\bin 目录中的 java.exe 运行我的应用程序,但无论如何都不起作用。

我错过了什么?怎么找不到类。

【问题讨论】:

  • 这是编译时错误还是运行时错误? (我不承认它是来自 Oracle 的编译时版本)。如果是运行时,你究竟是如何运行它的?作为 servletcontainer 上的 webapp 还是什么?如果是这样,您确定 servletcontainer 使用的是 JDK 的 JRE?
  • 我从命令行运行它(Windows 7 64 位下的 .bat 文件)。该错误是运行时错误。我启动一个 java 应用程序,然后启动一个 GroovyScriptEngine,它运行一个 groovy 文件,然后尝试导入 JavaCompilerTool。我确定我使用的是 JDK 的 java.exe,但是如果从 groovy 脚本中打印 System.getProperty("java.home") 它指向 \jre\bin 目录。不过,我不确定这是否是可靠的检查。
  • 如果我改为将导入放在主 java 文件中(甚至在 groovy 启动之前,我在导入 javax.tools.JavaCompilerTool; 时得到一个“找不到符号”。所以同样的问题
  • 查看我对以下答案的回复。您确定该路径必须反映 jdk\bin 目录吗?它似乎在没有被反映的情况下工作,我确定我指向 jdk\bin\java.exe 文件,因为我正在从 .bat 文件运行

标签: java compiler-construction compilation


【解决方案1】:

您需要使用javax.tools.JavaCompiler 类。看看javadocs的用法。

例子:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(new File("HelloWorld.java")));
compiler.getTask(null, fileManager, null, null, null, compilationUnits).call();
fileManager.close();

【讨论】:

  • 我还没有机会完全尝试这个解决方案,但是为 import javax.tools.JavaCompiler 添加了导入;导入 javax.tools.ToolProvider;导入 javax.tools.StandardJavaFileManager;不要在运行时中断,所以我在谷歌上找到的所有示例都一定是错误的。当我有机会时,我将需要尝试您的代码,但它看起来很有希望。谢谢。
  • 转而查看 Javadocs 或 Stackoverflow.com :) 参见例如 stackoverflow.com/questions/2946338/…
  • 好的,我尝试了您的代码,它从我的 Java 文件中生成了一个 .class 文件。我称之为成功。感谢您的帮助。
【解决方案2】:

我在我的 JDK 6 rt.jar 中看到了 javax.tools.JavaCompiler。也许你的类名不正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多