Ответ 1
Я подозреваю, что вы столкнулись с этой проблемой - запуск кода с помощью JRE вместо JDK.
Когда вы запустите SimpleCompileTest
, попробуйте явно указать версию java.exe, которую вы используете, как таковой в вашем каталоге JDK.
MyClass.java:
package test;
public class MyClass {
public void myMethod(){
System.out.println("My Method Called");
}
}
Список для SimpleCompileTest.java, который компилирует файл MyClass.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. Может кто-нибудь сказать мне, что не так с кодом
Я подозреваю, что вы столкнулись с этой проблемой - запуск кода с помощью JRE вместо JDK.
Когда вы запустите SimpleCompileTest
, попробуйте явно указать версию java.exe, которую вы используете, как таковой в вашем каталоге JDK.
Я получил ту же ошибку. Может быть, я слишком поздно, чтобы ответить на этот вопрос, но я разделяю свой собственный опыт, это может помочь кому-то еще столкнуться с той же проблемой в будущем. Я играл с исходным кодом в Скомпилировать файлы Java во время выполнения.
Я получал java.lang.NullPointerException
, как упоминалось. Я распечатал домашний каталог Java с помощью System.out.println(System.getProperty("java.home"));
и заметил, что мой 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
.
Возможно, у вас установлена JRE вместо JDK. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6477844
У меня была та же проблема
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
возвращал значение null. Даже после использования
System.setProperty("java.home", "C:\\Program Files\\Java\\jdk1.8.0_31");
возвращал значение null.
Однако проблема была простой, поскольку этот код находится в Tools.jar
, найденном в Java\jdk1.8.0_31\lib
, если вы используете JDK. я сделал это, чтобы перейти на project-->properties-->Java Build Path-->order and export-->
и переместил tool.jar
в начало других JRE и проектов.
Это помогло мне избавиться от нулевой надежды, и эта помощь вам тоже понравится. Сложная компиляция...: -)
Работает с Java-приложением, в том числе tools.jar, но для веб-приложения не работает. Бросок Nullpointer
ДОПОЛНЕНИЕ: Ответ выше - установить в системе свойство java.home. Это тоже работает для меня, но это не очень общее решение, так как вы жестко закодированы для одной версии jdk. Альтернативой, которую я сейчас использую, является предоставление полного пути к "java" в командной строке при запуске программы. Например (в соответствии с приведенными выше примерами):
C:\\Program Files\Java\jdk1.7.0_02\jre\bin\java -cp ..\classes path.to.program.myProgram
Предоставление полного пути к версии jdk означает, что версия, которая запускает программу, так, что тот, который будет извлечен с помощью ToolProvider.getSystemJavaCompiler();