classpath包含当前路径,为什么java运行时必须强制全路径到jar包

时间:2023-02-11 09:16:36
我刚开始学java,使用cmd环境学习编译运行,这一次在进行oracle数据库的连接实验,情况是这样的:
Java文件的路径为c:\javawork\testoracle\JDBC_Connection.java
oracle11g数据库驱动位于同一目录,即c:\javawork\testoracle\ojdbc6.jar
cmd工具在该目录当前路径,此时,编译javac JDBC_Connection.java成功
运行java JDBC_Connection失败,提示找不到“oracle.jdbc.driver.OracleDriver”,即找不到oracle驱动程序
之后改为java -cp ojdbc6.jar JDBC_Connection运行成功。

那么问题来了,我的classpath环境变量里已经包含了当前路径,理论上来讲不加-cp也会检索当前路径下的jar包,我加了-cp不过是全路径到该jar包。不明白这是为什么?

新手望不吝指教,谢谢!

4 个解决方案

#1


当前路径并没有oracle.jdbc.driver.OracleDriver这个类的class文件而是在ojdbc6.jar这个文件中。所以你的classpath中应该加c:\javawork\testoracle\ojdbc6.jar而不是 .--> .相当于c:\javawork\testoracle找不到oracle.jdbc.driver.OracleDriver.class

#2


回复已看到,但此处还有一个不解:
我在程序中同时也引入了java常用类,如下
import java.sql.*;
据我所查,java.sql.*类也是位于JDK路径下的rt.jar包中,也并非直接的class文件,我的程序中用到了其中用于连接oracle的Connection等方法,为什么这个类可以直接通过import来引用,而如果我用import oracle.jdbc.driver.OracleDriver;来引用ojdbc6.jar中的类却不可以?是不是JDK对常用类有什么特殊处理之处?

#3


如果把c:\javawork\testoracle\ojdbc6.jar加到环境变量里当然可以import oracle.jdbc.driver.OracleDriver.
不过最好在.java源文件中引入import oracle.jdbc.driver.*。只引入一个类,在使用这个类的时候可能依赖于oracle.jdbc.driver包中的其他类而报找不到类的编译错误。

在配置环境变量的classpath的时候尽量在用户变量配置,如果用户变量和系统变量都配置了,用户的会把系统的覆盖掉。

其实现在完全可以不配置classpath,我发现没有配置,swing的程序照样也能编译,运行。

点击

rt.jar 默认就在根classloader的加载路径里面 放在claspath是多此一举  (安装外部JRE时就已经加载该classpath了)
这个根classloader配置我也不知道在哪,注册表没有,环境变量也没有。可能在注册表存在了JavaSoft这个表项以后,java的编译器编译程序的时候就可以自动找到吧。

运行 javac -verbose XXX.java
[源文件的搜索路径: .,C:\Program Files\Java\jdk1.6.0\lib\dt.jar,C:\Program Files
\Java\jdk1.6.0\lib\tools.jar] 
[类文件的搜索路径: C:\Program Files\Java\jdk1.6.0\jre\lib\resources.jar,C:\Prog
ram Files\Java\jdk1.6.0\jre\lib\rt.jar,C:\Program Files\Java\jdk1.6.0\jre\lib\su
nrsasign.jar,C:\Program Files\Java\jdk1.6.0\jre\lib\jsse.jar,C:\Program Files\Ja
va\jdk1.6.0\jre\lib\jce.jar,C:\Program Files\Java\jdk1.6.0\jre\lib\charsets.jar,
C:\Program Files\Java\jdk1.6.0\jre\lib\modules\jdk.boot.jar,C:\Program Files\Jav
a\jdk1.6.0\jre\classes,C:\Program Files\Java\jdk1.6.0\jre\lib\ext\dnsns.jar,C:\P
rogram Files\Java\jdk1.6.0\jre\lib\ext\jmf.jar,C:\Program Files\Java\jdk1.6.0\jr
e\lib\ext\localedata.jar,C:\Program Files\Java\jdk1.6.0\jre\lib\ext\sound.jar,C:
\Program Files\Java\jdk1.6.0\jre\lib\ext\sunjce_provider.jar,C:\Program Files\Ja
va\jdk1.6.0\jre\lib\ext\sunmscapi.jar,C:\Program Files\Java\jdk1.6.0\jre\lib\ext
\sunpkcs11.jar,.,C:\Program Files\Java\jdk1.6.0\lib\dt.jar,C:\Program Files\Java
\jdk1.6.0\lib\tools.jar]
源文件的搜索路径就是在环境变量中配置的
类文件的搜索路径-->这个应该就是编译器自己找的(发现里面有rt.jar所以不用自己配置)

#4


java.exe 只会到目录下去找 .class 文件,不会解开这个目录下的 jar 再到里面去找
所以要把 .jar 做为一项加到 classpath 里

#1


当前路径并没有oracle.jdbc.driver.OracleDriver这个类的class文件而是在ojdbc6.jar这个文件中。所以你的classpath中应该加c:\javawork\testoracle\ojdbc6.jar而不是 .--> .相当于c:\javawork\testoracle找不到oracle.jdbc.driver.OracleDriver.class

#2


回复已看到,但此处还有一个不解:
我在程序中同时也引入了java常用类,如下
import java.sql.*;
据我所查,java.sql.*类也是位于JDK路径下的rt.jar包中,也并非直接的class文件,我的程序中用到了其中用于连接oracle的Connection等方法,为什么这个类可以直接通过import来引用,而如果我用import oracle.jdbc.driver.OracleDriver;来引用ojdbc6.jar中的类却不可以?是不是JDK对常用类有什么特殊处理之处?

#3


如果把c:\javawork\testoracle\ojdbc6.jar加到环境变量里当然可以import oracle.jdbc.driver.OracleDriver.
不过最好在.java源文件中引入import oracle.jdbc.driver.*。只引入一个类,在使用这个类的时候可能依赖于oracle.jdbc.driver包中的其他类而报找不到类的编译错误。

在配置环境变量的classpath的时候尽量在用户变量配置,如果用户变量和系统变量都配置了,用户的会把系统的覆盖掉。

其实现在完全可以不配置classpath,我发现没有配置,swing的程序照样也能编译,运行。

点击

rt.jar 默认就在根classloader的加载路径里面 放在claspath是多此一举  (安装外部JRE时就已经加载该classpath了)
这个根classloader配置我也不知道在哪,注册表没有,环境变量也没有。可能在注册表存在了JavaSoft这个表项以后,java的编译器编译程序的时候就可以自动找到吧。

运行 javac -verbose XXX.java
[源文件的搜索路径: .,C:\Program Files\Java\jdk1.6.0\lib\dt.jar,C:\Program Files
\Java\jdk1.6.0\lib\tools.jar] 
[类文件的搜索路径: C:\Program Files\Java\jdk1.6.0\jre\lib\resources.jar,C:\Prog
ram Files\Java\jdk1.6.0\jre\lib\rt.jar,C:\Program Files\Java\jdk1.6.0\jre\lib\su
nrsasign.jar,C:\Program Files\Java\jdk1.6.0\jre\lib\jsse.jar,C:\Program Files\Ja
va\jdk1.6.0\jre\lib\jce.jar,C:\Program Files\Java\jdk1.6.0\jre\lib\charsets.jar,
C:\Program Files\Java\jdk1.6.0\jre\lib\modules\jdk.boot.jar,C:\Program Files\Jav
a\jdk1.6.0\jre\classes,C:\Program Files\Java\jdk1.6.0\jre\lib\ext\dnsns.jar,C:\P
rogram Files\Java\jdk1.6.0\jre\lib\ext\jmf.jar,C:\Program Files\Java\jdk1.6.0\jr
e\lib\ext\localedata.jar,C:\Program Files\Java\jdk1.6.0\jre\lib\ext\sound.jar,C:
\Program Files\Java\jdk1.6.0\jre\lib\ext\sunjce_provider.jar,C:\Program Files\Ja
va\jdk1.6.0\jre\lib\ext\sunmscapi.jar,C:\Program Files\Java\jdk1.6.0\jre\lib\ext
\sunpkcs11.jar,.,C:\Program Files\Java\jdk1.6.0\lib\dt.jar,C:\Program Files\Java
\jdk1.6.0\lib\tools.jar]
源文件的搜索路径就是在环境变量中配置的
类文件的搜索路径-->这个应该就是编译器自己找的(发现里面有rt.jar所以不用自己配置)

#4


java.exe 只会到目录下去找 .class 文件,不会解开这个目录下的 jar 再到里面去找
所以要把 .jar 做为一项加到 classpath 里