11

MyClass.java:

package test;
public class MyClass {
    public void myMethod(){
        System.out.println("My Method Called");
    }
}

Listing for SimpleCompileTest.java that compiles the MyClass.java file.

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");
        }
    }
}

I am executing the SimpleCompileTest class and getting a NullPointerException. The ToolProvider.getSystemJavaCompiler() is returning null. Can someone tell me what is wrong with the code

Paŭlo Ebermann
  • 73,284
  • 20
  • 146
  • 210
java_geek
  • 17,585
  • 30
  • 91
  • 113

6 Answers6

18

I got the same error. Maybe I am too late to answer this question, but I share my own experiences, it might help someone else facing the same issue in the future. I was playing around with the source code at Compile Java Files At Runtime.

I was getting java.lang.NullPointerException as it is mentioned. I printed out the Java home directory with System.out.println(System.getProperty("java.home"));, and noticed my Eclipse was pointing to "C:\Program Files\Java\jre7" even after I changed my preferences to use JDK1.7 instead of JRE1.7.

I found a workaround by forcing the usage of JDK1.7 by setting system property like this:

System.setProperty("java.home", "C:\\Program Files\\Java\\jdk1.7.0_02");

Then I compiled my program and did not get any NullPointerException.

Sk8erPeter
  • 6,899
  • 9
  • 48
  • 67
rashid
  • 264
  • 2
  • 13
  • You are great dear. you have solved my problem of last 3 weeks. thanks – adeel iqbal Feb 20 '13 at 13:24
  • I tried this to make [compilation-toolkit](https://code.google.com/p/compilation-toolbox/) work. I had to use `System.setProperty("java.home", "C:\\Program Files\\Java\\jdk1.7.0_02\jre");` to make it work. – Sebastian Graf Nov 22 '13 at 21:01
16

I suspect you're running into this problem - running the code with a JRE instead of a JDK.

When you run SimpleCompileTest, try explicitly specifying the version of java.exe you're using as the one in your JDK directory.

Jon Skeet
  • 1,421,763
  • 867
  • 9,128
  • 9,194
  • 1
    How do you explicitly specify the version of Java.exe you're using as the one in your JDK? I tried `Run As` but it already `Project JRE` selected as the JRE – CodyBugstein Jun 16 '14 at 16:09
  • 1
    @Imray: I'm not sure what you're asking - if that's the selected JRE, that's what will run. If you want a different one, select a different JRE. It sounds like you need to ask a new question with your *exact* problem. – Jon Skeet Jun 16 '14 at 16:39
  • 1
    In your answer you say: "When you run SimpleCompileTest, try explicitly specifying the version of java.exe you're using as the one in your JDK directory." I'm asking, how do you do that? – CodyBugstein Jun 16 '14 at 17:15
  • 1
    @Imray: I'm saying that presumably the "Project JRE" you've got configured is simply not the right one. So edit that configuration. – Jon Skeet Jun 16 '14 at 17:17
1

Probably you have a JRE instead of JDK installed. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6477844

stacker
  • 68,052
  • 28
  • 140
  • 210
1

I was having the same problem

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

was returning null. Even after using

System.setProperty("java.home", "C:\\Program Files\\Java\\jdk1.8.0_31");

was returning null.

However the issue was simple as this code is in the Tools.jar found in Java\jdk1.8.0_31\lib if you are using JDK. what i did was to go to project-->properties-->Java Build Path-->order and export--> and moved tool.jar to the top of other JRE and projects. This helped me get rid of null hope this help you as well.Happy compiling...:-)

FazoM
  • 4,777
  • 6
  • 43
  • 61
0

SUPPLEMENT: The answer above is to set the java.home system property within the program. That works for me too, but it's not a very general solution, since you've hard-coded for one jdk version. The alternative that I'm using now is to give the full path to "java" on the command line when I run the program. Such as (consistent with examples above):

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

Giving the full path to the jdk version means that's the version that's running the program, so that's the one that will be fetched with ToolProvider.getSystemJavaCompiler();

Roger F. Gay
  • 1,830
  • 2
  • 20
  • 25
0

Its working with Java application by expicitily including the tools.jar but for web application not working. Throwing Nullpointer

aswininayak
  • 933
  • 5
  • 22
  • 39