Код работает в командной строке, но не в затмении (компиляция класса из строки ...) - PullRequest
3 голосов
/ 22 декабря 2011

Итак, у меня есть этот код, который компилирует класс из строки и затем запускает его.Он отлично работает из командной строки, но не в 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)

Что-то разрешено?это постоянно?И какой у меня подход к исправлению?

Ответы [ 3 ]

1 голос
/ 22 декабря 2011

Программа работала для меня в Eclipse, когда я добавил корневую папку проекта в качестве «папки внешнего класса» в Java Build Path.

Например, скажем, мой проект находится в "C: \ EclipseWS \ MyProject". Перейдите в «Свойства проекта», затем «Путь сборки Java», затем на вкладку «Библиотеки» и нажмите кнопку «Добавить папку внешних классов». Перейдите к «C: \ EclipseWS \ MyProject», затем нажмите «ОК».

1 голос
/ 22 декабря 2011

У меня были эти проблемы ранее. Способ, который я исправил, просто создал проект в Eclipse. Затем создал все классы и пакет с точно таким же именем в Eclipse. Затем скопируйте и вставьте код из старого файла в новый класс Eclipse.

1 голос
/ 22 декабря 2011

Могу поспорить, каталог, в который входит файл, и каталог, из которого он ищет классы, отличаются.По сути, это проблема рабочего каталога / classpath.Помните, что Eclipse пытается упростить ситуацию, и он не будет ожидать, что в текущем рабочем каталоге будет найден файл .class.

Попробуйте жестко запрограммировать, куда файлы должны идти, загружаться и видетьесли это изменит вещи.Я подозреваю, что так и будет, но не уверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...