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.
- NetBeans version
- 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.
- Test.java
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…;-)