[英]Use native Java SE 6 JAX-WS implementation instead of JBoss WS stack
JBoss 6.0 Final附帶JBoss WS (默認為Apache CXF堆棧),我知道我可以用JBossWS下載站點中相應的JBoss WS Native或Metro版本替換默認實現。
問題是,我有一個客戶端jar庫(不幸的是二進制文件),它使用了一些專有的SOAP Web服務。 當我使用部署到JBoss的Web應用程序中的客戶端API時,我遇到了大量間歇性SOAP故障(使用Apache CXF和JBoss Native堆棧進行測試)。
由於從獨立的jar文件(沒有第三方JAX-WS實現)運行時,相同的Web服務似乎工作正常,所以我考慮禁用JBoss WS堆棧,轉而使用Java SE提供的本機JAX-WS RI堆棧6。
我知道JBoss Metro WS堆棧應該與Java SE 6附帶的內容足夠接近,但如果我能使用本機Java SE版本,我將非常感激。
那么,這可行嗎? 有人指出了方向嗎?
以下是從JBoss 6.1.0.Final中刪除JBossWS-CXF客戶端和服務器堆棧的過程。 用您使用的服務器配置替換<configuration>
,可能是default
配置。
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/
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"/>
結果,WebService服務器堆棧不再可用,jbossws控制台也不再可用。
為了確保在運行JBoss的JavaSE版本中使用JAX-WS Metro實現,您還必須從Class-Path中刪除與CXF和JAX-WS相關的任何jar:
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
那時,JBoss 6.1甚至更快啟動。
對於更多的研究人員,我想分享我的額外步驟,如何從JBoss 6.1中刪除所有舊的JAXB和CXF並添加它們的新版本(它是增強的Yves Martin答案):
即將被刪除:
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
從以下配置文件:server // deployers / switchboard-jboss-beans.xml
刪除以下行:
<entry>
<key>javax.xml.ws.WebServiceContext</key>
<value><inject bean="org.jboss.switchboard.WebServiceContextResourceProvider"/></value>
</entry>
<inject bean="org.jboss.switchboard.WebServiceRefResourceProvider"/>
如果要將JAXB + CXF升級到2.6.3,請添加以下庫:
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
如果您有Java 6項目,新的JAXB將從JRE推斷出這個,所以我們必須支持新版本。 以下是如何為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>
在IDE上,您必須告訴它使用新的JAXB庫進行編譯。 如果是IDEA,你可以在這里完成:
IDEA -> Settings -> Compiler -> Java Compiler
in "Additional command line parameters" add:
-endorseddirs /<your_absolut_path_to_project>/target/endorsed/
只是為了完全理解上面做了什么,在流程結束時你有一個沒有任何WS服務器端功能的應用服務器,除了程序化端點API使用(Endpoint.publish(..)),它不會啟動無論如何,在JBoss AS上都是ws端點。 根本沒有JSR109支持,沒有EJB3 WS端點功能等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.