java classpath与ClassLoader
来源:互联网 发布:wifi显示不安全的网络 编辑:程序博客网 时间:2024/06/08 17:05
刚接触到jdbc时出现找不到数据库驱动,先抛出我的代码
public class Jdbc{public static void main(String args[]){try{Class.forName("com.mysql.jdbc.Driver");}catch(ClassNotFoundException e){e.printStackTrace();} }}
运行开始出现找不到
经过不断找资料查信息,不断的import,classpath 设置。发现以下两种办法可以解决:
1、classpath添加 “jdk\lib\mysql-connector-java-5.0.8-bin.jar“ 注意:前提是mysql的jar包已经复制到 jdk\lib\下;
2、将 mysql的jar包复制到 \jdk\jre\lib\ext 目录中
以上两种办法都可以解决问题,但是就是想不通原因。问题主要有是:
!!当mysql jar包文件复制到 jdk\lib目录下,且环境变量已经设置 'jdk\lib\" 目录,为什么当我把mysql jar包复制到 jdk\lib\ 和jdk\jre\lib\ 目录下,运行报错?找不到该类? 为什么一定要设置为jdk\lib\mysql-connector-java-5.0.8-bin.jar??
经过各种查资料,弄清楚了jvm加载class的大致原理,
---jvm默认只加载 jre\lib下如rt.jar、classes,然后加载jre\ext下的全部jar,最后加载classpath目录的class
---所以我开始配置的'jdk\lib\"或者'jdk\jre\lib\"只是具体到该目录,但其子目录默认是不加载的。需要添加环境变量为:jdk\lib\mysql-connector-java-5.0.8-bin.jar
---当然直接将jar包复制到 jre\ext\目录下,肯定是可以的
转载网络文章的 http://www.codeceo.com/article/java-classloader.html 的一段话:
当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程序的一个入口函数来调用系统的相关功能,而这些功能都被封装在不同的class文件当中,所以经常要从这个class文件中要调用另外一个class文件中的方法,如果另外一个文件不存在的,则会引发系统异常。
Java默认提供的三个ClassLoader
- Bootstrap ClassLoader:称为启动类加载器,是Java类加载层次中最顶层的类加载器,负责加载JDK中的核心类库,如:rt.jar、resources.jar、charsets.jar等,可通过如下程序获得该类加载器从哪些地方加载了相关的jar或class文件:
URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs(); for (int i = 0; i < urls.length; i++) { System.out.println(urls[i].toExternalForm()); }
以下内容是上述程序从本机JDK环境所获得的结果:
file:/C:/Program%20Files/Java/jdk1.6.0_22/jre/lib/resources.jar
file:/C:/Program%20Files/Java/jdk1.6.0_22/jre/lib/rt.jar
file:/C:/Program%20Files/Java/jdk1.6.0_22/jre/lib/sunrsasign.jar
file:/C:/Program%20Files/Java/jdk1.6.0_22/jre/lib/jsse.jar
file:/C:/Program%20Files/Java/jdk1.6.0_22/jre/lib/jce.jar
file:/C:/Program%20Files/Java/jdk1.6.0_22/jre/lib/charsets.jar
file:/C:/Program%20Files/Java/jdk1.6.0_22/jre/classes/
其实上述结果也是通过查找sun.boot.class.path这个系统属性所得知的。
System.out.println(System.getProperty("sun.boot.class.path"));
打印结果:C:\Program Files\Java\jdk1.6.0_22\jre\lib\resources.jar;C:\Program Files\Java\jdk1.6.0_22\jre\lib\rt.jar;C:\Program Files\Java\jdk1.6.0_22\jre\lib\sunrsasign.jar;C:\Program Files\Java\jdk1.6.0_22\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.6.0_22\jre\lib\jce.jar;C:\Program Files\Java\jdk1.6.0_22\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.6.0_22\jre\classes
- Extension ClassLoader:称为扩展类加载器,负责加载Java的扩展类库,默认加载JAVA_HOME/jre/lib/ext/目下的所有jar。
- App ClassLoader:称为系统类加载器,负责加载应用程序classpath目录下的所有jar和class文件。
- java classpath与ClassLoader
- Java利用classloader从classpath加载资源
- [Java]path与classpath
- java -classpath 与 -jar
- 分析Java的类加载器与ClassLoader(二):classpath与查找类字节码的顺序,分析ExtClassLoader与AppClassLoader的源码
- Java Class卸载与ClassLoader
- java环境变量 Path 与CLASSPATH
- java环境变量 Path 与CLASSPATH
- Java中path与classpath
- java中class与classpath
- java环境变量 Path 与CLASSPATH
- Java -cp命令与-classpath
- java的path与classpath
- tomcat classpath classloader粗略学习心得
- Android ClassLoader与JAVA ClassLoader详解及对比
- java.Spring加载resource时classpath*:与classpath:的区别
- java代码实现利用 classloader 动态加载 jar包、文件夹到classpath中
- [Java代码] 分享代码片段:将指定位置的war包加入classpath的classloader实现
- Lua语法小贴士(七)错误处理
- SSH框架修改xml不需重启Tomcat服务器的方法
- 如何让一个Service成为前置进程?
- linux设备驱动归纳总结(四):3.抢占和上下文切换
- Matlab与线性代数 -- 对数化间隔向量
- java classpath与ClassLoader
- Java中的数组
- linux设备驱动归纳总结(四):4.单CPU下竞态和并发
- 第九周—C语言 等比数列(输入多组数据)
- 第八周 oj训练 求倒数和
- Intelli产品的破解,使用注册机
- TCP/IP面试题
- linux设备驱动归纳总结(四):5.SMP下的竞态和并发
- php中的日期与时间