JavaFX does not work in NetBeans7.4 using JDK7

It is easy to create JavaFX project using NetBeans7.4.
After updating JavaSE7 to 1.7.0_51, JavaFX project has ClassNotFoundException error in NetBeans7.4. It has no compiler errors.
So I just looked into the reason to improve my skill about Java.

  • Compiler error occurs in javac command


Why has JavaFX project been compiled without error in NetBeans7.4

  • Compile time libraries(JavaSE7)

NetBeans adds [javafx.classpath.extension] to the library

  • project.properties

project.properties indicates location of javafx.classpath.extension.

...
javac.classpath=\
    ${javafx.classpath.extension}
...
javafx.classpath.extension=\
    ${platforms.JDK_1.7.home}/jre/lib/jfxrt.jar:\
    ${platforms.JDK_1.7.home}/jre/lib/javaws.jar:\
    ${platforms.JDK_1.7.home}/jre/lib/deploy.jar:\
    ${platforms.JDK_1.7.home}/jre/lib/plugin.jar
  • Compile time libraries(JavaSE8)

NetBeans does not add [javafx.classpath.extension] to the library

The difference between JavaSE7 and JavaSE8.

This code shows how to get the locations of paths.
(Bootstrap classes, Extension classes and User classes)

import java.net.URL;

public class Test {
    public Test() {
        String pathProp = System.getProperty("sun.boot.class.path");
        String[] paths = pathProp.split(":");
        for (String path : paths) {
            System.out.println(String.format("path:%s", path));
        }
        System.out.println("**********");
        String extPathProp = System.getProperty("java.ext.dirs");
        String[] extPaths = extPathProp.split(":");
        for (String path : extPaths) {
            System.out.println(String.format("java.ext.dir:%s", path));
        }
        System.out.println("**********");
        String classPathProp = System.getProperty("java.class.path");
        String[] classPaths = classPathProp.split(":");
        for (String path : classPaths) {
            System.out.println(String.format("class.path:%s", path));
        }
        System.out.println("**********");
        ClassLoader loader = getClass().getClassLoader();
        URL url = loader.getResource("javafx/application/Application.class");
        System.out.println(String.format("Application URL:%s", url.toString()));
    }
    public static void main(String... args) {
        new Test();
    }
}
  • The result(JavaSE7)
path:/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/resources.jar
path:/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/rt.jar
path:/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/sunrsasign.jar
path:/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/jsse.jar
path:/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/jce.jar
path:/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/charsets.jar
path:/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/jfr.jar
path:/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/classes
**********
java.ext.dir:/Users/tomo/Library/Java/Extensions
java.ext.dir:/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/ext
java.ext.dir:/Library/Java/Extensions
java.ext.dir:/Network/Library/Java/Extensions
java.ext.dir:/System/Library/Java/Extensions
java.ext.dir:/usr/lib/java
**********
class.path:.
**********
Exception in thread "main" java.lang.NullPointerException      // <---「javafx.application.Application.class」がloadできない?
	at Test.<init>(Test.java:25)
	at Test.main(Test.java:28)
  • The result(JavaSE8)
path:/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/resources.jar
path:/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/rt.jar
path:/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/sunrsasign.jar
path:/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/jsse.jar
path:/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/jce.jar
path:/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/charsets.jar
path:/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/jfr.jar
path:/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/classes
**********
java.ext.dir:/Users/tomo/Library/Java/Extensions
java.ext.dir:/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/ext
java.ext.dir:/Library/Java/Extensions
java.ext.dir:/Network/Library/Java/Extensions
java.ext.dir:/System/Library/Java/Extensions
java.ext.dir:/usr/lib/java
**********
class.path:.
**********
Application URL:jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/ext/jfxrt.jar!/javafx/application/Application.class
  • The location of jfxrt.jar

JavaSE7 does not include jfxrt.jar in sun.boot.class.path.

version location
JavaSE7 /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib
JavaSE8 /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/ext
  • Using the -classpath option on the command line has no errors
javac -cp /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/jfxrt.jar:. Test.java
java -cp /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/jfxrt.jar:. Test
  • The result

The NullPointerException error resolves.

path:/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/resources.jar
path:/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/rt.jar
path:/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/sunrsasign.jar
path:/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/jsse.jar
path:/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/jce.jar
path:/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/charsets.jar
path:/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/jfr.jar
path:/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/classes
**********
java.ext.dir:/Users/tomo/Library/Java/Extensions
java.ext.dir:/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/ext
java.ext.dir:/Library/Java/Extensions
java.ext.dir:/Network/Library/Java/Extensions
java.ext.dir:/System/Library/Java/Extensions
java.ext.dir:/usr/lib/java
**********
class.path:/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/jfxrt.jar
class.path:.
**********
Application URL:jar:file:/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/jfxrt.jar!/javafx/application/Application.class

The conclusion

It is nothing to say,
I know I have no knowledge about classloader, so I must learn hard about Java.

just keep coding…;-)