我的应用环境如下:
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