【问题标题】:Load facelet tag libraries using wildcards使用通配符加载 facelet 标记库
【发布时间】:2013-01-18 22:52:39
【问题描述】:

我将 JSF 2 与我自己构建的 facelet 标签一起使用,并且我在 taglib 文件中定义了该标签,名为 xxxx.taglib.xml。该项目分为war模块,在构建时由Maven合并。所以每个项目都有他自己的标签库,我希望将它们全部包含在生成的项目中。那么问题来了,有没有办法使用通配符访问每个 taglib 文件,使用 web.xml 中的单个表达式?类似的:

<context-param>
    <param-name>facelets.LIBRARIES</param-name>
    <param-value>classpath*:**/*.taglib.xml</param-value>
</context-param>

这应该从 /WEB-INF/classes 目录加载每个以 .taglib.xml 结尾的文件,但它不起作用。我正在使用 Tomcat 6。我错过了什么?

【问题讨论】:

    标签: jsf-2 tomcat6 facelets


    【解决方案1】:

    这是无效的语法。它必须是 webcontent-relative 路径,用分号分隔。您的项目和模块/构建设置可能并不完全正确。

    只需在/WEB-INF/lib 中创建一个以JAR 结尾的独立Java 项目,然后将taglib 文件放在/META-INF 文件夹中。如果有/META-INF/*.taglib.xml,JSF 还将扫描/WEB-INF/lib 中的每个JAR,然后自动注册它。为此,您不需要 facelets.LIBRARIES 上下文参数。将 Web 资源(如 XHTML 文件)放在 /META-INF/resources 文件夹中。请注意,这也是 PrimeFaces 等组件库的工作方式。

    您可能需要更改 Maven 以修复错误的构建方法。它应该构建模块项目的 JAR 并将它们放在目标 WAR 文件的 /WEB-INF/lib 中,并且绝对不会将来自单独项目的松散文件合并/覆盖在一个大的 /WEB-INF/classes 文件夹中。

    顺便说一句,facelets.LIBRARIES 是 Facelets 1.x 特有的,在 JSF 2.x 中已弃用。请改用javax.faces.FACELETS_LIBRARIES

    另见:

    【讨论】:

    • BalusC,非常感谢您的回答,我实现了让它工作,将标签库放在一个单独的项目中,最终在一个 JAR 文件中。但是我想问你,你认为将我所有的模块项目放在 jar 文件中绝对是更好的做法吗?我的意思是,我的一些模块会比基本系统本身更大,而且我还构建了它们的战争来维护 Web 项目的结构。在我使用 Maven 覆盖将它们与基本系统合并之后。通过这种方式,我也无需更多配置即可获得模块的 JSF 注释。
    • 大小不是一个有效的问题,是否是“最佳实践”。只需按照规范建议的正确方式进行即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 2012-01-22
    • 2011-09-29
    • 1970-01-01
    • 2015-04-30
    • 2017-09-02
    • 1970-01-01
    相关资源
    最近更新 更多