11

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

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

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

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

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

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

4

6 回答 6

3

Yes, it is possible to store files e.g. properties, xml, xslt, image etc; in a JAR (or WAR) file and pull them at runtime.

To load a resource from your deployment jar, use the following code.

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

In a maven project, folders & files placed in resources are included in the jar. The filename is relative to the root of jar file, so "./filename.xml" would match the file filename.xml placed in "/src/java/resources".

于 2008-10-14T09:58:27.463 回答
3

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

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

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

有关覆盖的 Maven War 插件页面的更多信息。

于 2010-11-05T19:48:03.513 回答
1

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

于 2008-10-14T08:08:09.120 回答
1

您还可以使用 weblets 项目(请参阅https://weblets.dev.java.net/)。

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

<h:graphicImage src="weblet://some-name/images/someimage.jpg" .../>
于 2008-10-16T09:59:06.523 回答
1

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

于 2008-10-16T10:12:01.257 回答
1

在 Core JavaServer Faces,第 3 版中,在第 30 页的“在 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

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

于 2016-07-04T15:40:19.303 回答