2012-03-13 83 views
6

JBoss 6.0 Final隨附JBoss WS(默認爲Apache CXF堆棧),我知道我可以用各自的JBoss WS Native或Metro版本替換默認實現JBossWS downloads site使用本機Java SE 6 JAX-WS實現代替JBoss WS堆棧

問題是,我有一個客戶端jar庫(只有不幸的二進制文件),它消耗了一些專有的SOAP Web服務。當我從部署到JBoss的Web應用程序使用客戶端API時,我得到了很多間歇性的SOAP故障(同時用Apache CXF和JBoss本地堆棧進行了測試)。

由於從獨立的jar文件(沒有第三方JAX-WS實現)運行時,相同的Web服務似乎工作正常,我考慮禁用JBoss WS堆棧以支持本機JAX-WS RI堆棧提供了Java SE 6.

我知道JBoss Metro WS堆棧應該足夠接近Java SE 6附帶的內容,但是如果能夠使用本地Java SE版本,我將非常感激。

那麼,這是可行的嗎?有人可以指路嗎?

+1

我剛剛得到了我的項目需要。我正在調查 – 2012-03-14 15:08:20

+0

一定要發佈你的進度,我很困擾這個問題。 – 2012-03-14 16:16:12

+0

事實上,我遇到了麻煩,因爲JBossWS-CXF在我的應用程序中發現了Spring,並且需要它在JBoss ClassLoader中。然後,我的客戶端通過JavaSE從WSDL生成wsimport未能加載其類......因爲我僅將WS用作客戶端,所以我尋找相同的選項。 – 2012-03-14 20:33:42

回答

7

以下是從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控制檯。

爲了確保使用JAX-WS地鐵實現從您的JavaSE的版本運行JBoss,你必須也從類路徑中刪除有關CXF和JAX-WS任何廣口瓶:

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的啓動速度更快。

+0

它的工作原理!非常感謝Yves,我可以執行相同的步驟(只是不需要刪除jbossws-console部分,因爲我找不到它),並且能夠使用原生RI實現版本6.0.0 final。 – 2012-03-16 01:02:22

+0

看在上帝的份上人們:MOD這回答!謝謝你! – PaulProgrammer 2013-04-20 16:03:38

0

爲了充分理解上面所做的工作,在過程結束時,除了編程式端點API使用(Endpoint.publish(..))外,您還有一臺沒有任何WS服務器端功能的應用程序服務器,無論如何不會啓動JBoss AS上的ws端點。沒有JSR109支持,沒有EJB3 WS端點功能等。

+0

這是真的。如果您不使用JBoss作爲WS端點,而只將其作爲WS客戶端,那麼您可能會對使用JavaSE JAX-WS RI實現感興趣...(而不是CXF在加載時同時獲得端點+客戶端角色) – 2013-01-18 14:54:33

4

對於進一步的研究人員,我想分享一些關於如何從JBoss 6中刪除所有舊的JAXB和CXF的額外步驟。其中1個,並添加新的版本(它增強伊夫·馬丁答案):

被刪除:

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 

從配置文件在: 服務器//部署器/交換機-的jboss-豆。 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推斷,所以我們必須認可新版本。以下是如何做到這一點的行家:

<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/ 
+0

非常感謝您的貢獻Leszek,特別是使用Maven配置授權庫的步驟(我曾與同樣的事情一起奮鬥過)。 – 2012-11-07 20:29:17

+0

對不起,但問題是關於從JBoss中刪除CXF,以便JavaSE內部/ Metro堆棧處理JAX-WS註釋。這不是關於在JBoss內部升級CXF ... – 2013-01-18 14:52:38

+0

非常感謝這個信息,拯救了我的一天! – Maximus 2014-11-07 19:08:46