1. 程式人生 > >Develop Web Service With Axis2 #8

Develop Web Service With Axis2 #8

我的應用環境如下:
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