当前位置: 代码迷 >> Web前端 >> 在WebSphere公布CXF注意事项
  详细解决方案

在WebSphere公布CXF注意事项

热度:520   发布时间:2012-08-27 21:21:57.0
在WebSphere发布CXF注意事项

在CXF官网搜索到的:

https://cwiki.apache.org/confluence/display/CXF20DOC/Application+Server+Specific+Configuration+Guide#ApplicationServerSpecificConfigurationGuide-Websphere

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, 6.1.0.19, and 6.1.0.27 *)

No Web Services Feature Pack for WebSphere installed

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.

And then restart the Websphere server. (Because we changed the endorsed folder, we need to restart it to make it take effect).

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.

Step by step

  1. In the WAS console navigate to Environment > Shared Libraries
  2. Select the scope you wish your library should be visible in
  3. Click New and set values ex: name=MYAPP_SHARED_LIB, classpath=PATH_TO/wsdl4j-1.6.2.jar and Save
  4. Navigate to Application servers > [your server name] > Java and Process Management > Class loader > New
  5. Select Classes loaded with application class loader first and Save
  6. Select your new class loader and click Shared library references
  7. Add your shared library (MYAPP_SHARED_LIB) Save and restart your server.

Tested in WAS 6.1 only but should work in earlier versions as well.

Another user running WS6.1 FP 23 without the web services feature pack came up with this solution that seemed to work for them:

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.jar

Create a new parent-first classloader and have it reference the shared library you just created. Restart everything and it should work.

Web Services Feature Pack for WebSphere Installed

Things are way more complicated if the Web Services Feature Pack for WebSphere is installed. With this feature pack installed, it is impossible to deploy an application using CXF, because the WebSphere Web Services engine starts parsing the JAX-WS annotations of the services and tries to deploy the services.

Up to fixpack 27 (6.1.0.27) there was no possibility to disable the WebSphere Web Services engine.

In October 2009, IBM reacted to the problem and released the following fix:

  PK96989: ENABLE USE OF THIRD PARTY JAX-WS WEB SERVICES ENGINE IN WEBSPHERE

This fix requires at least fixpack 27 (6.1.0.27). It allows to disable the WebSphere Web Services
engine for the whole JVM by setting the JVM property

  com.ibm.websphere.webservices.DisableIBMJAXWSEngine=true

or to disable the engine just for a specific module by adding

  DisableIBMJAXWSEngine: true

to WAR/META-INF/MANIFEST.MF.

According to IBM, this fix shall be included into fixpack 29.

For details, please see http://www-01.ibm.com/support/docview.wss?rs=180&uid=swg1PK96989

The WebSphere team has also added instructions for using third party JAX-WS applications to their tech articles: http://www.ibm.com/developerworks/websphere/library/techarticles/1001_thaker/1001_thaker.html