【前言】
因为客户是银行,认为商业软件追责和寻求技术支持更可靠,所以坚持要求使用weblogic部署。
本来认为war包从tomcat上迁移到weblogic只是一个很简单的问题。没想到踩到个大雷。 大概花了三天的时间才把包成功的在weblogic服务器上运行起来。
【正文】
需要考虑的问题:
1.weblogic 版本与jdk版本对应的问题
刚开始服务器上安装的weblogic版本为weblogic10
报错:
weblogic部署异常: cvc-enumeration-valid: string value '3.1' is not a valid enumeration value for web-app-versionType in namespace http://java.sun.com/xml/ns/javaee:<null>
而xml约束中 version 3.1 代表着javaee7 weblogic10 根本不支持
于是更换到weblogic12C
2.cxf jar包冲突
cxf与weblogic有很多jar包是冲突的,具体解决的时候,首先在web-INF下建立weblogic.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
</weblogic-web-app>
这是设置优先加载项目中的jar包
但是只做完了这样还完全不够,因为weblogic对项目的校验异常严格。所以建议通过maven管理jar包首先把无用的jar包全部清除掉。 cxf自身的包之间也会有很多冲突的定义。
遇到的冲突包:
第一个: 错误信息:
Invalidschema document passed to AbstractDataBinding.addSchemaDocument, not in W3Cschema namespace: schema
解决:移除jaxb-impl的jar包
原因:与weblogic上的jar冲突
第二个:
Axis: rt.jar和jaxrpc中javax.xml.namespace.QName冲突问题分析
报错:
Caused by: java.lang.LinkageError: loader constraint violation: when resolving method "javax.xml.ws.Service.<init>(Ljava/net/URL;Ljavax/xml/namespace/QName;)V" the class loader (instance of weblogic/utils/classloaders/ChangeAwareClassLoader) of the current class, com/hthk/webservice/ips/IpsInvFunctionsSoapService, and the class loader (instance of <bootloader>) for resolved class, javax/xml/ws/Service, have different Class objects for the type javax/xml/namespace/QName used in the signature
at com.hthk.webservice.ips.IpsInvFunctionsSoapService.<init>(IpsInvFunctionsSoapService.java:46)
at com.hthk.action.IpsInvoiceFileAction.queryBill(IpsInvoiceFileAction.java:76)
原因参考:这篇博客
3.确实存在的语法错误:
这个是校验出了实体类getset方法写的有问题。
建议 :用工具生成相应方法,或者用ide生成。
【总结】
仔细查看日志信息,善用搜索引擎。根据日志中jar包的名称,作用来思考可能发生问题的方向。