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