JBOSS EAP 7.0 - java.lang.NoClassDefFoundError:org/springframework/context/support/ClassPathXmlApplicationContext

JBOSS EAP 7.0 - java.lang.NoClassDefFoundError:org/springframework/context/support/ClassPathXmlApplicationContext

问题描述:

我目前正在将应用程序从JBoss 5.1迁移到JBoss 7.0 EAP服务器。
我添加了一个模块,JBoss服务器命名为 - org.springframework春天的依赖罐子
JBOSS EAP 7.0 - java.lang.NoClassDefFoundError:org/springframework/context/support/ClassPathXmlApplicationContext

<?xml version="1.0" ?> 
<module xmlns="urn:jboss:module:1.1" name="org.springframework"> 

    <resources> 
     <resource-root path="spring-core-3.0.5.RELEASE.jar"/> 
     <resource-root path="spring-context-3.0.5.RELEASE.jar"/> 
     <resource-root path="spring-beans-3.0.5.RELEASE.jar"/> 
     <resource-root path="spring-expression-3.0.5.RELEASE.jar"/> 
     <resource-root path="spring-web-3.0.5.RELEASE.jar"/> 
     <resource-root path="spring-aop-3.0.5.RELEASE.jar"/> 
     <resource-root path="spring-asm-3.0.5.RELEASE.jar"/> 
     <resource-root path="spring-jdbc-3.0.5.RELEASE.jar"/> 
     <resource-root path="spring-tx-3.0.5.RELEASE.jar"/> 
     <resource-root path="org.springframework.web.servlet-3.0.0.M3.jar"/> 
     <resource-root path="commons-logging-1.1.1.jar"/> 
    </resources> 

    <dependencies> 
     <module name="javax.api"/>  
     <module name="javax.servlet.jsp.api"/> 
     <module name="javax.faces.api"/> 
    </dependencies> 
</module> 

我已经在战争的JBoss的部署,structure.xml定义模块依赖

<jboss-deployment-structure> 

    <deployment> 

     <dependencies> 
     <module name="com.oracle" /> 
     <module name="org.springframework" /> 
     </dependencies> 

    </deployment> 

</jboss-deployment-structure> 

部署到服务器的战争还包含弹簧上下文3.0.5.RELEASE.jar在WEB-INF/lib文件夹

所以我认为所需的jar - spring-context-3.0.5.RELEASE.jar存在于类路径中。不过还是我收到以下错误:

04:33:30,496 INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] (default task-19) Loading XML bean definitions from class path resource [core_services.xml] 
04:33:30,507 INFO [org.springframework.beans.factory.support.DefaultListableBeanFactory] (default task-19) Pre-instantiating singletons in org.springframework.beans.fact 
[email protected]: defining beans [LogService,CacheService,PropertyService]; root of factory hierarchy 
2017.02.09 04:33:30 ERROR CashViewsPortalServiceImpl(-2): org/springframework/context/support/ClassPathXmlApplicationContext 
CallStack=java.lang.NoClassDefFoundError: org/springframework/context/support/ClassPathXmlApplicationContext 
     at com.karthik.common.service.Services.getService(Services.java:31) 
     at com.karthik.data.service.DataServices.getService(DataServices.java:18) 
     at com.karthik.portal.server.PortalServiceImpl.getInitializeInfo(PortalServiceImpl.java:83) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:497) 
     at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:561) 
     at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:265) 
     at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:305) 
     at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
     at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) 
     at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62) 
     at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) 
     at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) 
     at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
     at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) 
     at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57) 

1)为什么我们需要在类加载的Jboss 7 EAP服务器添加模块,即使罐子在战争中的WEB-INF/lib文件夹捆绑 部署在服务器上?
2)如何解决上述错误

+0

不得不删除我的答案,因为我的假设是不正确的。事实上,找不到的类是de'spring-core-3.0.5.RELEASE.jar',并且你已经定义了它。尝试将部署结构中的spring模块更改为'',并添加'export'属性。 – Omoro

+0

@Omoro。感谢您的帮助。我将添加到jboss-deployment-structure.xml中,但仍然收到相同的错误。我可以知道导出属性有什么不同吗? – Karthik

+0

我在JBoss Wildfly中使用spring的应用程序。通过maven,我将spring依赖关系的范围设置为'provided',这样我只能在应用程序中使用JBoss中spring模块提供的spring依赖关系。 Export属性用于导出其他模块可能需要的依赖关系。 ' \t \t \t \t \t \t' – Omoro

我想你还没有完美地定义了spring依赖关系。下面是步骤:

您可以定义Spring作为一个模块

下面是步骤来创建一个Spring模块:

1.Download春天所需版本。对于这个例子我们使用的是Spring 3.1.1。

2.创建目录:$ JBOSS_HOME/modules/org/springframework/spring/main。

3.将您下载的Spring库复制到该目录。

4.在该目录下创建包含以下内容的module.xml。确保这些对应库的名字:

<?xml version="1.0" encoding="UTF-8"?> 
<module xmlns="urn:jboss:module:1.1" name="org.springframework.spring"> 
    <resources> 
    <resource-root path="org.springframework.aop-3.1.1.RELEASE.jar"/> 
    <resource-root path="org.springframework.asm-3.1.1.RELEASE.jar"/> 
    <resource-root path="org.springframework.aspects-3.1.1.RELEASE.jar"/> 
    <resource-root path="org.springframework.beans-3.1.1.RELEASE.jar"/> 
    <resource-root path="org.springframework.context-3.1.1.RELEASE.jar"/> 
    <resource-root path="org.springframework.context.support-3.1.1.RELEASE.jar"/> 
    <resource-root path="org.springframework.core-3.1.1.RELEASE.jar"/> 
    <resource-root path="org.springframework.expression-3.1.1.RELEASE.jar"/> 
    <resource-root path="org.springframework.instrument-3.1.1.RELEASE.jar"/> 
    <resource-root path="org.springframework.instrument.tomcat-3.1.1.RELEASE.jar"/> 
    <resource-root path="org.springframework.jdbc-3.1.1.RELEASE.jar"/> 
    <resource-root path="org.springframework.jms-3.1.1.RELEASE.jar"/> 
    <resource-root path="org.springframework.orm-3.1.1.RELEASE.jar"/> 
    <resource-root path="org.springframework.oxm-3.1.1.RELEASE.jar"/> 
    <resource-root path="org.springframework.test-3.1.1.RELEASE.jar"/> 
    <resource-root path="org.springframework.transaction-3.1.1.RELEASE.jar"/> 
    <resource-root path="org.springframework.web-3.1.1.RELEASE.jar"/> 
    <resource-root path="org.springframework.web.portlet-3.1.1.RELEASE.jar"/> 
    <resource-root path="org.springframework.web.servlet-3.1.1.RELEASE.jar"/> 
    <resource-root path="org.springframework.web.struts-3.1.1.RELEASE.jar"/> 
    </resources> 
    <dependencies> 
    <module name="org.apache.commons.logging"/> 
    <module name="javax.api" export="true"/> 
    <module name="org.jboss.vfs"/> 
    </dependencies> 
</module> 

这是一个绝对的最小module.xml(不同的Spring版本无关):

<?xml version="1.0"?> 
<module xmlns="urn:jboss:module:1.1" name="org.springframework.spring"> 
    <resources> 
    <resource-root path="spring-aop-3.2.3.RELEASE.jar"/> 
    <resource-root path="spring-beans-3.2.3.RELEASE.jar"/> 
    <resource-root path="spring-context-3.2.3.RELEASE.jar"/> 
    <resource-root path="spring-core-3.2.3.RELEASE.jar"/> 
    <resource-root path="spring-expression-3.2.3.RELEASE.jar"/> 
    </resources> 
    <dependencies> 
    <module name="javax.api"/> 
    <module name="org.apache.commons.logging"/> 
    </dependencies> 
</module> 

5.Put下面的jboss-部署 - (WAR或META-INF/jboss-deployment-structure.xml,用于EAR或EJB-jar)使用上述模块中的structure.xml:

如果您使用的是JBoss EAP 6.1.x或更高版本或EAP 7,请使用以下内容:

<?xml version="1.0" encoding="UTF-8"?> 
<jboss-deployment-structure> 
    <deployment> 
    <dependencies> 
     <module name="org.springframework.spring" export="true" meta-inf="export"/> 
    </dependencies> 
    </deployment> 
</jboss-deployment-structure> 

如果为JBoss EAP对6.0.x,然后用下面

<?xml version="1.0" encoding="UTF-8"?> 
<jboss-deployment-structure> 
    <deployment> 
    <dependencies> 
     <module name="org.springframework.spring" export="true"> 
     <imports> 
      <include path="META-INF**"/> 
      <include path="org**"/> 
     </imports> 
     <exports> 
      <include path="META-INF**"/> 
      <include path="org**"/> 
     </exports> 
     </module> 
    </dependencies> 
    </deployment> 
</jboss-deployment-structure> 

注:在jboss-部署-structure.xml模块上的META-INF中的JBoss EAP 6.1.0加入,它允许资源的META-INF中的文件可见。由于这在JBoss EAP 6.0中不可用。x,该部分允许您访问默认情况下不可见的META-INF目录。

注:Spring框架模块不应该包括资源,如Servlet-api.jar文件,XML-apis.jar,JTA-api.jar文件,和其他API。这些API由JDK或JBoss实现,并试图使用不同版本的API将导致类加载问题和其他问题。

注:弹簧组件应该包括所有不支持Java/JavaEE的依赖。 Spring模块可以依赖于JBoss提供的javax.api/javaee.api和任何公共JBoss模块,但对于其他依赖项,Spring具有诸如aopalliance,它们需要作为资源包含在模块或另一个自定义模块中。

+0

我需要一个重要的说明。 WAR的WEB-INF/lib文件夹中的弹簧罐怎么样?我应该删除它吗?我们是否应该在JBoss 7 EAP上部署的WAR的WEB-INF/lib文件夹中不包含任何jar文件? – Karthik

+0

是的,你应该从WEB-INF/lib文件夹中删除所有jar,否则你可能会搞砸,因此它会在相同的jar之间冲突。 –

+0

好的,如果我们不创建一个弹簧模块并将弹簧瓶捆绑在WEB-INF文件夹中,它会工作吗? – Karthik