Java,Jsp,模式及框架
Web技术
Web服务器
浏览器相关
SQL语言
数据库
开发环境
软件开发及管理
网站SEO
短信及邮件服务
网页设计
电脑、硬件及网络
协同管理平台问题
电子商务
前沿技术及趋势
  当前位置:首页 - 知识积累 - 软件开发及管理
办公系统Jar包兼容性问题
时间:2010年08月25日 

    今天在将RSS的Jar包由RssLibJ改为Rome时碰到了Jar包的兼容性问题。Rome-0.9.jar需要Jdom-1.0.jar ,一开始由于没有注意系统中已经有Jdom.jar,只是简单地将Jdom-1.0.jar复制到base/lib目录下,结果系统运行时产生错误,错误如下:

java.lang.VerifyError: (class: com/sun/syndication/io/impl/BaseWireFeedGenerator
, method: generateForeignMarkup signature: (Lorg/jdom/Element;Ljava/util/List;)V
) Incompatible argument to function
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:247)
        at com.sun.syndication.io.impl.PluginManager.getClasses(PluginManager.ja
va:133)
        at com.sun.syndication.io.impl.PluginManager.loadPlugins(PluginManager.j
ava:87)
        at com.sun.syndication.io.impl.PluginManager.(PluginManager.java:5
5)
        at com.sun.syndication.io.impl.PluginManager.(PluginManager.java:4
6)
        at com.sun.syndication.io.impl.FeedGenerators.(FeedGenerators.java
:47)
        at com.sun.syndication.io.WireFeedOutput.(WireFeedOutput.java:44
)
        at com.sun.syndication.io.SyndFeedOutput.(SyndFeedOutput.java:44)
        at com.zsoa.cms.WebSite.updateRssFeed(WebSite.java:457)
        at org.apache.jsp.manageContent_jsp._jspService(manageContent_jsp.java:5
3)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:137)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper
.java:210)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:2
95)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:354
)
        at org.mortbay.jetty.servlet.WebApplicationHandler$Chain.doFilter(WebApp
licationHandler.java:342)
        at com.xloa.util.MyFilter.doFilter(MyFilter.java:139)
        at org.mortbay.jetty.servlet.WebApplicationHandler$Chain.doFilter(WebApp
licationHandler.java:334)
        at org.ofbiz.content.webapp.control.ContextFilter.doFilter(ContextFilter
.java:129)
        at org.mortbay.jetty.servlet.WebApplicationHandler$Chain.doFilter(WebApp
licationHandler.java:334)
        at org.mortbay.jetty.servlet.WebApplicationHandler.dispatch(WebApplicati
onHandler.java:286)
        at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:5
67)
        at org.mortbay.http.HttpContext.handle(HttpContext.java:1808)
        at org.mortbay.jetty.servlet.WebApplicationContext.handle(WebApplication
Context.java:525)
        at org.mortbay.http.HttpContext.handle(HttpContext.java:1758)
        at org.mortbay.http.HttpServer.service(HttpServer.java:879)
        at org.mortbay.http.HttpConnection.service(HttpConnection.java:790)
        at org.mortbay.http.HttpConnection.handleNext(HttpConnection.java:952)
        at org.mortbay.http.HttpConnection.handle(HttpConnection.java:807)
        at org.mortbay.http.SocketListener.handleConnection(SocketListener.java:
197)
        at org.mortbay.util.ThreadedServer.handle(ThreadedServer.java:289)
        at org.mortbay.util.ThreadPool$PoolThread.run(ThreadPool.java:501)

      通过分析,判定应该是系统中存在多个版本的Jdom,导致JVM不知道要加载哪个版本,经过查找,果然发现系统中在Base/lib和components/weboa/lib两个地方已经有Jdom的低版本jar包,由于Rome需要Jdom-1.0.jar,所以将这两个地方的低版本的Jdom删除。

      但是,重新编译后再执行却仍然报这个错。经过多遍查找,没有发现什么地方还有Jdom的Jar包,

所以考虑是不是Rome和Jdom的版本不兼容造成的 。为了排除这个可能性,我使用Rome-1.0、Rome-0.9和Jdom-1.0、Jdom-1.1来进行不同的搭配,结果不管什么搭配都会报这个错,所以这种可能性被排除了。

     最后,考虑是否是系统中的其他Jar中包含与Jdom-1.0中一样的包名和类名,于是逐一检查base/lib目录下的Jar包,果然找到了一个Jar包包含Jdom的包名和类名,经过检查,发现ds.jar实际上就是Jdom.jar,只是包名改成了ds而已。所以原来base/lib目录下有两个Jdom的Jar包,只是由于ds.jar的名称没有任何意义,通过名称无法知道这个包的用途。

      但是,系统中使用了老的Jdom.jar中的方法,在Jdom-1.0.jar中被删除了,系统原来的程序无法使用。仍然存在兼容性问题,所以需要修改原来的程序。

      总结:这主要是由在系统中重复放置相同的Jar包,并且将Jar包的名称改成无意义的名称而引起的,所以以后不应该在系统中放多个相同的Jar包,也不要重命名Jar,如果要重命名,也要起有意义的名称,做到见名知意。