【发布时间】:2017-01-20 19:32:07
【问题描述】:
我们正在构建一系列具有通用支持 JAR 文件的新 Spring 应用程序。在 Tomcat 环境中部署的应用程序中,世界是美好的。在非 Spring 环境中的 JBoss 下运行的遗留应用程序需要访问这些相同的 JAR。有人可以指点我一个位置或在这里解释如何配置 Spring 和 JBoss 以使 JAR 正常运行或如何打包它们以使 Spring 依赖项成为 JAR 的一部分。 Maven 也在其中。
【问题讨论】:
我们正在构建一系列具有通用支持 JAR 文件的新 Spring 应用程序。在 Tomcat 环境中部署的应用程序中,世界是美好的。在非 Spring 环境中的 JBoss 下运行的遗留应用程序需要访问这些相同的 JAR。有人可以指点我一个位置或在这里解释如何配置 Spring 和 JBoss 以使 JAR 正常运行或如何打包它们以使 Spring 依赖项成为 JAR 的一部分。 Maven 也在其中。
【问题讨论】:
你可以将 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版本无关):
<?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. 将以下 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 或更高版本,请使用以下:
?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 Framework 模块不应包含 servlet-api.jar、xml-apis.jar、jta-api.jar 和其他 API 等资源。这些 API 由 JDK 或 JBoss 实现,尝试使用不同版本的 API 会导致类加载问题和其他问题。
注意:Spring 模块应包括其所有非 Java/JavaEE 依赖项。 Spring 模块可以依赖于 JBoss 提供的 javax.api / javaee.api 和任何公共 JBoss 模块,但是对于 Spring 具有的其他依赖项,例如 aopalliance,它们需要作为资源包含在模块或另一个自定义模块中。
【讨论】: