今天突然想到一个问题,平时加载数据库驱动都用的是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.*;包明明存在的啊,这是怎么回事啊??

解决方案 »

  1.   

    import仅仅将包给导入,并没有加载包。
    class.forName的话就是加载了包。读取包里面的内容到内存中
    这两者明显有区别。
      

  2.   

    你编译时要加路径啊,不要放在 lib/ext 目录中。java -cp mysql-connectorj-xxxx.jar Test
      

  3.   

    今天突然想到一个问题,平时加载数据库驱动都用的是Class.forName(),于是我想用import导入驱动再实例化应该也行的吧
    确实是可以的
      

  4.   

    你要NEW出来一个对象就行了,import又不会自动加载类
      

  5.   

    Class.forName是运行时加载的,import的话要在编译时加载,可能是ext只在jre的classpath里,不在javac的classpath吧
      

  6.   


    真的耶,编译时加上路径就行了,不过又出了几个问题啊: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 都运行不成功,这到底又是怎么回事???
      

  7.   


    我觉得你说的比较有道理耶,似乎情况也是这样: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的默认路径,你还能给我再多解释一下吗??
      

  8.   

    换个马甲详细情况是这样的:
    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
    结果:通过仅仅是移动了数据库驱动的位置,这到底是怎么回事??
      

  9.   

    你的项目里面加入jar包了吗?
      

  10.   

    是这样的,sun的JDK在安装后有两个文件夹,比如我装的是jdk1.5.0,
    那么在%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目录下面。
      

  11.   

    还能用import的,俺来学习学习
      

  12.   

    运行1:java Test
    结果: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了。
      

  13.   

    感谢楼上这么多人的热心帮助,我终于弄明白了:
    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包当前的路径,这样才能编译和运行通过。