【问题标题】:When using /META-INF/resources, where does WEB-INF go? [duplicate]使用 /META-INF/resources 时,WEB-INF 去哪里了? [复制]
【发布时间】:2018-07-31 12:15:13
【问题描述】:

我将所有网络资源放入/META-INF/resources,以便在不同的网络应用程序中重复使用它们。

但是WEB-INF/ 内部的web.xml 呢?我必须把它保存在src/main/webapp/ 中还是我也可以把它放在src/main/resources/ 下?

如果是这样,我必须把它放在哪里? src/main/resources/WEB-INF/ 或 src/main/resources//META-INF/resources/WEB-INF/?

我使用 Maven 和 Assembly 插件来构建我的项目,而不是 WAR 插件。

【问题讨论】:

    标签: jakarta-ee


    【解决方案1】:

    简而言之,你可以。

    自 Servlet 3.0 起,您可以在常规 jar 文件中的 Web 应用程序之间共享 Java 类、Web 资源和 web-fragment.xml 文件。这些 jar 被称为“网络片段”。

    来自 Servlet 3.1 规范的 §8.2.1:

    ...

    Web 片段是 Web 应用程序的逻辑分区,这样 Web 应用程序中使用的框架可以定义所有工件,而无需要求开发人员在 web.xml 中编辑或添加信息。它可以包含几乎所有 web.xml 描述符使用的相同元素。然而,描述符的顶级元素必须是 web-fragment,并且相应的描述符文件必须称为 web-fragment.xml。 web-fragment.xml 和 web.xml 之间的排序相关元素也不同,请参阅第 14 章部署描述符部分中的 web-fragments 的相应架构。

    如果一个框架被打包成一个jar文件并且有部署描述符形式的元数据信息,那么web-fragment.xml描述符必须在jar文件的META-INF/目录下。

    ...

    因此,无需尝试以某种方式嵌入 web.xml 文件,您只需将相同的内容放在 META-INF/web-fragment.xml 文件中(它共享大部分 web.xml XSD)。

    您的网络资源进入您已经发现的 META-INF/resources 中。

    总而言之,您可以轻松地在普通 jar 文件中构建共享组件。你真的不需要弄乱 maven-assembly-plugin 来完成这个。

    【讨论】:

      【解决方案2】:

      在 maven 项目中,web.xml 的标准位置是 src/main/webapp/WEB-INF,如果需要,您可以更改它,但在生成的 .war 文件中,web.xml 必须包含在其中WEB-INF 文件夹。

      因此,将web.xml 放入src/main/resources/META-INF 是行不通的。

      对于较新的Servlet 规范(我认为Servlet 3.0 及以上),您可以使用注释,web.xml 不是强制性的。

      编辑: 注意web.xml是war文件(web应用)的标准配置文件,在jar文件(库)中会被忽略

      【讨论】:

      • 虽然 OP 没有使用正确的术语,但 OP 基本上是在谈论“网络片段”JAR 项目,而不是 WAR 项目。您的回答无效。
      • 哦,我明白了,然后注意web.xml是war文件(Web应用程序)的标准配置文件,它在jar文件(库)中不起作用。
      • 谢谢,这让我走上了正轨。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-13
      • 2012-05-06
      • 2013-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多