【问题标题】:Storing web content in a JAR file将 Web 内容存储在 JAR 文件中
【发布时间】:2010-09-17 01:13:55
【问题描述】:

是否可以将 Web 内容(例如 JSP、HTML、图像、CSS 等)存储在 JAR 文件中?

我一直在研究模块化 Web 应用程序的各种选项,这是一种可能性。

我们目前正在将 JSF 和 Facelets 用于我们的视图技术 - 我认为可以编写某种形式的自定义视图解析器来检查类路径而不是文件系统目录,但我不确定这是否会工作。

任何想法将不胜感激! :)

更新:我可能应该澄清一下。如何让 Web 容器(例如 Tomcat)从 JAR 文件中加载资源?例如,我在我的 Web 应用程序中部署了一个 .war 文件。如果我访问 /index.jsp,容器将尝试在 Web 内容目录中查找名为 index.jsp 的文件。

有没有一种简单的方法可以使用 Tomcat 等配置您自己的资源加载器,以便它搜索类路径以及文件系统?

【问题讨论】:

    标签: java jakarta-ee web-applications jar web-content


    【解决方案1】:

    在 Core JavaServer Faces,第 3 版中,在第 10 页的“在 JAR 中打包复合组件”下。 382,它谈到了将复合组件打包到 JAR 文件中。

    “您所要做的就是将您的复合组件及其工件(例如 JavaScript、样式表或属性文件)放在 JAR 中的 META-INF 目录下,如图 9-14 所示。”

    components.jar
    +-- META-INF
        +-- resources
            +-- css
            |   +-- styles.css
            +-- images
            |   +-- back.png
            +-- util
                +-- icon.xhtml
                +-- login.js
                +-- login.properties
    

    我不确定直接从其他应用程序而不是包含的复合组件访问这些资源是否容易。

    【讨论】:

      【解决方案2】:

      是的,可以存储文件,例如属性、xml、xslt、图像等;在 JAR(或 WAR)文件中并在运行时拉取它们。

      要从部署 jar 加载资源,请使用以下代码。

      this.getClass().getClassLoader().getResourceAsStream( filename ) ;
      

      在 maven 项目中,放置在资源中的文件夹和文件包含在 jar 中。文件名是相对于 jar 文件的根目录的,因此“./filename.xml”将匹配放在“/src/java/resources”中的文件 filename.xml。

      【讨论】:

        【解决方案3】:

        如果您使用 Maven 构建您的 webapp,您可以构建您的资源的 WAR,并在构建时将该 WAR 覆盖到您的 webapp WAR 上。

        包含所有 JSP、图像、CSS 等的资源 WAR 被称为“覆盖”,它只是目标 Web 应用中类型设置为“战争”的依赖项。

        当你打包你的 webapp 时,资源 WAR 只会复制非冲突文件。因此,如果您的项目中有一个唯一的 index.jsp,并且想在叠加层中使用它而不是 index.jsp,只需将其包含在您的目标 webapp 中,Maven 就不会复制该资源。

        有关Maven War plugin page about overlays的更多信息。

        【讨论】:

          【解决方案4】:

          标签文件就像一个 JSP 片段,可以放在一个 jar 中。使用标签文件,可以帮助你,但我从未尝试在 jar 中使用图像、CSS 等。

          【讨论】:

            【解决方案5】:

            您也可以使用 weblets 项目(参见https://weblets.dev.java.net/)。

            您将一些资源存储在 JAR 库中(例如图像、css、javascript...),然后编写一个非常简单的 weblet-config.xml。然后在 JSF 页面中,您可以直接使用以下语法引用它们:

            <h:graphicImage src="weblet://some-name/images/someimage.jpg" .../>
            

            【讨论】:

            • 谢谢,这真的很有用。现在,如果有办法让 JSF 将自己分页到 .jar 文件中...
            【解决方案6】:

            当然。哎呀,您可以将内容直接存储在 WAR 文件中,该文件基本上是一个带有一些额外位的 JAR 文件。是的,您可能需要编写一个自定义解析器来使用 ClassLoader.getResourceAsStream,但基本上,由于您可以根据自己的喜好生成内容,因此从 jar 文件中获取内容似乎非常合理。不过,您可能希望确保它只获取一组非常特定的扩展:)

            【讨论】:

              猜你喜欢
              • 2020-07-10
              • 2021-05-27
              • 1970-01-01
              • 1970-01-01
              • 2010-11-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多