问题环境:
Apache CXF 2.0.3
Weblogic 9.2
开发测试环境:
tomcat5.5
tomcat6
在开发测试环境下一切正常,发布到weblogic9.2以后就出现了N多问题,花费了不少时间,所以必须记录一下。
第一个问题 weblogic.application.ModuleException: Unmarshaller failed
com.bea.xml.XmlException: failed to load java type corresponding to e=web-app@http://java.sun.com/xml/ns/javaee
问题处置:这是一个简单的问题,开发时候选择的J2EE版本是1.5,但是weblogic9支持的J2EE版本是1.4,因此对WEB-INFO下的web.xml做出调整:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
修改为
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_4.dtd">
<web-app>
第二个问题 警告: Can't find the request for http://127.0.0.1:7001/xxxService's Observer
问题处置: 发现cxf的服务没有被自动发布,怀疑是spring配置文件没有加载问题,后来确认果然是Weblogic下不支持spring配置文件的通配符配置
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/applicationContext*.xml</param-value>
</context-param>
修改为
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/applicationContext-a.xml
classpath*:/applicationContext-b.xml
classpath*:/applicationContext-c.xml
</param-value>
</context-param>
第三个问题 java.lang.IllegalArgumentException: Unable to access unsupported property javax.xml.stream.supportDTD
问题处置:终于碰到了最麻烦的问题,从下面的错误堆栈可看出来weblogic的jar包比CXF的jar包先加载
at weblogic.xml.stax.ConfigurationContextBase.check(ConfigurationContextBase.java:60)
at weblogic.xml.stax.ConfigurationContextBase.setProperty(ConfigurationContextBase.java:54)
at weblogic.xml.stax.XMLStreamInputFactory.setProperty(XMLStreamInputFactory.java:280)
at org.apache.cxf.staxutils.StaxUtils.createXMLInputFactory(StaxUtils.java:169)
a.使用classpath替换大法,将cxf需要的包含XMLInputFactory的jar包放在startWebLogic.cmd里面比如wstx-asl-3.2.8.jar,sjsxp.jar 结果Weblogic起不来了,因为weblogic需要用自己的xml解析器来解析配置文件。
b.使用war包发布程序,在META-INF文件下增加weblogic-application.xml
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90">
<application-param>
<param-name>webapp.encoding.default</param-name>
<param-value>UTF-8</param-value>
</application-param>
<prefer-application-packages>
<package-name>com.bea.xml.stream.*</package-name>
<package-name>javax.jws.*</package-name>
<package-name>javax.xml.bind.*</package-name>
<package-name>javax.xml.crypto.*</package-name>
<package-name>javax.xml.registry.*</package-name>
<package-name>javax.xml.rpc.*</package-name>
<package-name>javax.xml.soap.*</package-name>
<package-name>javax.xml.stream.*</package-name>
<package-name>javax.xml.ws.*</package-name>
</prefer-application-packages>
</weblogic-application>
想要让weblogic用我们自己的class,结果仍旧是Unable to access unsupported property javax.xml.stream.supportDTD
c.在WEB-INF下增加weblogic.xml
<?xml version='1.0' encoding='UTF-8'?>
<weblogic-web-app xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd http://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-web-app.xsd">
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
</weblogic-web-app>
让weblogic使用应用程序内部的jar包发布应用,结果得到了java.lang.LinkageError: loader constraints violated when linking javax/xml/namespace/QName class
分析原因,应该是lib当中的jar包与weblogic之前加载的jar包冲突了,weblogic内部就有几个文件包含QName。 使用classfind工具查找lib当中包含QName的jar包,将QName.class去掉
至此,问题均被排除,应用程序发布正常。删除QName包这是不得已而为之,这样对版本管理不太好,但是面对weblogic,这是没有办法的办法。
之后将CXF升级到最新的版本2.5.2,又发生了一些有趣的故事。
java class finder工具http://www.idesksoft.com/classfinder.html