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