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