Java 将web内容存储在JAR文件中

Java 将web内容存储在JAR文件中,java,jakarta-ee,web-applications,jar,web-content,Java,Jakarta Ee,Web Applications,Jar,Web Content,是否可以将web内容(如JSP、HTML、图像、CSS等)存储在JAR文件中 我一直在研究web应用程序的各种选项,这是一种可能性 我们目前正在使用JSF和Facelets作为我们的视图技术——我认为可以编写某种形式的自定义视图解析器,它将检查类路径而不是文件系统目录,但我不确定这是否可行 任何想法都将不胜感激!:) 更新:我可能应该澄清一下。如何让web容器(如Tomcat)从JAR文件加载资源?例如,我在web应用程序中部署了一个.war文件。如果我访问/index.jsp,容器将尝试在we

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

我一直在研究web应用程序的各种选项,这是一种可能性

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

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

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


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

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

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

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

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

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

您也可以使用Weblet项目(请参阅)

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

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


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

如果您使用Maven构建Web应用程序,您可以构建资源战,并在构建时将该战覆盖到Web应用程序战上

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

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


有关Core JavaServer Faces,第三版中的。382,它讨论了在JAR文件中打包复合组件

您只需将复合组件及其构件(如JavaScript、样式表或属性文件)放在JAR的META-INF目录下,如图9-14所示


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

谢谢,这非常有用。现在,如果有办法将JSF pagse本身放入.jar文件中。。。
components.jar
+-- META-INF
    +-- resources
        +-- css
        |   +-- styles.css
        +-- images
        |   +-- back.png
        +-- util
            +-- icon.xhtml
            +-- login.js
            +-- login.properties