JBoss 6 EAP JaxWsProxyFactoryBean NoClassDefFoundError

时间:2013-07-11 13:21:39

标签: 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以上的错误 - &gt;引起:java.lang.ClassNotFoundException?

谢谢!

2 个答案:

答案 0 :(得分:5)

最后我解决了。

首先,感谢遗嘱回应。 根据服务架构的性质(使用Apache CXF实现),我更倾向于使用CXF来解决。

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

所有这一切的好处在于战争现在很轻,你不能包括绝大多数的框架/库......在我的情况下,我从一场30MB的战争变成了最后的5MB。

然后我最后将文件添加到应用程序jboss-deployment-structure.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>

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

答案 1 :(得分:0)

您的CXF库范围是<cxf.scope>provided</cxf.scope>。我不确定JBoss EAP 6是否嵌入了CXF-jaxrs(CXF的REST部分 - 你应该检查CXF 2.4.x-redhat-1的jboss版本)。我认为它使用了Rest Easy。所以它找不到org/apache/cxf/jaxws/JaxWsProxyFactoryBean

cxf-rt-frontend-jaxws的范围从provided更改为compile

请参阅https://access.redhat.com/site/articles/112673以获取Jboss EAP 6.x中所有嵌入式库的列表

相关问题