After reinstalling my laptop with Ubuntu Natty, I had an issue with one of my custom built tools. I have this tool that installs a Tomcat-based web application and server. In the part that compiles the JSON library, I received a NullPointerException.
On further examination, I found that ToolProvider.getSystemJavaCompiler() was returning null for some reason. I found the answer on IBM DeveloperWorks:
The
ToolProvider.getSystemJavaCompiler()
method can returnnull
if tools.jar is not in the application’s classpath. TheCharStringCompiler
class detects this possible configuration problem and throws an exception with a recommendation for fixing the problem. Note that Sun’s licensing allows tools.jar to be redistributed with the JRE.
What I found was that I was using a JRE instead of a JDK installation. Of course, when I switch the Java Home to my JDK, I had some other error and the App wouldn’t even run. So, I added the tools.jar from the JDK installation to the classpath and ran it with the JRE, and everything worked fine.
So, here is the code I use to compile (including the catch for the missing tools.jar):
//compile JavaCompiler jc = ToolProvider.getSystemJavaCompiler(); // handle issue where tools.jar is not on the classpath if(jc == null) { log.logException(new InstallException("Could not access the system Java compiler -- check to make sure tools.jar is on the class path.")); return; } StandardJavaFileManager fm = jc.getStandardFileManager(null, null, null); File compilePath = new File(unzipPath, "org/json"); Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(compilePath.listFiles()); for(JavaFileObject f : files) { log.logInformation("Compiling - " + f.getName()); } CompilationTask task = jc.getTask(log.getStream(), fm, null, null, null, files); try { fm.close(); } catch (IOException e) { log.logException(new InstallException("Could not unzip " + zipPath, e)); } boolean result = task.call(); log.logInformation("**Compile result = " + result);
Resources
IBM DeveloperWorks: Create dynamic applications with javax.tools