【发布时间】:2014-03-07 13:32:36
【问题描述】:
我使用 JSF 2.2、Primefaces、Tomcat 7 依赖项创建了一个 Maven Web 应用程序。
我的 JSF 的实现是 Mojarra 2.2.4,我在我的 POM 上添加了这个依赖:
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.2.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.2.4</version>
<scope>compile</scope>
</dependency>
但不幸的是,tomcat7-maven-plugin 及其嵌入式 tomcat 存在问题。如果我使用 tomcat7:run 命令,我的 webapp 启动没有问题,但是当它尝试加载托管 bean 时,我收到此错误:
目标不可达,标识符“testBean”解析为空
这表明 web 应用正在使用 JSF 1.x 而不是 JSF 2.x。 JSF 1.x 的配置器无法识别 @ManagedBean 注释,这将导致它们不会自动加载/初始化而无需 faces-config.xml。
我使用的是tomcat嵌入式7.0.50,使用它配置:http://tomcat.apache.org/maven-plugin-trunk/tomcat7-maven-plugin/adjust-embedded-tomcat-version.html
但尽管我不认识 @ManagedBean 注释,但它只能在 faces-config.xml 上使用 managedbean 标记。
有没有办法将 JSF 2.x 支持包含到 Tomcat Embedded for maven7-tomcat-plugin?
PS:tomcat7:run-war 有效,但我不喜欢,因为它显然是静态运行,不可能动态更改 xhtml 代码(例如)。
【问题讨论】:
-
我不明白这个问题。 JSF 是与您的应用程序一起部署的,不是吗?
-
是的,我的 POM 上有 JSF 依赖项,但问题是 Maven Tomcat Embedded。它不识别 JSF 2.X。事实上,如果我构建 WAR 并将其部署在外部 Tomcat 上,webapp 就可以工作。
-
顺便说一句,永恒“目标无法到达,标识符 [beanname] 解析为 null”的有趣原因。我以前看到过有关此问题的问题,但没有明显的原因。我想知道 Maven+Embedded-Tomcat 到底在这里做什么。
-
问题是由于插件的影响(它没有在 WAR 或目录中运行 webapp),注释扫描算法无法正常运行。如果您使用的是 MyFaces,请尝试设置 org.apache.myfaces.annotation.SCAN_PACKAGES 参数,以指示扫描所选包的算法。
-
这是一个你应该放在 web.xml 上的参数。我不知道 Mojarra 背后的细节,但我想它存在一个类似的参数但我不知道它是否会起作用,因为我们必须做一些特殊的东西来让它在很久以前就可以工作,与默认算法不同规范提出的。我可以告诉你的是,在 MyFaces 中添加的参数正是为了解决这些情况。切换到 MyFaces 很简单,会让您的生活更轻松。尝试 2.2.0 工件。
标签: java maven jsf-2 plugins embedded-tomcat-7