Я использовал Eclipse/ Ant в течение некоторого времени и решил взглянуть на Netbeans/Maven для моей разработки JSF. По пути я думал, что попытаюсь использовать версию Mojarra, которая новее, чем тот, который я установил в glassfish/modules
. Кажется, я не могу заставить это работать, и поскольку я новичок в 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>
Когда я запускаю это, я вижу содержимое страницы
Версия Моджары - 2.2.5
как я ожидал (я поставил 2.2.5 jar в glassfish/modules
некоторое время назад). Затем я добавил зависимость для Mojarra 2.2.7, которую я нашел из веб-сайта Mojarra:
<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. Я нашел эту статью с ответом @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 и поместить ее в каталог glassfish/modules
(так я начал использовать 2.2.5). Но конечная цель - попробовать альтернативные версии JSF с помощью приложения (в идеале, просто изменив координаты Maven для зависимости JSF), вместо того, чтобы изменять установку GF. Нужно ли это сделать через конфигурацию приложения и без изменения установки GF?
Обновление 9/14/2015: Я построил новый проект Netbeans:
- GlassFish 4.1 (из коробки), который имеет Mojarra 2.2.7, по умолчанию.
- Проект NB Maven/Web Application с JSF 2.2 Framework.
- Изменен файл 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 (хотя файл войны имеет 2.2.12). И если имеется свойство свойства useBundledJsf, а также изменение класса-загрузчика на "false", версия пуста.
Я также установил Mojarra 2.2.10, изменив файл javax.faces в установке glassfish, чтобы использовать 2.2.10. Когда я это делаю, я получаю те же результаты - либо версия пуста, либо она показывает 2.2.10 (2.2.12 все еще настроен и в войне в обоих случаях).