DUE TO SPAM, SIGN-UP IS DISABLED. Goto Selfserve wiki signup and request an account.
Application Server Specific Configuration Guide
This document provides app server-specific configuration information for running Apache CXF.
| Table of Contents | ||||
|---|---|---|---|---|
|
JBoss
If you package the war in the ear, you might need to add the jboss specific file (jboss-app.xml) in the $EAR/META-INF folder to config the classloader.
...
If you are coming across LinkageErrors involving the QName class, try repackaging the stax-api jar without the javax.xml.namespace.QName class. (In JBoss 4.0.5GA at least) a conflicting version of this class is included in JBoss's lib and lib/endorsed directories. This was the only way I could get CXF working in my environment.
WebLogic
There are two ways to deploy a CXF WAR archive in WebLogic. (Note: This has been validated on WebLogic9.2.)
Put jars in endorsed folder
- Put the geronimo-ws-metadata_2.0_spec-1.1.1.jar in the $Weblogic_Home/jdk_../jre/lib/endorsed folder.
- Deploy the CXF war in weblogic.
(This way is not recommended, since it might break the application server itself. The method below is preferred, as it impacts a single module only.)
Pack war in an ear, deploy the ear with weblogic-application.xml
- Create a standard J2EE application.xml file in the META-INF folder. (Take $CXF_HOME/samples/java_first_spring_support for example)
Code Block xml xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE application PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN" "http://java.sun.com/dtd/application_1_3.dtd"> <application> <display-name>spring_http</display-name> <module> <web> <web-uri>spring_http.war</web-uri> <context-root>spring</context-root> </web> </module> </application>
...
- Run "jar cvf ..." command to create the ear and then deploy it. Alternatively, this blog entry provides a Mavenized method of building the EAR.
Websphere
Currently, I've only found on way to make cxf work with websphere: adding jars to the 'endorsed' folder. (Note: this has been validated against Websphere6.1.0.0)
put jar in the endorsed folder
- put the wsdl4j-1.6.1.jar in the $WebSphere_HOME/java/jre/lib/endorsed folder.
- In the WebSphere console, find the specific enterprise application, click the "Class loading and update detection".
- Mark the "Classes loaded with application class loader first" selected.
- Mark the "Class loader for each war file in application" selected.
...
| Tip |
|---|
Please make sure your classpath doesn't have the servlet-2.5 library, since WebSphere6.1 is servlet-2.4 compliant! |
Add your own class loader
If you put your wsdl4j-1.6.1 jar in $WAS_HOME/java/jre/lib/endorsed, all your applications will depend on your version of wsdl4j. Another solution is to create a new class loader in your server which loads before parent class loader, create a shared library with your version of wsdl4j, and add this shared library to your new class loader. This version of wsdl4j will only be available for your specific server and not affect applications running in other servers.
...
Create a shared library with the following jars:
jsr173_api-1.0.jar
jaxp-ri-1.4.2.jar
saaj-impl-1.3.2.jar
wsdl4j-1.6.2.jarCreate a new parent-first classloader and have it reference the shared library you just created. Restart everything and it should work.
OC4J
| Note |
|---|
This guide requires heavy customization of the OC4J configuration. Bear in mind that some of steps presented below are either undocumented or unsupported. We strongly advice you to perform those steps in a separate container, dedicated exclusively for CXF. |
| Note |
|---|
Also see: http://chadthedeveloper.blogspot.com/2008/06/cxf-vs-oc4j-round-1.html |
Disclaimer
This guide covers only 10.1.3.X.X version of OC4J. Note that OC4J 10.1.2 is not JSE 1.5 certified server. OC4J 11_g_ is fully JEE 5.0 certified stack and comes with their own JAX-WS implementation.
Background
Oracle OC4J comes with highly customized XML stack by Oracle including SAX, StAX, JAXP, JAX-WS, SAAJ, WSDL and few others. All of those frameworks are Oracle proprietary implementations in the OC4J distribution. This gives Oracle really good interoperability between their products but it makes it rather hard to introduce something which needs different implementation of above APIs (like CXF).
| Tip | ||||||
|---|---|---|---|---|---|---|
OC4J 10.1.3 comes with preliminary implementation of JAX-WS (JSR-181) but this implementation is somewhat limited only to top-down scenario, with very limited customization (lack of JAXB 2.0 etc.). |
Configuration overview
A few components need to be customized in OC4J to allow CFX integration:
...
Unfortunately, these components have to be configured in different parts of OC4J.
Oracle OC4J class loading
A key part of successfully integrating CXF into OC4J is to understand how class loaders work in OC4J. When starting OC4J there are generally three stages where customization could occur:
...
Customizing in the last step is quite easy to achieve - basically OC4J has quite powerful class loader and an easy customization console. Unfortunately there are some components that could not be configured this way. They are configured during OC4J boot. Unfortunately one of this is OC4J webservices stack (located in $ORACLE_HOME/webservices/lib).
Needed components
Before start please download Apache CXF 2.0.6 or better and Xerces 2.8.1
Preparing stax-api
If you use a version of CXF that includes stax-api.jar that in turn include the QName class, remove javax.xml.namespace.QName from the stax-api shipped with CXF. Oracle apparently has it already in $ORACLE_HOME/j2ee/home/lib/jax-qname-namespace.jar.
| Anchor | ||||
|---|---|---|---|---|
|
Replace the Oracle XML parser with Xerces
The basic idea behind how to do this is described in detail here
...
- xercesImpl.jar (from Xerces distribution)
- xml-apis-1.2.02.jar (from CXF-distribution)
- xalan-2.7.0.jar (ditto)
- geronimo-ws-metadata_2.0_spec-1.1.1.jar (ditto)
Note When building Your application DO NOT INCLUDE THOSE COMPONENTS again.
Get rid of OC4J JAX-WS libraries
OC4J has preliminary support for JAX-WS, unfortunately this means that during OC4J boot it loads outdated JAX-WS APIs and implementation by Oracle. This occurs even before shared libraries comes into action, at a very early stage of OC4J boot. Boot-time OC4J libraries are configured in boot.xml file in $ORACLE_HOME/j2ee/home/oc4j.jar bootstrap jar. To get rid of this:
...
- repackage
oc4j.jar(don't forget aboutMANIFEST.MF- usejar -m META-INF/MANIFEST.MF)
| Anchor | ||||
|---|---|---|---|---|
|
swapping Oracle wsdl.jar with wsdl4j.jar and jaxb.jar API with jaxb-api-2.0.jar
Additionally Oracle provides it's own implementation of WSDL functionality which conflicts with wsdl4j.jar. To get rid of this add -Xbootclasspath/p:"<path to wsdlj>/wsdl4j-1.6.1.jar;<path to jaxb2>/jaxb-api-2.0.jar" option to JVM parametrs (either in command line running OC4J standalone or in OPMN).
Deploying applications
When deploying please follow those steps:
- Edit deployment plan
- Edit
Configure class loadingin the deployment plan like described here - Uncheck
oracle.xmllibrary - Check
cxf.foundationlibrary - Uncheck
Search Local Classes First - do not include
xercesImpl,xml-apis,xalanandgeronimo-ws-metadata_2.0_spec-1.1.1.jarinwar- those will be automatically loaded by by OC4J Shared Libraries class loader.Tip You can automate above steps by packaging You
warintoeararchive (even though) if it's onlywarand providingorion-application.xmlproprietary descriptor as described here. You could also provide proprietaryorion-web.xmlin YourwarinstrumentingSearch Local Classes Firstattribute described above. This step is described here.
Oracle FAQ
I'm getting java.lang.ClassCastException: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
This primarily happens when:
...
Please be sure You properly installed and enabled for Your application cxf.foundation shared library as described here. If Yes please be sure that You didn't include xercesImpl.jar in Your war. If You still have problems please see how You can debug JAXP problems - be sure that org.apache.xerces.jaxp.DocumentBuilderFactoryImpl are instantiated from within JAXP and not oracle.xml.parser.v2.DocumentBuilder.
| Anchor | ||||
|---|---|---|---|---|
|
I cannot get WSDL (getting HTTP 500 accesing my CXF service WSDL with http://myshot/myservice?wsdl)
Please be sure that wsdl4j.jar is loaded before wsdl.jar as described here
I'm getting java.lang.NoSuchMethodException: oracle.j2ee.ws.wsdl.extensions.soap.SOAPBodyImpl.getElementType()
I cannot get it to work still
| Wiki Markup |
|---|
Try something simple. Download OC4J standalone and bootstrap it from command line directly: {{java \[options\] \-jar oc4j.jar}}. Enable [SAX debugging| http://java.sun.com/javase/6/docs/api/javax/xml/parsers/SAXParserFactory.html#newInstance()]. Be sure You don't include douplicated jars in Your application like {{xercesImpl, xalan, xml-apis and geronimo-ws-metadata_2.0_spec-1.1.1.jar}}. Review steps above once more. It works ;). |
Integration with Application Server FAQ
1.
Q: I have this error: javax.xml.ws.WebServiceException: Cannot create SAAJ factory instance.
A: Please make sure you have the saaj-impl-1.3.jar in the classpath and make sure your app picks up this one instead of weblogic one.
Resources
Utilizing the OC4J Class Loading Framework
Deploy XFire in WebLogic
Understanding WebLogic ClassLoader
JBoss Class Configuration
Troubleshooting SAX