sparta-紫杉 2010-8-23 18:14
开发环境:spring3.0.2 + struts2.1.8 + hibernate3.3.1 + jdk1.6 + weblogic10.3 + oracle92 + c3p0-0.9.1 + Eclipse3.4.2
在此开发环境下的项目中,各项配置完毕,之前好好的,但在增加了CXF开发Web Services的功能之后,启动Weblogic10.3一半时,总是提示“c3p0不能加载 oracle.jdbc.driver.OracleDriver”,ClassNotFoundException: oracle.jdbc.driver.OracleDriver.
开始以为是新增加的采用CXF开发Web Services的功能之后,其中的CXF引用的相关包和Hibernate使用的包有冲突,于是检查,但lib下没有asm,也没有cglib_1.XX.jar,因此并不是jar包有冲突。
后来以为CXF所带的jar所版本太低(2.0.4,目前已经出了2.2.10),于是首先将所有与CXF有关的所有jar包全部删除。再试验,仍然出现这种问题,极度崩溃中。
于是从其他方面入手,找啊找, 终于在applicationContext.xml中发现如下语句:
当看到这段代码时,就已经豁然开朗了,基本已经认定就是由于<value>oracle.jdbc.driver.OracleDriver</value>值不在一行的原因(因为之前碰到过这个问题),于是将上述修改为下述:
哈哈,看出区别来了吗?一行代码之差就会造成截然不同的两种运行结果。原因很简单,在增加CXF之前,编写的代码均是采用一行来编写的,在增加了CXF之后,为了使XML配置文件的代码更加整齐,于是我在Eclipse中Ctrl + Shift + F了一下,结果配置文件中的配置代码<value>oracle.jdbc.driver.OracleDriver</value>就由一行成为了分开的两行,直接导致了配置的失效。Spring的XmlBeanDefinitionReader类的loadBeanDefinitions()方法跟我们开了一个不大不小的玩笑。于是笔者将两行的<value>oracle.jdbc.driver.OracleDriver</value>代码修改为一行之后,当再启动Weblogic,问题奇迹般的解决了。
看来,Spring对于XML的解析还是欠缺一些智能化,对于不在同一行的尾标签不能正确识别,不能不说是一种缺陷,或者说是一种Bug。在日益追求灵活编码的程序员身上还是会造成一些不必要的麻烦。记得在Struts2中也出现过此类问题,当时笔者迫不得已针对源码进行了修改。不妨大胆猜测一下,在Spring和Struts中使用的XML解析类均是通用的吧,抑或是这种通用的XML解析是基于“约定优于配置”的原则。但在我看来,这至少是一种缺陷,其中的是非成败只有留给Spring人去评说。
posted on 2011-05-18 21:56 sparta-紫杉 阅读(1229) 评论(0) 编辑 收藏 所属分类: SSH2
Powered by: BlogJava Copyright © sparta-紫杉