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

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