-1

在内存中,我构建了这个字符串:

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 的项目中有类produce.Producer,它就可以工作。(我不需要在选项中指定类路径)现在的问题是:如何正确指定类路径,以便内存中的代码可以访问外部类?

如果我将 -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() 并且我得到了关于未解析包的相同错误。

4

1 回答 1

0

这应该有效(如果您将 String 中的反斜杠加倍,我假设您这样做了,因为您会在调用编译器的代码中遇到编译错误)。

尝试添加-verbose到编译器选项以查看它尝试访问的文件。

[编辑]作为接下来的步骤:

  1. 尝试从命令行运行编译器。
  2. 如果这不起作用,请获取源代码并尝试对其进行调试。将类路径传递给编译器可能有问题。
  3. 我有点担心源文件的路径(\Consumer.java)。将此虚拟文件传递给编译器时,请尝试创建正确的包路径。
于 2013-09-06T12:51:11.183 回答