刚接触到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文件。