2013-09-06 3 views
-1

В памяти я строй этой строки:проходит путь к классам EclipseCompiler

package consume; 
public class Consumer { 
    public void consume(String message){ 
     System.out.println(new produce.Producer().produce(message)); 
    } 
} 

На моей файловой системе я имею C:\Users\hooch\Desktop\produce\Producer.class, построенные из этого источника:

package produce; 
public class Producer { 
    public String produce(String message){ 
     return "THIS IS THE MESSAGE: " + message; 
    } 
} 

Я использую org.eclipse.jdt.internal.compiler.tool.EclipseCompiler и передать эти параметры:

Arrays.asList(new String[] {"-cp", "C:\\Users\\hooch\\Desktop"}); 

Я пытаюсь скомпилировать его, но получить эту ошибку

1. ERROR in \Consumer.java (at line 4) 
    System.out.println(new produce.Producer().produce(message)); 
          ^^^^^^^ 
produce cannot be resolved to a type 

Если у меня есть класс продукции.Производитель внутри проекта, который вызывает EclipseCompiler, он работает. (Тогда мне не нужно указывать путь к классам в параметрах). Теперь возникает вопрос: как правильно указать путь к классам, чтобы код в памяти мог обращаться к внешним классам?

Если добавить -verbose опционам, я получаю

[parsing \Consumer.java - #1/1] 
[reading java/lang/Object.class] 
[reading java/lang/String.class] 
[analyzing \Consumer.java - #1/1] 
[reading java/lang/System.class] 
[reading java/io/PrintStream.class] 
[reading java/io/FilterOutputStream.class] 
[reading java/io/OutputStream.class] 
[reading java/io/Flushable.class] 
[reading java/io/Closeable.class] 
[reading java/lang/AutoCloseable.class] 
---------- 
1. ERROR in \Consumer.java (at line 4) 
    System.out.println(new produce.Producer().produce(message)); 
          ^^^^^^^ 
produce cannot be resolved to a type 
---------- 
[completed \Consumer.java - #1/1] 
[1 unit compiled] 
1 problem (1 error)Exception in thread "main" java.lang.NullPointerException 
    at impl.SimpleTestCompiler.executeCode(SimpleTestCompiler.java:137) 
    at impl.SimpleTestCompiler.main(SimpleTestCompiler.java:155) 

Хорошо, теперь я уверен, что он должен иметь дело с опцией, потому что пути к классам поменялись EclipseCompiler для javax.tools.ToolProvider.getSystemJavaCompiler (), и я получаю ту же ошибку, что пакет не решен.

ответ

0

Это должно работать (если вы удвоите обратную косую черту в строке, которую, как я полагаю, вы сделали, потому что вы получите ошибки компиляции в коде, который вызывает компилятор).

Попробуйте добавить -verbose к параметрам компилятора, чтобы узнать, к каким файлам он пытается получить доступ.

[EDIT] В следующих шагах:

  1. Попытка запустить компилятор из командной строки.
  2. Если это не помогает, получите источники и попытайтесь отладить его. Вероятно, что-то не так с передачей classpath компилятору.
  3. Меня немного беспокоит путь исходного файла (\Consumer.java). Попробуйте создать правильный путь пакета при передаче этого виртуального файла в компилятор.
+0

Это говорит мне, что он читает .. все на пути к системному классу. но как только дело доходит до выпуска пакета, это одно и то же сообщение об ошибке. – hooch

+0

1) Странно, я получаю сообщение об ошибке в парсере. Это вызвано java.lang.ArrayIndexOutOfBoundsException: -1 at org.eclipse.jdt.internal.compiler.parser.Parser.parse (Parser.java:9654) 2) Это займет время 3) Это только имя файла , Я просто передал потребляю. Потребовался он, и он жаловался на публичный класс Consumer, не находящийся в собственном файле. Так что это правильно. (Кроме того, я уже видел, что он работает так, но с пакетом производителя внутри того же проекта) – hooch

+0

Кстати, если вас интересует весь код, я взял его отсюда: http: //blog.nobel-joergensen .com/2008/07/16/using-eclipse-compiler-to-create-dynamic-java-objects-2/ – hooch

Смежные вопросы