【问题标题】:How to use alternate version of Mojarra with Glassfish 4 (Netbeans/Maven)如何在 Glassfish 4 (Netbeans/Maven) 中使用替代版本的 Mojarra
【发布时间】:2014-09-16 03:11:30
【问题描述】:

我使用 Eclipse/Ant 已经有一段时间了,并决定在我的 JSF 开发中看看 Netbeans/Maven。在此过程中,我想我会尝试使用比我在glassfish/modules 中安装的版本更新的 Mojarra 版本。我似乎无法让它发挥作用,而且由于我对 Maven 和 Netbeans 都是新手,所以我不确定是这些问题还是其他问题。

我制作了一个非常简单的应用程序,它使用支持 bean 从索引页面打印出 Mojarra 版本:

Info.java

@Named
@RequestScoped
public class Info
{
  public String getVersion()
  {
    return FacesContext.class.getPackage().getImplementationVersion();
  }
}

index.xhtml

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
  <h:body>
    <h:outputText value="The Mojarra version is #{info.version}" />
  </h:body>
</html>

当我运行这个时,我看到了页面内容

Mojarra 版本是 2.2.5

正如我所料(我将 2.2.5 jar 放入 glassfish/modules 一段时间后)。然后,我添加了从 the Mojarra Web Site 找到的 Mojarra 2.2.7 的依赖项:

<dependency>
  <groupId>org.glassfish</groupId>
  <artifactId>javax.faces</artifactId>
  <version>2.2.x</version>
</dependency>

将“x”替换为“7”。生成的 POM 文件如下所示(其中大部分是来自 Netbeans 的样板文件):

POM.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany</groupId>
  <artifactId>mavenproject1</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>mavenproject1</name>

  <properties>
    <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-web-api</artifactId>
      <version>7.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.glassfish</groupId>
      <artifactId>javax.faces</artifactId>
      <version>2.2.7</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <compilerArguments>
            <endorseddirs>${endorsed.dir}</endorseddirs>
          </compilerArguments>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.6</version>
        <executions>
          <execution>
            <phase>validate</phase>
            <goals>
              <goal>copy</goal>
            </goals>
            <configuration>
              <outputDirectory>${endorsed.dir}</outputDirectory>
              <silent>true</silent>
              <artifactItems>
                <artifactItem>
                  <groupId>javax</groupId>
                  <artifactId>javaee-endorsed-api</artifactId>
                  <version>7.0</version>
                  <type>jar</type>
                </artifactItem>
              </artifactItems>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

当我运行应用程序时,输出没有任何区别,它仍然显示版本 2.2.5。我发现this article 来自@BalusC 的回答,其中提到必须明确告知Glassfish 覆盖已安装的面部版本以使用与应用程序一起部署的替代版本,方法是将其放入WEB-INF/glassfish-web.xml 用于GF3 的早期版本:

<class-loader delegate="false" />
<property name="useBundledJsf" value="true" />

即使我使用的是 GF4,我还是想尝试一下,并添加了 glassfish-web.xml 与此:

glassfish-web.xml

<glassfish-web-app error-url="">
  <class-loader delegate="false" />
  <property name="useBundledJsf" value="true" />
</glassfish-web-app>

结果是一个显示带有空版本字符串的消息的页面:

Mojarra 版本是

GF 日志也显示没有错误。创建的.war 文件包含WEB-INF/lib/javax.faces-2.2.7.jar,所以我怀疑问题与GF 配置有关,而不是与Netbeans/Maven 打包有关。

我知道我可以下载 2.2.7 jar 并将其放在 glassfish/modules 目录中(这就是我开始使用 2.2.5 的方式)。但最终目标是以特定于应用程序的方式尝试 JSF 的替代版本(理想情况下,只需更改 JSF 依赖项的 Maven 坐标),而不是更改 GF 安装。有没有办法通过应用程序的配置而不改变 GF 安装来做到这一点?


2015 年 9 月 14 日更新: 我建立了一个新的 Netbeans 项目:
  • GlassFish 4.1(开箱即用),默认包含 Mojarra 2.2.7。
  • NB Maven/Web 应用程序项目,带有 JSF 2.2 框架。
  • 修改index.xhtml文件如上图。
  • 添加了一个 Info.java 类,包含上面的内容(javax.enterprise.context.RequestScoped,javax.inject.Named)。
  • 添加了 WEB-INF/glassfish-web.xml 并添加了如上所示的行。
  • 将依赖项添加到 pom.xml 文件中,如上所示,但使用 javax.faces 版本 2.2.12。

基本上,我得到了相同的结果。如果 useBundledJsf 属性设置不在 glassfish-web.xml 文件中,则版本显示为 2.2.7(即使 war 文件中包含 2.2.12)。如果有 useBundledJsf 属性设置,以及将类加载器更改为“false”,则版本为空白。

我还通过将 glassfish 安装中的 javax.faces 文件更改为使用 2.2.10 来安装 Mojarra 2.2.10。当我这样做时,我会得到相同的结果——要么版本为空,要么显示 2.2.10(2.2.12 仍处于配置状态,并且在两种情况下都处于战争状态)。

【问题讨论】:

  • 这是 this bug 的副作用,在 2.2.9 中已修复。你可以用 2.2.9+ 重试吗?如果它有效,那么我可以将其发布为答案。
  • 我无法找到我用于此的项目/环境。不幸的是,我还需要一段时间才能重新创建它——但如果有机会我会尝试的。
  • 问题仍然存在(至少对于我能够测试的配置)。请参阅 2015 年 9 月 14 日原始帖子中的更新——我完全按照更新说明中包含的步骤进行了操作,结果相同。如果问题被认为已得到解决,那么问题可能是我在我的环境中无法识别的问题。

标签: jsf netbeans glassfish mojarra


【解决方案1】:

另一种解决方案是尝试Payara 4.1.1.154,因为它与 Mojarra 2.2.12

捆绑在一起

我认为这可以很好地满足您的需求。

This section details the modules that have been updated since the last release (4.1.153).

Mojarra 2.2.12
Webservices 2.3.2-b608
JAXB 2.2.12-b141219.1637
JAXB-API 2.2.13-b141020.1521
Weld 2.2.16.Final
Tyrus 1.11
JBatch 1.0.1-b09
Grizzly 2.3.23
HK2 2.4.0-b32
Jersey 2.22
Hazelcast 3.5.2

【讨论】:

    猜你喜欢
    • 2012-06-02
    • 2015-04-15
    • 1970-01-01
    • 2013-11-04
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多