MyClass.java:
package test;
public class MyClass {
public void myMethod(){
System.out.println("My Method Called");
}
}
列出编译MyClass.java文件的SimpleCompileTest.java。
SimpleCompileTest.java:
package test;
import javax.tools.*;
public class SimpleCompileTest {
public static void main(String[] args) {
String fileToCompile = "test" + java.io.File.separator +"MyClass.java";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int compilationResult = compiler.run(null, null, null, fileToCompile);
if(compilationResult == 0){
System.out.println("Compilation is successful");
}else{
System.out.println("Compilation Failed");
}
}
}
我正在执行SimpleCompileTest类并获得NullPointerException。 ToolProvider.getSystemJavaCompiler()返回null。有人能告诉我代码有什么问题吗
答案 0 :(得分:17)
我得到了同样的错误。也许我来不及回答这个问题,但我分享了自己的经验,这可能有助于其他人在未来面对同样的问题。我正在使用Compile Java Files At Runtime的源代码。
我提到了java.lang.NullPointerException
。我用System.out.println(System.getProperty("java.home"));
打印出Java主目录,并注意到我的Eclipse指向“C:\Program Files\Java\jre7
”,即使我改变了我的首选项以使用JDK1.7而不是JRE1.7。
我通过设置系统属性强制使用JDK1.7找到了一种解决方法:
System.setProperty("java.home", "C:\\Program Files\\Java\\jdk1.7.0_02");
然后我编译了我的程序,但没有得到任何NullPointerException
。
答案 1 :(得分:16)
我怀疑你遇到了this problem - 使用JRE而不是JDK运行代码。
运行SimpleCompileTest
时,请尝试显式指定您正在使用的java.exe版本作为JDK目录中的版本。
答案 2 :(得分:1)
可能你安装了JRE而不是JDK。 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6477844
答案 3 :(得分:1)
我遇到了同样的问题
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
返回null。即使使用
System.setProperty("java.home", "C:\\Program Files\\Java\\jdk1.8.0_31");
返回null。
但问题很简单,因为如果您使用的是JDK,此代码位于Tools.jar
Java\jdk1.8.0_31\lib
中。我做的是去project-->properties-->Java Build Path-->order and export-->
并将tool.jar
移到其他JRE和项目的顶部。
这帮助我摆脱了无望的希望,这也有助于你。快乐的编译......: - )
答案 4 :(得分:0)
它通过expicitily包括tools.jar来处理Java应用程序,但是Web应用程序无法正常工作。投掷Nullpointer
答案 5 :(得分:0)
补充:上面的答案是在程序中设置java.home系统属性。这对我也有用,但它不是一个非常通用的解决方案,因为你已经为一个jdk版本进行了硬编码。我现在使用的替代方案是提供" java"的完整路径。在我运行程序时在命令行上。如(与上述例子一致):
C:\\Program Files\Java\jdk1.7.0_02\jre\bin\java -cp ..\classes path.to.program.myProgram
提供jdk版本的完整路径意味着运行该程序的版本,因此将使用ToolProvider.getSystemJavaCompiler();