JBoss 6 EAP JaxWsProxyFactoryBean NoClassDefFoundError

标签 jboss cxf noclassdeffounderror classnotfoundexception

我正在从 JBoss 6.1.0 JBoss EAP 4.2.xa 迁移应用程序。

我知道我改变了很多事情,其中​​最重要的一点是 JBoss 现在包含了大部分框架/最常用的库(模块),这很棒(war 文件更小)。

现在,我有两个应用程序,都安装了 Spring/CXF 和 Maven2。一个公开 Web 服务,第二个公开给第一个客户端。

问题出在客户端应用程序中,在运行时,当我尝试实例化代理 Web 服务时,出现以下错误:

------ java.lang.NoClassDefFoundError: org/apache/cxf/jaxws/JaxWsProxyFactoryBean 
at es....MyFactory.getService_WSC(MyFactory.java:59) 
...
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
...
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169)
...
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:920) 
at java.lang.Thread.run(Thread.java:662) Caused by: java.lang.ClassNotFoundException: org.apache.cxf.jaxws.JaxWsProxyFactoryBean from [Module "deployment.myapp.war:main" from Service Module Loader] 
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:196) 
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:444) 
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:432) 
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:399) 
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:374) 
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:119) ... 21 more ------

在我的 pom.xml 中,我有以下内容(提供的 CXF):

<properties>    
    <cxf.version>2.6.6</cxf.version>
    <cxf.scope>provided</cxf.scope>
</properties>

    <!-- CXF -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>${cxf.version}</version>
        <scope>${cxf.scope}</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>${cxf.version}</version>
        <exclusions>
            <exclusion>
                <artifactId>commons-logging</artifactId>
                <groupId>commons-logging</groupId>
            </exclusion>
        </exclusions>
        <scope>${cxf.scope}</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-ws-security</artifactId>
        <version>${cxf.version}</version>
        <scope>${cxf.scope}</scope>
    </dependency>

可以包含 CXF 库,但大概这不是必需的,而且 JBoss EAP 6 已经有了它们?但是,如果是这样,为什么我会收到上面的 NoClassDefFoundError -> Caused by: java.lang.ClassNotFoundException 错误?

谢谢!

最佳答案

终于解决了。

首先感谢willome的回复。 根据服务架构(使用 Apache CXF 实现)的性质,我更喜欢使用 CXF 来解决。

JBoss EAP 6 嵌入了完整版本的 CXF 框架,其特殊性是“划分”为模块,关键是准确识别应用程序中包含的模块。

所有这一切的好处是,现在的 war 非常轻微,你不能包含绝大多数框架/库......就我而言,我从一场 30MB 的 war 变成了最终的 5MB。

最后我将该文件添加到应用程序 jboss-deployment-struct.xml 中,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="org.jboss.ws.cxf.jbossws-cxf-client" services="import" />
            <module name="org.apache.cxf.impl">
                <imports>
                    <include path="META-INF"/>
                    <include path="META-INF/cxf"/>
                </imports>
            </module>
            <!-- ... -->
        </dependencies>
    </deployment>
</jboss-deployment-structure>

我在 CXF 框架的 pom.xm 中保留了“提供”的范围。

关于JBoss 6 EAP JaxWsProxyFactoryBean NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17594545/

相关文章:

java - 如何让 Azure App Service Tomcat 将所有 80/443 流量转发到在同一 App Service 上运行的 JBoss

java - 如何更改 Java Web 服务客户端中的编码输出

java - 运行android项目时出现NoClassDefFoundError

用于登录文件的 Android 最佳记录器

authentication - 自定义 LoginModule 可以是有状态的 ejb 吗?

java - HornetQ java getMessagesAsJSON 功能

java - 在 Eclipse 中调试 Maven WAR 项目?

java - Apache Wink 和 Apache CXF JAX-RS 实现

glassfish - 如何在 Glassfish 上选择 CXF 而不是 Metro

java - 我如何从 jasperserver 获取报告