Use the Java SE 6 JAX-WS native implementation instead of the JBoss WS stack

JBoss 6.0 Final comes with JBoss WS ( Apache CXF by default), I know that I can replace the default implementation with the corresponding versions of JBoss WS Native or Metro from the JBossWS download site .

The problem is that I have a jar client library (binary only) that uses some native SOAP web services. When I use the client API from a web application deployed in JBoss, I get a lot of intermittent SOAP errors (tested with both Apache CXF and JBoss Native).

Since the same Web services work fine when working from a stand-alone jar file (without implementing third-party JAX-WS), I thought about disabling the JBoss WS stack in favor of the built-in JAX-WS RI stack with Java SE 6.

I know that the JBoss Metro WS stack should be close enough to what comes with Java SE 6, but I would really appreciate it if I could go with the native version of Java SE.

So is this possible? Can someone point the way?

+6
source share
3 answers

The following is the procedure for removing the client and server stack of JBossWS-CXF from JBoss 6.1.0.Final. Replace <configuration> with the server configuration you are using, possibly default .

  • Delete the following files and directory structure
 common/deploy/jbossws-console.war lib/endorsed/jbossws-cxf-factories.jar server/<configuration>/deploy/jbossws-console-activator-jboss-beans.xml server/<configuration>/deployers/jbossws.deployer/ server/<configuration>/deployers/jbossws-jaxrpc.deployer/ 
  • Edit and remove the next two parts from server/<configuration>/deployers/switchboard-jboss-beans.xml
 <entry> <key>javax.xml.ws.WebServiceContext</key> <value><inject bean="org.jboss.switchboard.WebServiceContextResourceProvider"/></value> </entry> ... and ... <inject bean="org.jboss.switchboard.WebServiceRefResourceProvider"/> 

As a result, the WebService server stack is no longer available, nor the jbossws console.

To use the JAX-WS Metro implementation from the JavaSE version running JBoss, you must also remove any jar associated with CXF and JAX-WS from Class-Path:

 lib/endorsed/jboss-jaxws-api_2.2_spec.jar lib/endorsed/stax-api.jar lib/endorsed/jboss-jaxb-api_2.2_spec.jar common/lib/jboss-jaxb-api_2.2_spec.jar common/lib/jboss-jaxws-api_2.2_spec.jar common/lib/jboss-jaxrpc-api_1.1_spec.jar common/lib/cxf-*.jar lib/wstx-lgpl.jar lib/jaxb-impl.jar lib/jaxb-xjc.jar 

At this point, JBoss 6.1 even starts up faster.

+7
source

For further researchers, I wanted to share my additional steps on how to remove all old JAXB and CXF from JBoss 6.1 and add new versions from them (this is Yves Martin's extended answer ):

To delete:

 common/deploy/jbossws-console.war server/<configuration>/deploy/jbossws-console-activator-jboss-beans.xml server/<configuration>/deployers/jbossws.deployer/ server/<configuration>/deployers/jbossws-jaxrpc.deployer/ client/cxf-*.jar client/jaxws-*.jar client/jaxb-impl.jar client/jaxb-xjc.jar client/wstx-lgpl.jar client/jbossws-*.jar client/stax-api.jar client/activation.jar lib/wstx-lgpl.jar lib/jaxb-impl.jar lib/jaxb-xjc.jar common/lib/jboss-jaxb-api_2.2_spec.jar common/lib/jboss-jaxws-api_2.2_spec.jar common/lib/jboss-jaxrpc-api_1.1_spec.jar common/lib/cxf-*.jar common/lib/jaxws-*.jar common/lib/jbossws-*.jar (except common/lib/jbossws-spi.jar) lib/endorsed/activation.jar lib/endorsed/jboss-jaxb-api_2.2_spec.jar lib/endorsed/jbossws-cxf-factories.jar lib/endorsed/jboss-jaxws-api_2.2_spec.jar lib/endorsed/stax-api.jar 

From the configuration file at: Server // for deployment / switch-jboss- beans.xml

delete the following lines:

 <entry> <key>javax.xml.ws.WebServiceContext</key> <value><inject bean="org.jboss.switchboard.WebServiceContextResourceProvider"/></value> </entry> <inject bean="org.jboss.switchboard.WebServiceRefResourceProvider"/> 

If you want to upgrade JAXB + CXF to version 2.6.3, add the following libraries:

 lib/jaxb-xjc-2.1.13.jar lib/endorsed/activation-1.1.1.jar lib/endorsed/jaxb-api-2.2.6.jar lib/endorsed/jaxws-api-2.2.6.jar lib/endorsed/stax2-api-3.1.1.jar lib/endorsed/saaj-api-1.3.4.jar lib/endorsed/cxf-api-2.6.3.jar common/lib/cxf-api-2.6.3.jar 

If you have a Java 6 project, the new JAXB will output it with the JRE, so we must approve the new version. Here's how to do it for maven:

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin.version}</version> <configuration> <source>1.6</source> <target>1.6</target> <maxmem>512m</maxmem> <compilerArguments> <endorseddirs>${project.build.directory}/endorsed</endorseddirs> </compilerArguments> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>${maven-surefire-plugin.version}</version> <configuration> <forkMode>once</forkMode> <argLine>-Djava.endorsed.dirs=${project.build.directory}/endorsed</argLine> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>${maven-compiler-plugin.version}</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>copy</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>${jax.version}</version> </artifactItem> <artifactItem> <groupId>javax.xml.ws</groupId> <artifactId>jaxws-api</artifactId> <version>${jax.version}</version> </artifactItem> </artifactItems> <outputDirectory>${project.build.directory}/endorsed</outputDirectory> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>${cxf.version}</version> <configuration> <fork>once</fork> <additionalJvmArgs>-Djava.endorsed.dirs=${project.build.directory}/endorsed</additionalJvmArgs> <!-- rest of the normal codegen configuration options --> </configuration> <dependencies> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>${jax.version}</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-xjc</artifactId> <version>${jax.version}</version> </dependency> </dependencies> </plugin> 

In your IDE, you should say that it should compile using the new JAXB libraries. In the case of IDEA, you can do it here:

 IDEA -> Settings -> Compiler -> Java Compiler in "Additional command line parameters" add: -endorseddirs /<your_absolut_path_to_project>/target/endorsed/ 
+4
source

Just in order to fully understand what is being done above, at the end of the process you have an application server without any WS server functions, in addition to using the endpoint API (Endpoint.publish (..)), that does not start the endpoint point ws on JBoss AS anyway. There is no JSR109 support at all, no EJB3 WS endpoint functionality, etc.

0
source

Source: https://habr.com/ru/post/910554/


All Articles