将Web内容存储在JAR文件中

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

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

我们目前正在使用JSF和Facelets作为我们的视图技术 – 我认为可能编写某种forms的自定义视图解析器来检查类路径而不是文件系统目录,但我不确定这是否有效。

任何想法,将不胜感激! 🙂

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

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

如果您使用Maven构建Web应用程序,则可以构建资源WAR并在构建时将该WAR重叠到webapp WAR上。

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

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

有关叠加层的Maven War插件页面的更多信息。

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

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

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

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

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

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

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

  

标记文件就像一个可以放在jar中的JSP片段。 使用标记文件可以帮到你,但我从来没有尝试过在jar中使用图像,CSS等。

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

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