zoukankan      html  css  js  c++  java
  • 为什么你的程序配了classpath还是找不到类

    classpath简介

    classpath是java程序时拥有的一个系统变量,这个变量可以通过如下方式获取

    System.out.println(System.getProperty("java.class.path"));
    

    为什么classpath设置了就是找不到类

    1.首先,classpath只和应用程序类加载器有关,如果发生了class not found exception,首先确认是否异常出自哪个类加载器,出自哪个类加载器说明jvm使用哪个类加载器尝试加载的

    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)
    

    如以上异常栈说明异常出自应用程序类加载器

    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或是my_jars/*,如果仅含有my_jars,是不会从目录下的jar包加载类的

    3.正确设置classpath的方式
    1.目标类是存在.class文件中,将其所在目录的添加到classpath,这里需要注意目录和包名对应。
    2.目标类是存在jar包文件中,将该jar包的文件名或是所在目录+"/*"添加到classpath
    3.目录+"/ *"只对从jar/zip包中加载有效,如果要某个目录下的.class文件中加载类,使用目录+"/ *"的方式,加载器会抛class not found异常。

    classpath与类加载器的关系

    我们都知道classpath与类加载有关,这究竟体现在哪里呢?我们知道在java中类加载的工作是通过类加载器完成的,当jvm启动后,除了自带的内建类加载器外,还会创建一个扩展类加载器和应用程序类加载器,这个过程在sun.misc.Launcher源码中有体现。当应用程序类加载器创建好后,会作为系统默认的类加载器,具体在 类加载器文中详细说明。
    这个类加载器会读取这个系统变量,并将其作为查找路径。

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

    如何设置classpath这个变量

    1. 执行java时指定 -cp参数
    2. 未指定-cp参数时,java会读取环境变量,这个变量的设置方式和操作系统有关,在linux/unix环境下,通过export CLASSPATH="xxx"方式可以执行,如果操作系统中没有配置这个环境变量,则默认为".",即当前目录。
      通过man java验证
  • 相关阅读:
    机器学习之朴素贝叶斯法
    机器学习之支持向量机(Support Vector Machine)
    梯度下降(Gradient Descent)
    Error #include nested too deeply
    error while loading shared libraries: libXXX.so.x: cannot open shared object file: No such file or directory .
    ubuntu su Authentication failure
    Log4cplus使用
    passing ‘const ’ as ‘this’ argument of ‘’ discards qualifiers 错误处理
    select()函数 timval问题
    ICE——1.Printer
  • 原文地址:https://www.cnblogs.com/lshao/p/12600837.html
Copyright © 2011-2022 走看看