【发布时间】: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