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验证

为什么你的程序配了classpath还是找不到类的更多相关文章

  1. 承接微信小程序外包 H5外包就找北京动点软件开发团队

    承接小程序外包 微信小程序外包 H5外包 就找北京动点软件 长年承接微信小程序.微信公众号开发 全职的H5开发团队,开发过几十款微信小程序公众号案例 欢迎来电咨询,索取案例! QQ:372900288 ...

  2. 微信小程序托管 推广 开发 就找北京动点软件

    微信小程序托管 外包 微信小程序外包 H5外包 就找北京动点软件 长年承接微信小程序.微信公众号开发 全职的H5开发团队,开发过几十款微信小程序公众号案例 欢迎来电咨询,索取案例! QQ:372900 ...

  3. 承接小程序外包 微信小程序外包 H5外包 就找北京动点软件

    承接小程序外包 微信小程序外包 H5外包 就找北京动点软件 长年承接微信小程序.微信公众号开发 全职的H5开发团队,开发过几十款微信小程序公众号案例 欢迎来电咨询 QQ:372900288 微信:li ...

  4. IDEA中flink程序报错找不到类

    Idea中运行flink程序,报错找不到类,其中pom文件中一项依赖为: <dependency> <groupId>org.apache.flink</groupId& ...

  5. 在程序出现问题,当找不到错误时,第一时间用try ,catch包括起来

    在程序出现问题,当找不到错误时,第一时间用try ,catch包括起来,把错误找到.

  6. 创建多线程程序的第一种方式_创建Thread类的子类

    创建多线程程序的第一种方式:创建Thread类的子类java.lang.Thread类:是描述线程的类,我们想要实现多线程程序,就必须继承Thread类 实现步骤: 1.创建一个Thread类的子类 ...

  7. 使用kibana可视化报表实时监控你的应用程序,从日志中找出问题,解决问题

    先结果导向,来看我在kibana dashborad中制作的几张监控图. 一:先睹为快 dashboard1:监控几个维度的日志,这么点日志量是因为把无用的清理掉了,而且只接入了部分应用. <1 ...

  8. 用CIL写程序:定义一个叫“慕容小匹夫”的类

    前文回顾: <用CIL写程序:你好,沃尔德> <用CIL写程序:写个函数做加法> 前言: 今天是乙未羊年的第一天,小匹夫先在这里给各位看官拜个年了.不知道各位看官是否和匹夫一样 ...

  9. 编写高质量代码:改善Java程序的151个建议(第3章:类、对象及方法___建议47~51)

    建议47:在equals中使用getClass进行类型判断 本节我们继续讨论覆写equals的问题,这次我们编写一个员工Employee类继承Person类,这很正常,员工也是人嘛,而且在JavaBe ...

随机推荐

  1. RocketMQ 零拷贝

    一.零拷贝原理:Consumer 消费消息过程,使用了零拷贝,零拷贝包含以下两种方式: 1.使用 mmap + write 方式  (RocketMQ选择的方式:因为有小块数据传输的需求,效果会比 s ...

  2. iOS 9,为前端世界都带来了些什么?「译」 - 高棋的博客

    2015 年 9 月,Apple 重磅发布了全新的 iPhone 6s/6s Plus.iPad Pro 与全新的操作系统 watchOS 2 与 tvOS 9(是的,这货居然是第 9 版),加上已经 ...

  3. PHP数组知识点整理

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  4. Internet上的音频/视频概述

    Internet上的音频/视频概述 计算机网络最初是为传送数据信息设计的.因特网 IP 层提供的"尽最大努力交付"服务,以及每一个分组独立交付的策略,对传送数据信息也是很合适的. ...

  5. css布局中的各种FC(BFC、IFC、GFC、FFC)

    什么是FC?FC(Formatting Context)格式化上下文,其实指的是一个渲染区域,拥有一套渲染规则,它决定了其子元素如何定位,以及与其他元素之间的关系和相互作用. 什么是BFC? BFC( ...

  6. LeetCode 162.Find Peak Element(M)(P)

    题目: A peak element is an element that is greater than its neighbors. Given an input array where num[ ...

  7. 通过HTML及CSS模拟报纸排版总结

    任务目的 深入掌握CSS中的字体.背景.颜色等属性的设置 进一步练习CSS布局 任务描述 参考 PDS设计稿(点击下载),实现页面开发,要求实现效果与 样例(点击查看) 基本一致 页面中的各字体大小, ...

  8. idea使用Tomcat部署war 和 war exploded的区别

    war模式:将WEB工程一包的形式上传到服务器中.war exploded模式:将WEB工程以当前文件夹的位置关系上传到服务器.解析:war 模式这种可以称为是发布模式(完整的项目),将项目打成war ...

  9. for循环结合range使用方法

    range概念:表示一个数据范围 基本的语法格式:range(开始数据,结束数据(不包括结束数据),步长) 记住一个公式:下一个数据=开始数据+步长 步长:表示的是数据前后的间隔 OK,基本的概念和语 ...

  10. 网络|N1盒子做旁路由刷OpenWRT系统(小白专用)

    N1盒子做旁路由刷OpenWRT系统(小白专用) 为什么要用N1盒子 现如今新上市的路由器,市面上能买到的300元以内的路由器大多数都是双频(5G Hz和2.4G Hz)和几年前相比无论是速度还是性能 ...