eclipse里的web项目,用到了spring3和CXF,直接打成war包发布到weblogic,会报oracle.xml.parser.schema.XSDException: Duplicated definition for: 'identifiedType'的错误。该死的包冲突,本来应该用xercesImpl的jar包来解析spring的application-context.xml,但优先使用了weblogic自带的xmlparserv2的jar包。
在eclipse里新建一个Enterprise Application Project,在选择Java EE Module Dependencies的时候选择之前的web项目。在项目EarContent的目录META-INF下有一个weblogic-application.xml,修改成如下:
<?xml version="1.0" encoding="UTF-8"?> <wls:weblogic-application xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-application" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/javaee_5.xsd http://xmlns.oracle.com/weblogic/weblogic-application http://xmlns.oracle.com/weblogic/weblogic-application/1.3/weblogic-application.xsd"> <!--weblogic-version:10.3.6 --> <wls:xml> <wls:parser-factory> <wls:saxparser-factory>com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl</wls:saxparser-factory> <wls:document-builder-factory>com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl</wls:document-builder-factory> <wls:transformer-factory>com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl</wls:transformer-factory> </wls:parser-factory> </wls:xml> <wls:application-param> <wls:param-name>webapp.encoding.default</wls:param-name> <wls:param-value>UTF-8</wls:param-value> </wls:application-param> <wls:classloader-structure> <wls:module-ref> <wls:module-uri>bpmservice.war</wls:module-uri> </wls:module-ref> </wls:classloader-structure> <wls:component-factory-class-name>org.springframework.jee.interfaces.SpringComponentFactory</wls:component-factory-class-name> <wls:prefer-application-packages> <wls:package-name>javax.wsdl.*</wls:package-name> <wls:package-name>javax.jws.*</wls:package-name> <wls:package-name>org.apache.xerces.*</wls:package-name> </wls:prefer-application-packages> </wls:weblogic-application>
让weblogic优先选择javax.wsdl.*、javax.jws.*和org.apache.xerces.*这些包,指定对xml解析用到的类(不设置也没关系),让之前的war包加入EAP的类加载结构。
编辑EAP项目属性,在Deployment Assembly里加入wsdl4j、xmlParseAPIs和xercesImpl这三个jar包。
通过EAP项目打出ear包,就可以成功部署到weblogic 11g了。