java - 代码适用于命令行,但不适用于 Eclipse(从字符串编译类...)

标签 java eclipse compiler-construction

所以我得到了这段代码,它从一个字符串编译一个类,然后运行它。它在命令行中工作正常,但在 eclipse 中却不行...

import java.lang.reflect.Method;
import java.util.Arrays;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.ToolProvider;

public class Another2 {

    public static void main(String args[]) throws Exception {
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
        String temp = "public class ByeWorld {\n" + "  public static void main(String args[]) {"
                + " System.out.println(\"First of our Compiled Class\");}}";
        JavaFileObject file = new JavaSourceFromString("ByeWorld", temp);
        Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(file);
        CompilationTask task = compiler.getTask(null, null, diagnostics, null, null, compilationUnits);
        task.call();
        ClassLoader classLoader = Another2.class.getClassLoader();
        Class<?> myclass = classLoader.loadClass("ByeWorld");
        Method mymethod = myclass.getDeclaredMethod("main", new Class[] { String[].class });
        mymethod.invoke(null, new Object[] { null });
    }
}

在命令行中我得到:

$ javac Another2.java 
$ java Another2
First of our Compiled Class

但是在 eclipse 中我得到:

Exception in thread "main" java.lang.ClassNotFoundException: ByeWorld
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at Another2.main(Another2.java:21)

是否有许可盟友在进行?它是永久性的吗?我的修复方法是什么?

最佳答案

我敢打赌文件所在的目录和它要从中加载类的目录是不同的。所以本质上这是一个工作目录/类路径问题。请记住,Eclipse 试图让事情变得更简单,它不会期望在当前工作目录中查找 .class 文件。

尝试对文件应该去哪里和从哪里加载进行硬编码,看看是否会有所改变。我怀疑会,但不能确定。

关于java - 代码适用于命令行,但不适用于 Eclipse(从字符串编译类...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8596847/

相关文章:

c - 认为没有比 C 更快的高级语言实现是一种误解吗?

c++ - C++ 中的模板类

java - 这种递归方法有什么问题呢? (java)

java - 如何自定义 JPanel 在 Jpanel 中的位置

java - 将 HTML 文件解析为 DOM 树以进行提取 (Java)

eclipse - {@inheritDoc} 不继承 Eclipse 中的父类(super class) javadoc

java - 在语句中使用 sql 变量时突然出现 SQL 异常

java - 无法在 eclipse (java) 中创建 ServerSocket

java - 创建Android项目时Eclipse出现一堆错误

java - GWT 即时编译