Classpath的困惑[Java编程]
本文“Classpath的困惑[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
昨天在家里整理我的宝贝硬盘时,发现之前的一个基于JSP构造的电子交易平台的源码,并且还有数据库,反正也没事,于是就想弄一下,让它跑起来.接下来,下载安装Tomcat和SqlServer的JDBC驱动(JDK之前就安装过),经过一系列的配置,通过测试JSP可以正常运行,JavaBean也可以精确运行,Servlet也可以精确运行,看模样环境应当没有问题.紧接着关键的部份就要来到了.我把SqlServer的JDBC驱动的三个JAR包放到了系统的classpath里,然后,启动Tomcat,并且迫不及待的在浏览器地址栏里输入http://localhost:80/IC/,暗暗地等候着系统的呈现.系统终于跑起来了,但是看到的跟我的想象的不一样,界面上但凡有对数据库的拜候的地方都呈现了“Thisconnectionhasnotbeenestablishedyet.”,很明显问题出在和数据库的衔接上.
经过解析发现,系统对数据库的拜候是透过一个JavaBean来实现的.于是,我把这个JavaBean的源码拷到了近似于记事本一样的文本编辑器里,并且加了main办法,来测试这个类能否工作正常.编译得到class文件后,用javaxxx来履行,从输出来看,没有问题.但问题到底出在那边呢?于是,我又把这段代码拷贝到Eclipse的一个工程里,编译履行后,报的错跟拜候JSP的错是一样的,进一步跟踪发现,在Class.forName(“com.microsoft.jdbc.SQLServerDriver”);时报类没有找到,也就是说没有找到类SQLServerDriver,再翻开mssqlserver.jar一看,类SQLServerDriver赫然在立,途径也没有错.我明显在classpath里加载了三个JAR包啊,为什么在号令行方法可以找到,在Eclipse里反倒没有找到呢?太让人困惑了!周末的好意情完好被这个问题搅乱了,并且暗暗下定决计,一定要办理此后快.接下来,就是上论坛问人,还有就是在QQ和MSN上找人问,同时,自己也在解析大概的缘由,举行尝试.
联想到工作中常常把用到的JAR包城市加到项目的类途径中,于是,我也把三个JAR包增添到项目的类途径中,然后重新编译履行,发现问题没有了,输出正常.此时,我就初步断定问题出在Eclipse里履行类时加载的包跟系统的classpath指定的不一致,也就是说系统的classpath指定的类根本就没有加载到内存,所以就会报找不到类,而在号令行方法,加载的就是系统的classpath指定的包.问题固然明肯定位了,但具体是什么缘由,我还是无法注释.结合在JSP里,我如安在启动Tomcat时先把三个jar包加载到内存呢?我写了个批处理文件,内容是setclasspath=E:xxxxxmsbase.jar;E:xxxxxmssqlserver.jar;E:xxxxxmsutil.jar;我在号令行方法下,先履行这个批处理,然后,在履行启动Tomcat的号令,后来发现,仍旧报错,阐明这样加载jar包有问题.到这里,我几近都想放弃了,想不到竟然被这个classpath搞得焦头乱额,忧郁啊!但要我放弃,还真是不平气!还是歇息一下,回头再来!
在客堂转了一下,弄了点东西吃了,感受有点困,于是就睡去了.一觉睡了两个小时,起来的时刻天色已暗,于是,又回到计算机旁,想想怎样才能搞定它!于是,在大脑里搜索工作中跟classpath有关的一些问题,以及办理办法.依稀记得,在Jdk的jrelibext里的jar包,java是自己会自动加载的,于是,我又把三个jar包拷到这里,重新启动tomcat,在浏览器地址栏里输入拜候地址,暗暗的等候今后,系统终于没有报之前的错误了,数据库衔接正常了,终于跑起来了.我重重的舒了口长气,不简单啊.
到这里系统跑起来了,但classpath并没有完好搞懂得,我只是绕开了这个问题.本日一上班,我就想问南哥,但考虑到星期一上午大家城市对比忙,我忍住了.在正午快吃饭的时刻,我还是问了这个问题.南哥的注释是,在号令行方法,java自己会加载系统的classpath里指定的包,而在Eclipse等开辟环境里,系统加载的是开辟环境的classpath.这个注释,跟我的实行情形完好符合,听起来也没有问题.为了进一步确认在两种场景下classpath加载内容有什么差别,南哥倡议我用System.getProperties()看看到底有什么差别?当我对比两种情形下的输出时,困扰了我一天的classpath问题,完好弄懂得了:通过号令行方法,来javaxxxx时,会加载系统的classpath里的包,其方法是java.class.path=””,同时还会通过sun.boot.class.path=””的方法来加载jdk下的jrelib下的jar包,关于ext目下的包的加载,应当是通过java.ext.dirs=W:jdkjrelibext来举行的,但这里没有具体的包名;通过IDE环境来履行java程序时,会加载环境指定的jar包.
编后:
在号令行方法下,通过我先履行加载环境的批处理,后启动Tomcat和直接启动Tomcat得到的两份系统属性,比较此中的java.class.path来看,二者完好一样,亦即在当前的利用场景下想通过批处理来加载jar包,是行不通的.进一步尝试,在纯真的号令行方法下通过批处理来加载jar包,然后履行javaxxxx,跟踪系统属性得到的java.class.path跟批处理要求加载的完好一致.另一方面,在tomcat的webapp下成立自己的利用比方Test,然后在Test的WEB-INF目录下,成立目录lib,把你的jar包放到这里,也可以让tomcat找到你要加载的类.文中在前面提到,把jar放到jrelibext下系统可以运行,阐明也没有问题,在tomcat的利用场景下,倡议采取放到WEB-INF的lib目录下的方法.这样处理,很明显的一个好处是加强了系统的可移植性.
以上是“Classpath的困惑[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |