代码之家  ›  专栏  ›  技术社区  ›  user7094

在jar文件中存储web内容

  •  11
  • user7094  · 技术社区  · 16 年前

    是否可以将web内容(如jsp、html、图像、css等)存储在jar文件中?

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

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

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

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

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

    6 回复  |  直到 8 年前
        1
  •  3
  •   Matt    14 年前

    如果你使用Maven来构建你的WebApp,你可以建立你的资源的战争,并把战争覆盖到你的WebApp战争中。

    包含所有jsp、图片、css等的资源战被称为“覆盖”,只是目标webapp中类型设置为“war”的依赖项。

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

    更多关于 Maven War plugin page about overlays .

        2
  •  3
  •   Martin Spamer    10 年前

    是的,可以将属性、xml、xslt、图像等文件存储在jar(或war)文件中,并在运行时提取它们。

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

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

    在maven项目中,放在资源中的文件夹和文件包含在jar中。文件名与JAR文件的根有关,所以“./FielNe.xml”将匹配放置在“/SRC/Java/Reales”中的文件FielnA.xml。

        3
  •  1
  •   Jon Skeet    16 年前

    当然。见鬼,你可以直接将内容存储在一个war文件中,这个文件基本上是一个带有一些额外位的jar文件。是的,您可能需要编写一个自定义解析器来使用classloader.getresourceasstream,但基本上,由于您可以随意生成内容,因此从jar文件获取内容似乎是完全合理的。您可能需要确保它只获取一组非常特定的扩展:)

        4
  •  1
  •   Romain Linsolas    16 年前

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

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

    <h:graphicImage src="weblet://some-name/images/someimage.jpg" .../>
    
        5
  •  1
  •   Dave    16 年前

    标签文件就像一个JSP片段,可以放置在一个JAR中。使用标记文件,可以帮助您,但我从来没有尝试过在jar中使用图像、css等。

        6
  •  0
  •   Pixelstix    8 年前

    在第三版的核心JavaServerFaces中,在第382页的“用JARS打包复合组件”下,讨论了如何用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
    

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