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

thinkpading 2015-12-08 09:06:49
我刚开始学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包。不明白这是为什么?

新手望不吝指教,谢谢!
...全文
391 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
thinkpading 2015-12-09
  • 打赏
  • 举报
回复
回复已看到,但此处还有一个不解: 我在程序中同时也引入了java常用类,如下 import java.sql.*; 据我所查,java.sql.*类也是位于JDK路径下的rt.jar包中,也并非直接的class文件,我的程序中用到了其中用于连接oracle的Connection等方法,为什么这个类可以直接通过import来引用,而如果我用import oracle.jdbc.driver.OracleDriver;来引用ojdbc6.jar中的类却不可以?是不是JDK对常用类有什么特殊处理之处?
  • 打赏
  • 举报
回复
如果把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所以不用自己配置)
小灰狼 2015-12-09
  • 打赏
  • 举报
回复
java.exe 只会到目录下去找 .class 文件,不会解开这个目录下的 jar 再到里面去找 所以要把 .jar 做为一项加到 classpath 里
  • 打赏
  • 举报
回复
当前路径并没有oracle.jdbc.driver.OracleDriver这个类的class文件而是在ojdbc6.jar这个文件中。所以你的classpath中应该加c:\javawork\testoracle\ojdbc6.jar而不是.-->.相当于c:\javawork\testoracle找不到oracle.jdbc.driver.OracleDriver.class

62,631

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧