今天突然想到一个问题,平时加载数据库驱动都用的是Class.forName(),于是我想用import导入驱动再实例化应该也行的吧,于是就用了import com.mysql.jdbc.Driver;
但编译时却提示:
Test.java:1: 软件包 com.mysql.jdbc 不存在
import com.mysql.jdbc.Driver;数据库驱动已经复制到/Jre/Lib/ext目录下了,而且我用Class.forName()加载驱动也能加载上,用import却不能加载,这到底是怎么回事??
还有,我想把其它的一些jar包,比如JMF的jar包放入ext这个目录,然后想用import语句导入,可是编译时也提示软件包不存在:
Test.java:1: 软件包 javax.media 不存在
import javax.media.*;包明明存在的啊,这是怎么回事啊??
但编译时却提示:
Test.java:1: 软件包 com.mysql.jdbc 不存在
import com.mysql.jdbc.Driver;数据库驱动已经复制到/Jre/Lib/ext目录下了,而且我用Class.forName()加载驱动也能加载上,用import却不能加载,这到底是怎么回事??
还有,我想把其它的一些jar包,比如JMF的jar包放入ext这个目录,然后想用import语句导入,可是编译时也提示软件包不存在:
Test.java:1: 软件包 javax.media 不存在
import javax.media.*;包明明存在的啊,这是怎么回事啊??
class.forName的话就是加载了包。读取包里面的内容到内存中
这两者明显有区别。
确实是可以的
真的耶,编译时加上路径就行了,不过又出了几个问题啊:1.驱动包还是放在lib/ext目录下,然后用这个命令能编译通过:javac -cp D:\Progra~1\Java\jre6\lib\ext\mysql-connector-java-5.1.10-bin.jar Test.java
但是为什么用import命令编译时要加路径,而用Class.forName()却不用呢?lib/ext不是classpath默认路径吗????2.如果我把数据库驱动移动到C:\根目录下,然后用javac -cp C:\mysql-connector-java-5.1.10-bin.jar Test.java编译通过后,然后无论是用java Test 还是 javac -cp C:\mysql-connector-java-5.1.10-bin.jar Test 都运行不成功,这到底又是怎么回事???
我觉得你说的比较有道理耶,似乎情况也是这样:1。当数据库驱动在lib/ext文件夹下,编译时加上数据库的路径"javac -cp D:\Progra~1\Java\jre6\lib\ext\mysql-connector-java-5.1.10-bin.jar Test.java",能编译通过,然后用"java Test"命令就能运行成功。2。但是当数据库驱动不在lib/ext文件夹下,假如在C盘根目录下,编译时加上数据库驱动路径"javac -cp C:\mysql-connector-java-5.1.10-bin.jar Test.java",也能编译通过,但是用"java Test"命令就会出现java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/的错误。以上的情况似乎证实了你说的lib/ext是运行时的默认路径,而不是javac的默认路径,你还能给我再多解释一下吗??
1。数据库驱动在C盘根目录下,测试代码如下:import java.sql.Connection;
import java.sql.DriverManager;import com.mysql.jdbc.Driver;public class Test{
private static final String URL = "jdbc:mysql://localhost:3306/test";
private static final String USERNAME = "root";
private static final String PASSWORD = "123456";
public static void main(String[] args){
try{
Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
}catch(Exception e){
e.printStackTrace();
}
}
}
编译:javac -cp c:\mysql-connector-java-5.1.10-bin.jar Test.java
结果:通过运行1:java Test
结果:java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/test运行2:java -cp c:\mysql-connector-java-5.1.10-bin.jar Test
结果:Exception in thread "main" java.lang.NoClassDefFoundError: Test
2。把数据库驱动移动到D:\Program Files\Java\jre6\lib\ext目录下,还是如上测试代码:
编译:javac -cp "D:\Program Files\Java\jre6\lib\ext\mysql-connector-java-5.1.10-bin.jar" Test.java
结果:通过运行:java Test
结果:通过仅仅是移动了数据库驱动的位置,这到底是怎么回事??
那么在%JAVA_HOME%目录下会有:jdk1.5.0_22 和 jre1.5.0_22两个文件夹。
前者是编译环境,后者是运行时环境;但是两者内部的目录结果基本都一样。你会发现里面都有\lib\ext目录(前者是jre\lib\ext)。当你运行javac的时候用的是前者的\lib\ext下的jar包。当你运行java的时候用的是后者的\lib\ext下的jar包。
我想编译时提示找不到驱动类可能是楼主没有把驱动放在前者的\lib\ext目录下面。
结果:java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/test
系统加载不到mysql驱动类
------------------------------------------------------------------
运行2:java -cp c:\mysql-connector-java-5.1.10-bin.jar Test
结果:Exception in thread "main" java.lang.NoClassDefFoundError: Test
系统能加载到mysql驱动类,但是找不到Test类,需要加上当前路径也加上(.表示当前路径)
----------------------------------------------------------------------
2。把数据库驱动移动到D:\Program Files\Java\jre6\lib\ext目录下,还是如上测试代码:
编译:javac -cp "D:\Program Files\Java\jre6\lib\ext\mysql-connector-java-5.1.10-bin.jar" Test.java
结果:通过运行:java Test
结果:通过
放到ext下系统加载时会自动加上该路径,当然OK了。
1。对于javac命令,classpath和\jdk1.6.0_18\jre\lib\ext目录是自动加载的。
2。对于java命令,classpath和\jre6\lib\ext目录是自动加载的。
3。import命令是编译时加载jar包,但不载入内存。
4。Class.forName()是运行时动态加载jar包,并加载进内存生成出类对象(注意:是类对象,不是类实例)。所以,当需要用import命令导入外部的jar包时,需要将jar包复制到两个目录里去。如果你不想复制,就需要在用javac命令编译文件和java命令运行文件的时候都要通过 -cp 加上jar包当前的路径,这样才能编译和运行通过。