1

概述:我有一个使用Apache Maven作为构建系统的 JEE6 项目。我的项目生成了一个 EAR,其中包含一些常见的 JAR、一些 EJB 模块和一个 WAR。生成的 EAR 应该部署到JBoss AS 7(目前为 7.1.1)。

最佳实践:如果您有一个 web 应用程序(如我的)并且 webapp 的类(托管 bean)可能会在其他项目中重用,推荐的 方式maven 方式)将这些类打包到一个单独的 JAR中并使 WAR 依赖于这个 JAR。然后将 JAR 与 EAR 一起打包(但不在 WAR 中)。到目前为止,一切正常。

这是我的 EAR 的布局:

EAR
 +-- lib
 |    +-- [some 3rd party JARs]
 |    `-- war-backingbeans.jar
 +-- myEJBs.jar
 `-- myWAR.jar

问题:当我的 backingbeans JAR 中的类开始依赖于一些 JSF 类(如FacesContext. JBoss AS7 附带 JSF JAR,并自动为类路径上的 WAR 提供这些 JAR。但是,这些 JAR 不在 EAR 的类路径或 EAR 中的其他 JAR 上。

我可以在 maven 端添加对相关 JAR 的相应依赖项,但这最终会将 JSF JAR 打包到 EAR 中。我真正想要的是 JBoss 将它的 JSF JAR 放在 JAR 的类路径中。

我通过在 EAR 目录中提供具有以下内容的jboss-deployment-structure.xml文件找到了解决方案:META-INF

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
  <deployment>
    <dependencies>
      <module name="javax.faces.api" slot="main" export="true"/>
    </dependencies>
  </deployment>
</jboss-deployment-structure>

我现在的问题是,我这样做是正确的还是被认为是黑客行为?我的问题有更好/更便携的解决方案吗?

提前非常感谢,
-马丁

4

1 回答 1

2

JBoss AS 7 自动将一些模块添加到您的应用程序/ear 的类路径中。您可以在此处找到完整列表。这个列表提到了 web 子系统的 javaee.api 和 com.sun.jsf-impl,因此你不需要在你的 jboss-deployment-structure 中添加它们。

但是如果您执行更高级的选项,则 jboss-deployment-structure 文件将是必需的,例如,如果您想使用与 JBoss 附带的版本不同的 JSF 版本而不替换模块。然后您可能想阅读内容。

因此,据我从您的描述中可以看出,您不需要 jboss-deployment-structure。只需将 jsf maven 依赖项的范围设置为provided.

于 2013-10-23T14:21:17.223 回答