代码可以在命令行上运行,但不能在 Eclipse 中运行(从字符串编译类...)

问题描述 投票:0回答:3

所以我得到了这段代码,它从字符串编译一个类,然后运行它。它在命令行中运行良好,但在 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

但是在日食中我得到:

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)

有什么需要许可的事情吗?它是永久性的吗?我的修复方法是什么?

java eclipse
3个回答
1
投票

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

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


1
投票

当我将根项目文件夹添加为 Java 构建路径中的“外部类文件夹”时,程序在 Eclipse 中为我工作。

例如,假设我的项目位于“C:\EclipseWS\MyProject”。 转到“项目属性”,然后转到“Java 构建路径”,然后转到“库”选项卡,然后单击“添加外部类文件夹”按钮。导航到“C:\EclipseWS\MyProject”,然后单击“确定”。


1
投票

我之前也遇到过这个问题。我修复的方法就是在 Eclipse 中创建一个项目。然后在 eclipse 中创建具有完全相同名称的所有类和包。然后将旧文件中的代码复制并粘贴到新的 Eclipse 类中。

© www.soinside.com 2019 - 2024. All rights reserved.