【问题标题】:How to put JSF provided by JBoss AS7 on the classpath of a JAR module?如何将 JBoss AS7 提供的 JSF 放在 JAR 模块的类路径中?
【发布时间】:2013-11-01 18:14:59
【问题描述】:

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

最佳实践:如果您有一个 Web 应用程序(如我的)并且该 Web 应用程序的类(托管 bean)可能会在其他项目中重用,那么它就是 recommended waymaven 方式)将这些类打包成一个单独的 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 的 META-INF 目录中提供一个 jboss-deployment-structure.xml 文件找到了解决方案,该文件具有以下内容:

<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>

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

非常感谢,
- 马丁

【问题讨论】:

标签: jsf jboss java-ee-6


【解决方案1】:

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

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

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

【讨论】:

  • 我不知道“EE 子系统”的第一个链接页面是什么意思,但显然 EAR 中的 JAR 不是其中的一部分,因为我得到一个“java.lang.ClassNotFoundException: javax. faces.context.FacesContext" 当我删除 jboss-deployment-structure.xml 时。
  • 您是否在战争中打包了包含 JSF 支持 bean 和对 FacesContext 的引用的 jar(即 jar in war in ear)?您是否使用 maven-ear-plugin 将您的 jar 指定为 webmodule(参见 maven.apache.org/plugins/maven-ear-plugin/howto.html)?
  • 不,JAR 不在 WAR 中,而是在 EAR 中。如果它在 WAR 中,我无法从其他 WAR 中引用它。 JAR 未指定为 webmodule。但据我了解,只有 WAR 应该指定为 webmodule,而不是 JAR。
  • 好的。所以看起来 JBoss 不是在 web 子系统上下文中加载你的 jar,因此不会自动添加 jsf 依赖项。您确定要在所有战争中使用同一个罐子吗?如果你必须更新你的 jar 和 war1 但你没有时间/预算来更新 war2 怎么办?类加载机制允许您在两次战争的不同版本中部署 jar 两次。
  • 如果我要更新 JAR,我会给它一个新版本。然后,war1 和 war2 可能依赖于不同的版本。但是,这只是一个理论上的问题,因为我目前只有一个 WAR。但是我们跑题了 :) 我最初的问题是:我向我的 backingbean JAR 提供 JSF2 API JAR 的方式是 hack 还是标准?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 2014-07-03
  • 2023-03-19
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 2018-06-03
相关资源
最近更新 更多