Maven tomcat:run 目标和基于 jsf 注解的组件/转换器/验证器扫描

Posted

技术标签:

【中文标题】Maven tomcat:run 目标和基于 jsf 注解的组件/转换器/验证器扫描【英文标题】:Maven tomcat:run goal and jsf annotation based component/converter/validator scanning 【发布时间】:2011-05-23 11:44:23 【问题描述】:

我正在开发一个 JSF 2.0 应用程序 (Mojarra+Primefaces) 并使用 maven 构建环境。在我使用 faces-config.xml 文件注册我的自定义转换器和验证器之前,到目前为止一切都很顺利。然后我看到了 JSF 2.0 的一些语法糖——基于注解的配置方法。现在我想使用它,而不是 xml 配置文件。一个问题是 Mojarra 没有扫描我的注释类。我发现我需要将<faces-config ... metadata-complete="false"> 属性设置为false。现在它可以工作,但前提是我以mvn tomcat:run-war 目标而不是mvn tomcat:run 动态项目启动我的应用程序,这对于开发来说更舒适。 JSP 2.0 的规范说:

如果WEB-INF/faces-config.xml文件中的元素 包含值为“true”的元数据完整属性,实现不得执行注释 扫描除实现本身提供的那些类之外的任何类。否则,继续 跟随。

如果运行时发现应用程序配置资源中的条目与注释之间存在冲突,则 应用程序配置资源中的条目优先。 必须扫描 WEB-INF/classes 中的所有类。

对于应用程序的 WEB-INF/lib 目录中的每个 jar,如果 jar 包含“META-INF/faces-config.xml” 文件或匹配正则表达式“.*.faces-config.xml”的文件(甚至是空的),所有类在 必须扫描那个罐子。

但它没有说明在 maven 构建环境中运行的动态项目 :)!有没有人可以解决这个问题?

干杯,

凯文

【问题讨论】:

【参考方案1】:

我也有这个问题,但发现添加 war:inplace 目标使它对我有用。即使用

mvn clean war:inplace tomcat:run

而不仅仅是“tomcat:run”,它应该可以正常工作。

【讨论】:

【参考方案2】:

在我的例子中,log4j-web 中的 Log4jServletContainerInitializer 以某种方式阻止了 javax.faces 中的 FacesInitializer 被调用,它负责处理带注释的 JSF 类。

使用tomcat8-maven-plugin 和嵌入式tomcat 8.0.52。

war:inplace 工作,或者只是删除 log4j-web(使用手动 log4j 初始化和上下文管理)。

【讨论】:

【参考方案3】:

添加 org.apache.myfaces.annotation.SCAN_PACKAGES 为我修复了 tomcat7:run 目标

【讨论】:

以上是关于Maven tomcat:run 目标和基于 jsf 注解的组件/转换器/验证器扫描的主要内容,如果未能解决你的问题,请参考以下文章

使用maven的tomcat:run 部署tomcat

用于嵌入式 Tomcat 8.5 的 Tomcat Maven 插件

配置好maven后,设置tomcat:run运行程序

如何使用 maven 插件 tomcat7:run with multiple contexts (WARs)?

使用 Maven 在具有数据源的嵌入式 Tomcat 上进行部署

eclipse中使用maven插件的时候,运行tomcat7:run的时候报错