Apache CXF应用向Weblogic部署问题解决记录

问题环境:
Apache CXF 2.0.3
Weblogic 9.2

开发测试环境:
tomcat5.5
tomcat6

在开发测试环境下一切正常,发布到weblogic9.2以后就出现了N多问题,花费了不少时间,所以必须记录一下。

[b]第一个问题[/b] 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
[b]问题处置[/b]:这是一个简单的问题,开发时候选择的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>


[b]第二个问题[/b] 警告: Can't find the request for http://127.0.0.1:7001/xxxService's Observer
[b]问题处置[/b]: 发现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>


[b]第三个问题[/b] java.lang.IllegalArgumentException: Unable to access unsupported property javax.xml.stream.supportDTD
[b]问题处置[/b]:终于碰到了最麻烦的问题,从下面的错误堆栈可看出来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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值