【问题标题】:Common Facelets files in shared library JAR outside /WEB-INF/lib/WEB-INF/lib 外部共享库 JAR 中的常见 Facelets 文件
【发布时间】:2014-11-19 08:32:26
【问题描述】:

我有一个公共共享库(在 Websphere 应用程序服务器中设置为共享库)。

那个jar的文件夹结构是:

UtilityJAR
----src
       -com
          -test
            -TestClass.java
---- META-INF
       -resources    
          -template.xhtml
          -css
             -style.css

在我的 Web 项目中,我有一个名为 User.xhtml 的模板客户端文件,它使用来自上述共享库的模板文件

ui:composition  template="/template.xhtml"

当我在 Web 应用程序的 WEB-INF/lib 文件夹中有上述 jar 文件时,应用程序工作正常,没有任何问题(模板.xhtml 被识别)。当我从该应用程序的 Lib 文件夹中删除 jar 并将其作为共享库放在 Websphere 中时(因为我需要来自 4 个以上应用程序的这个 jar 文件,并且我不想在所有 4 个应用程序中复制这个 jar),我收到以下错误消息。

[9/24/14 14:09:17:936 EDT] 00000113 ServletWrappe E com.ibm.ws.webcontainer.servlet.ServletWrapper service SRVE0014E: Uncaught service() exception root cause Faces Servlet: java.io.FileNotFoundException: /template.xhtml Not Found in ExternalContext as a Resource

Utility jar 中包含 faces-config 和 @ManagedBean 注解,当 jar 位于应用程序的 WEB-INF/lib 文件夹中时,该注解可以工作。

以前有人遇到过这个问题吗?感谢您的帮助。

【问题讨论】:

    标签: jsf-2 jar shared-libraries facelets filenotfoundexception


    【解决方案1】:

    包含 webapp 资源的 Web 片段 JAR必须放在 webapp 的 /WEB-INF/lib

    来自Servlet 3.0 specification 第 37 页(重点是我的):

    4.6 资源

    ...

    getResourcegetResourceAsStream 方法采用带前导的字符串 “/” 作为参数,给出资源相对于根目录的路径 上下文或相对于内 JAR 文件的 META-INF/resources 目录 web 应用程序的 WEB-INF/lib 目录。这些方法将首先搜索根 在查看任何 WEB-INF/lib 目录中的 JAR 文件。 JAR 文件在 WEB-INF/lib 目录被扫描是未定义的。这种文档层次结构可能 存在于服务器的文件系统、Web 应用程序归档文件、远程服务器上, 或在其他位置。

    ...

    如果您真的想将它们放在其他地方(坏主意!),那么您需要自行开发一个自定义 Facelets 资源解析器。你可以在这里找到一个启动示例:How to create a modular JSF 2.0 application?

    另见:

    【讨论】:

    • 感谢@BalusC 的回复。所以,如果我需要将通用模板文件放在一个 jar 中,那么我必须将它包含在我所有应用程序的 LIB 文件夹中吗? (除了自定义资源解析器,还有其他方法吗?)
    • 没错。如果您使用依赖管理和构建系统,如 Maven,应该毫不费力。
    • 即使使用 Maven,如果我更改 jar 中的模板文件/java 文件,我必须为所有 5 个使用更新的 jar 的应用程序重新构建所有 EAR 文件?这不是共享库有用的原因吗,只是为了替换 Websphere 共享库上的 jar,并且所有应用程序在重启后都使用这个新 jar?
    • 这不是共享库有用的原因吗,只是为了替换 Websphere Shared Libraries 上的 jar 并且所有应用程序在重新启动后都使用这个新 jar?有没有办法避免再次创建 5 个 EAR 文件并更新所有应用程序
    • WebSphere 的“共享库”适用于基于 Java SE 的 JAR(Apache Commons、Guava 等),而不适用于基于 Java EE 的 Web 片段 JAR。 “避免”这种情况的方法是使用一个持续集成系统,它会自动完成所有这些工作(例如 Jenkins、Hudson 等)。
    猜你喜欢
    • 2022-08-16
    • 2010-11-29
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    相关资源
    最近更新 更多