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