Исключение Null Pointer при использовании Java Compiler API

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. Может кто-нибудь сказать мне, что не так с кодом

Ответ 1

Я подозреваю, что вы столкнулись с этой проблемой - запуск кода с помощью JRE вместо JDK.

Когда вы запустите SimpleCompileTest, попробуйте явно указать версию java.exe, которую вы используете, как таковой в вашем каталоге JDK.

Ответ 2

Я получил ту же ошибку. Может быть, я слишком поздно, чтобы ответить на этот вопрос, но я разделяю свой собственный опыт, это может помочь кому-то еще столкнуться с той же проблемой в будущем. Я играл с исходным кодом в Скомпилировать файлы 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.

Ответ 4

У меня была та же проблема

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 и проектов. Это помогло мне избавиться от нулевой надежды, и эта помощь вам тоже понравится. Сложная компиляция...: -)

Ответ 5

Работает с Java-приложением, в том числе tools.jar, но для веб-приложения не работает. Бросок Nullpointer

Ответ 6

ДОПОЛНЕНИЕ: Ответ выше - установить в системе свойство java.home. Это тоже работает для меня, но это не очень общее решение, так как вы жестко закодированы для одной версии jdk. Альтернативой, которую я сейчас использую, является предоставление полного пути к "java" в командной строке при запуске программы. Например (в соответствии с приведенными выше примерами):

C:\\Program Files\Java\jdk1.7.0_02\jre\bin\java -cp ..\classes path.to.program.myProgram

Предоставление полного пути к версии jdk означает, что версия, которая запускает программу, так, что тот, который будет извлечен с помощью ToolProvider.getSystemJavaCompiler();