java - 从内存编译 java 类失败,并且在 cmd 和 netbean ide 中输出两个不同的错误

标签 java

我正在尝试运行 java 类而不保存到文件,为此我使用 javax.tools.JavaCompiler

在这里我找到了一个answer on so question about java memory compile .

但是当我运行此代码时,我得到了两个不同的输出。ide 和 cmd 中的 java 版本是 1.8.0_31 这是 netbeans IDE version-8.0.2

enter image description here

这是第 50 行

Class.forName("HelloWorld").getDeclaredMethod("main", new Class[]{String[].class})

这是cmd输出

enter image description here

第 33 行是

CompilationTask task = compiler.getTask(null, null, diagnostics, null, null, compilationUnits);

我想知道获得两个不同输出的原因。

这是我使用的代码。这与上面答案的代码几乎相同。但是我将多个 catch block 删除为一个。

import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.util.Arrays;
import javax.tools.Diagnostic;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.ToolProvider;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject.Kind;

public class CompileSourceInMemory {

    public static void main(String args[]) throws IOException {
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();

        StringWriter writer = new StringWriter();
        PrintWriter out = new PrintWriter(writer);
        out.println("public class HelloWorld {");
        out.println("  public static void main(String args[]) {");
        out.println("    System.out.println(\"This is in another java file\");");
        out.println("  }");
        out.println("}");
        out.close();
        JavaFileObject file = new JavaSourceFromString("HelloWorld", writer.toString());

        Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(file);
        CompilationTask task = compiler.getTask(null, null, diagnostics, null, null, compilationUnits);

        boolean success = task.call();
        for (Diagnostic diagnostic : diagnostics.getDiagnostics()) {
            System.out.println(diagnostic.getCode());
            System.out.println(diagnostic.getKind());
            System.out.println(diagnostic.getPosition());
            System.out.println(diagnostic.getStartPosition());
            System.out.println(diagnostic.getEndPosition());
            System.out.println(diagnostic.getSource());
            System.out.println(diagnostic.getMessage(null));

        }
        System.out.println("Success: " + success);

        if (success) {
            try {
                Class.forName("HelloWorld").getDeclaredMethod("main", new Class[]{String[].class})
                        .invoke(null, new Object[]{null});
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

class JavaSourceFromString extends SimpleJavaFileObject {

    final String code;

    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;
    }
}

谢谢。

最佳答案

我无法重现您的第一个错误:

$ ~/jdk1.8.0_25/bin/java CompileSourceInMemory
Success: true
This is in another java file

尝试找出在您的情况下从终端或命令行调用了哪个 java。 第二个问题与 NetBeans/compiler 输出编译类的位置有关。它是项目的根目录,因此类路径需要调整:

if (success) {
  try {
    URL[] classpathExt = {new File("/home/[your name]/NetBeansProjects/JavaApplication2/").toURI().toURL()};
    URLClassLoader loader = new URLClassLoader(classpathExt, null);
    Class.forName("HelloWorld", true, loader).getDeclaredMethod("main", new Class[]{String[].class})
        .invoke(null, new Object[]{null});
  } catch (Exception e) {
    e.printStackTrace();
  }
}

有趣的是 ~/NetBeansProjects/JavaApplication2/ 不起作用,必须指定完整路径。对于 Windows,您将使用 C:\\User\\and soy\\

关于java - 从内存编译 java 类失败,并且在 cmd 和 netbean ide 中输出两个不同的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31315567/

相关文章:

java - Intellij 断点不停止

JAVA Action 执行不工作

java - 在 Jupyter Notebook 中查看或打印 JavaDoc?

java - java代码执行中的多个main()

java - FragmentPagerAdapter 在重新选择时返回半中断 View

java - 在驱动程序中调用算法方法之前,我应该在哪里设置算法?

java - 在 Jenkins 中为 Java 11 指定 JAVA_HOME

java - 如何使用 docx4j 将多行添加到表中

windows vscode终端中的javac Foo.java && java Foo不工作

Java++运算符