Develop Web Service With Axis2 #8 - 在部署axis2時的問題和解決辦法

我的應用環境如下:
JDK  v1.6.x
Axis2  v1.5.4
Ant  v1.7.1
Hibernate  v3.3.1
Tomcat  v6.0.26
Weblogic v1.03

1) 當部署axis2 war文件到tomcat,tomcat無法正常啓動

這是我看到的異常在tomcat啓動的時候

SEVERE: Error in dependencyCheck
java.util.zip.ZipException: invalid bit length repeat
    at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:147)
    at java.util.zip.ZipInputStream.read(ZipInputStream.java:146)

or

Jan 9, 2011 7:35:42 PM org.apache.catalina.core.StandardContext start
SEVERE: Error in dependencyCheck
java.util.zip.ZipException: too many length or distance symbols
    at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:147)
    at java.util.zip.ZipInputStream.read(ZipInputStream.java:146)

or

org.apache.axis2.deployment.DeploymentException: A ClassNotFoundException error occurred in loading the message receiver

解決辦法:
在我們自己寫的build.xml中,要遵循Axis2中提供的build.xml打包方式,這些異常往往是打包不恰當造成的。

舉個例子,

<copy todir="${build.dist.dir}/WEB-INF/lib" filtering="true" overwrite="yes">

如果filtering="true", 我們自己的第三方jar文件就無法正確的解壓。遇到zip相關的異常,就是我們的hibernate等jar文件打包進war文件後,在tomcat加載 的時候,無法識別這些jar文件了,你嘗試解壓縮這些jar,會發現無法正常解壓縮,如果去掉這個參數或者設爲false,就可解決這個問題

2) 無法加載hibernate

我部署在tomcat的aar文件結構如下:

.aar
      /com       --- classes files
      /lib          --- hibernate jar 和其他第三方的jar
      /META-INF
      hibernate.cfg.xml
      log4j.properties


在services.xml文件增加這個配置選項

<parameter name="ServiceTCCL">composite</parameter>

axis2會優先加載在aar文件lib目錄下的jar文件。


3) log4j

最後發現log4j.properties打包進aar文件不會起作用,正確的位置還是%WAR%/WEB-INF/classes

4)  部署到weblogic後發現hibernate jar衝突

我的Axis2項目中用到了hibernate,這個是衆所周知的異常,如果部署hibernate到weblogic中,

org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken


解決辦法:
* 改變war的文件結構

WAR
   |- axis2-web
   |- WEB-INF
          |- classes
                  |- com/xxx    這裏是DAO,邏輯類,工具類等
                  log4j.properties
                  hibernate.cfg.xml
                  your own other properties 
          |- conf
                   axis2.xml
          |- lib
                   all axis2-related jar files
                   log4j-related jar files
                   hibernate-related jar files
                   other 3rd party jar files
           |- modules
           |- services
                    yourservice.aar     這裏是skeleton類,基本上Axis2自動生成的,當然你要實現skeleton邏輯
                            com/...../xxxMessageReceiverInOut.class
                            com/...../xxxSkeleton.class
                            META-INF/services.xml
                            META-INF/wsdl.list
                            META-INF/xxxx.wsdl
           web.xml
           weblogic.xml


* 在配置文件weblogic.xml增加這個配置選項

    <container-descriptor>
        <prefer-web-inf-classes>true</prefer-web-inf-classes>
    </container-descriptor>

* 在hibernate.cfg.xml中沒有必要明確配置 'hibernate.query.factory_class'

因爲ANTLR jar衝突了,如果hibernate部署到了weblogic,有些人就建議增加這個配置hibernate.query.factory_class'

如果是hibernate v3.x 查詢解析器,
hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory


如果是hibernate v2.x 查詢解析器,
hibernate.query.factory_class= org.hibernate.hql.classic.ClassicQueryTranslatorFactory


其實沒有必要這麼做,配置<prefer-web-inf-classes>爲true, weblogic會自動優先加載%WAR%/WEB-INF/lib目錄下的所有jar文件,就會避免與weblogic自帶的jar的衝突。


5) 當部署axis2項目到weblogic, weblogic無法找到aar/mar

解決辦法:

在/services/services.list 中添加自定義的aar文件名

在/mrodules/modules.list 中添加自定義的mar文件名

 

在tomcat中即便不增加,tomcat也會自動識別,甚至在tomcat中mar/aar無需以文件的方式存在,以目錄的方式存在也可以。

6) 如何讓weblogic顯示自定義的WSDL文件,而不是自動生成的WSDL文件

在你的aar文件的META-INF目錄下增加一個文件,名爲wsdl.list,然後將你的wsdl文件名放入其中即可,然後打包進aar

同時,在services.xml必須有這個配置選項<parameter name="useOriginalwsdl">true</parameter>

7) xerces jar文件衝突,如果部署到weblogic

java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "org.apache.xerces.dom.ElementImpl.getSchemaTypeInfo()Lorg/w3c/dom/TypeInfo;" the class loader (instance of weblogic/utils/classloaders/ChangeAwareClassLoader) of the current class, org/apache/xerces/dom/ElementImpl, and the class loader (instance of <bootloader>) for interface org/w3c/dom/Element have different Class objects for the type org/w3c/dom/TypeInfo used in the signature

解決辦法: 在打包war文件時,刪除xercesImpl-2.8.1.jar

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章