Whenever I get a ClassNotFoundException error in Java, I think to myself “but it is there!” and then I correct the typo in the classpath or get angry at Eclipse for messing up my classpath. Lately I have programmed in more complex settings where it was not always clear to me where the application gets the classpath from, so I wanted to check which of my libraries actually end up on the classpath. Turns out it is not very complicated. Here is code to print a number of useful things:
System.out.println("Working directory: " + Paths.get(".").toAbsolutePath().normalize().toString()); System.out.println("Classpath: " + System.getProperty("java.class.path")); System.out.println("Library path: " + System.getProperty("java.library.path")); System.out.println("java.ext.dirs: " + System.getProperty("java.ext.dirs"));
The current working directory is the starting point for all relative paths, e.g., for reading and writing files. The normalization of the path makes it a bit more readable, but is not necessary. The class
Paths is from the package
java.nio.file.Paths. The classpath is the place where Java looks for (bytecode for) classes. The entries should be folders or jar-files. The Java library path is where Java looks for native libraries, e.g., platform dependent things. You can of course access other environment variables with the same method, but I cannot at the moment think of a useful example.
Related (at least related enough to put it into the same post), this is how you can print the space used and available on the JVM heap:
int mbfactor = 1024*1024; System.out.println("Memory free/used/total/max " + Runtime.getRuntime().freeMemory()/mbfactor + "/" + (Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory())/mbfactor + "/" + Runtime.getRuntime().totalMemory()/mbfactor + "/" + Runtime.getRuntime().maxMemory()/mbfactor + " MB" );