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 注解的组件/转换器/验证器扫描的主要内容,如果未能解决你的问题,请参考以下文章
用于嵌入式 Tomcat 8.5 的 Tomcat Maven 插件
如何使用 maven 插件 tomcat7:run with multiple contexts (WARs)?