classpath是java程序时拥有的一个系统变量,这个变量能够经过以下方式获取html
System.out.println(System.getProperty("java.class.path"));
1.首先,classpath只和应用程序类加载器有关,若是发生了class not found exception,首先确认是否异常出自哪一个类加载器,出自哪一个类加载器说明jvm使用哪一个类加载器尝试加载的java
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
如以上异常栈说明异常出自应用程序类加载器linux
2.当确认来自应用程序类加载器,须要确认classpath中是否包含目标类。
关于classpath的说明能够参考官方文档,https://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.html
个人经验总结是:若是目标类文件在某个目录中,classpath应该包含这个目录,若是目标类在某个目录的某个jar包中或是zip包中,好比c.jar存在my_jars目录下,那么classpath应该包含my_jars/c.jar或是jars/*,若是仅含有my_jars,是不会从目录下的jar包加载类的。windows
3.正确设置classpath的方式
1.目标类是存在.class文件中,将其所在目录的添加到classpath,这里须要注意目录和包名对应。
2.目标类是存在jar包文件中,将该jar包的文件名或是所在目录+"/*"添加到classpath
3.目录+"/ *"只对从jar/zip包中加载有效,若是要某个目录下的.class文件中加载类,使用目录+"/ *"的方式,加载器会抛class not found异常。oracle
咱们都知道classpath与类加载有关,这究竟体如今哪里呢?咱们知道在java中类加载的工做是经过类加载器完成的,当jvm启动后,除了自带的内建类加载器外,还会建立一个扩展类加载器和应用程序类加载器,这个过程在sun.misc.Launcher源码中有体现。当应用程序类加载器建立好后,会做为系统默认的类加载器,具体在 类加载器文中详细说明。
这个类加载器会读取这个系统变量,并将其做为查找路径。jvm
public static ClassLoader getAppClassLoader(final ClassLoader var0) throws IOException { final String var1 = System.getProperty("java.class.path"); final File[] var2 = var1 == null ? new File[0] : Launcher.getClassPath(var1); return (ClassLoader)AccessController.doPrivileged(new PrivilegedAction<Launcher.AppClassLoader>() { public Launcher.AppClassLoader run() { URL[] var1x = var1 == null ? new URL[0] : Launcher.pathToURLs(var2); return new Launcher.AppClassLoader(var1x, var0); } }); }