在 Wildfly 部署中使用 CXF 库并提供 Maven 工件

Posted

技术标签:

【中文标题】在 Wildfly 部署中使用 CXF 库并提供 Maven 工件【英文标题】:Use CXF libraries in Wildfly deployment with Maven artifact provided 【发布时间】:2015-09-14 22:39:29 【问题描述】:

我正在尝试将包含 JAX-WS 接口的项目部署到 Wildfly 8.2 服务器。该项目被包装为一场战争。 在那个项目中,我想使用拦截器。

import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
public class ReplyToHeaderInInterceptor extends AbstractSoapInterceptor  /*code*/

我正在使用带有“provided”标签的 Maven,以免收到以下错误:

Apache CXF library (cxf-rt-bindings-soap-3.1.1.jar) detected in ws endpoint deployment; either provide a proper deployment replacing embedded libraries with container module dependencies or disable the webservices subsystem for the current deployment adding a proper jboss-deployment-structure.xml descriptor to it. The former approach is recommended, as the latter approach causes most of the webservices Java EE and any JBossWS specific functionality to be disabled.

看起来像这样:

    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>3.1.1</version>
        <scope>provided</scope>
    </dependency>

但如果我这样做,则在运行时无法找到该库:

Caused by: java.lang.NoClassDefFoundError: org/apache/cxf/binding/soap/interceptor/AbstractSoapInterceptor

我已经尝试使用 maven 通过 MANIFEST.MF 文件添加依赖项:

            <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.5</version>
            <configuration>
                <packagingExcludes>WEB-INF/web.xml</packagingExcludes>
                <warName>backend</warName>
               <archive>
                  <manifestEntries>
                     <Dependencies>org.apache.cxf</Dependencies>
                  </manifestEntries>
               </archive>
            </configuration>
        </plugin>

我不知道该怎么做,有什么建议吗?

【问题讨论】:

你是否在任何spring配置文件中包含了拦截器的映射? 【参考方案1】:

事实证明,将jboss-deployment-structure.xml 文件添加到WEB-INF 文件夹,其内容如下:

<?xml version="1.0"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <deployment>
        <exclusions>
        </exclusions>
        <dependencies>
            <module name="org.apache.cxf" />
            <module name="org.apache.cxf.impl" />
        </dependencies>
    </deployment>
</jboss-deployment-structure>

尽管我之前只用org.apache.cxf 尝试过,但我必须添加org.apache.cxf.impl

【讨论】:

太棒了!正是我想要的。可惜它对我不起作用 :( 经过几个小时的调整。所有在 poms 中提供范围的部门?意思是,我也有战争和耳朵;也许不是你的情况。 可能有关禁用 Web 服务的答案对此作出了答复(是)。【参考方案2】:

另一种选择是使用您自己的结构,而不是 Wildfly 服务器部署中提供的模块(版本)。这是通过 jboss-deployment-structure.xml 文件到 WEB-INF 完成的,内容如下:

  <deployment>
    <exclude-subsystems>
        <subsystem name="webservices" /> 
    </exclude-subsystems>  
  </deployment>

这将禁用 Wildfly 中包含的 Web 服务框架并使用包含战争的库(lib jars)

这在相关问题/答案中提到: How to access CXF jars from Wildfly (Jboss) for ws endpoints

【讨论】:

以上是关于在 Wildfly 部署中使用 CXF 库并提供 Maven 工件的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Wildfly (Jboss) 为 ws 端点访问 CXF jar

Wildfly 命令行部署失败

如何在 Wildfly 中提供自定义身份验证/授权管理器

osgi应用使用桥接的方式打成war包部署在websphere上时遇到的与cxf相关的问题

如何在 Wildfly 部署时设置 hibernate.hbm2ddl.auto 不使用 persistence.xml

为 Wildfly 提供的静态内容更新 Last-Modified