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,jboss7.x,noclassdeffounderror,Jboss,Jboss7.x,Noclassdeffounderror,我目前正在将应用程序从JBoss 5.1迁移到JBoss 7.0 EAP服务器。 我已经为JBoss服务器添加了一个名为-org.springframework的模块,用于spring依赖项JAR <?xml version="1.0" ?> <module xmlns="urn:jboss:module:1.1" name="org.springframework"> <resources> <resource-root pa

我目前正在将应用程序从JBoss 5.1迁移到JBoss 7.0 EAP服务器。
我已经为JBoss服务器添加了一个名为-org.springframework的模块,用于spring依赖项JAR

<?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>
1)为什么我们需要在JBoss7EAP服务器中添加模块来加载类,即使JAR被捆绑在war的WEB-INF/lib文件夹中 部署在服务器上?

2) 如何解决上述错误

我认为您没有完美地定义spring依赖项。以下是步骤:

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

以下是创建弹簧模块的步骤:

1.下载所需版本的Spring。在本例中,我们使用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版本无关):


5.将以下jboss-deployment-structure.xml放入您的应用程序存档(WEB-INF/jboss-deployment-structure.xml用于WAR或META-INF/jboss-deployment-structure.xml用于EAR或EJB jar)以使用上述模块:

如果您正在使用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-deployment-structure.xml中模块的meta-inf是在jboss EAP 6.1.0中添加的,它允许资源的meta-inf中的文件可见。由于这在JBoss EAP 6.0.x中不可用,因此该部分允许您访问默认不可见的META-INF目录

注意:Spring框架模块不应包括servlet-api.jar、xml-api.jar、jta-api.jar和其他api等资源。这些API由JDK或JBoss实现,尝试使用不同版本的API将导致类加载问题和其他问题


注意:Spring模块应该包括所有非Java/JavaEE依赖项。Spring模块可以依赖于JBoss和任何公共JBoss模块提供的javax.api/javaee.api,但是对于Spring具有的其他依赖项,例如aopalliance,它们需要作为资源包含在模块或其他自定义模块中。

我认为您没有完美地定义Spring依赖项。以下是步骤:

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

以下是创建弹簧模块的步骤:

1.下载所需版本的Spring。在本例中,我们使用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版本无关):


5.将以下jboss-deployment-structure.xml放入您的应用程序存档(WEB-INF/jboss-deployment-structure.xml用于WAR或META-INF/jboss-deployment-structure.xml用于EAR或EJB jar)以使用上述模块:

如果您正在使用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-deployment-structure.xml中模块的meta-inf是在jboss EAP 6.1.0中添加的,它允许资源的meta-inf中的文件可见。由于这在JBoss EAP 6.0.x中不可用,因此该部分允许您访问默认不可见的META-INF目录

注意:Spring框架模块不应包括servlet-api.jar、xml-api.jar、jta-api.jar和其他api等资源。这些API由JDK或JBoss实现,尝试使用不同版本的API将导致类加载问题和其他问题


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

必须删除我的答案,因为我的假设不正确。事实上,在de
spring-core-3.0.5.RELEASE.jar中找不到的类,您已经定义了它。尝试将部署结构中的spring模块更改为
,添加
导出
属性。@Omoro。谢谢你帮助我。我添加到jboss-deployment-structure.xml,但仍然得到相同的错误。我可以知道export属性有什么区别吗?我在JBoss Wildfly中使用这个属性的应用程序使用了spring。通过maven,我将spring依赖项的范围设置为
提供的
,这样我就只在应用程序中使用JBoss中spring模块提供的spring依赖项<代码>导出
属性用于导出其他模块可能需要的依赖项<代码>