18

我正在开发一个使用 JAAS 的项目,不幸的是,Tomcat 需要将一个文件放在战争根目录的 META-INF 文件夹中

app.war
  |__META-INF
  |    |___context.xml
 ...

我认为这已经很奇怪了,因为 WAR 的默认 META-INF 位置位于类文件夹中。

app.war
  |__WEB-INF
  |    |__classes
  |         |__META-INF
 ...

所以我正在使用 Maven,它指出 src/main/resources/META-INF 中的任何内容都将被复制到适当的位置,它确实如此。奇怪的是,它还在文件结构的根目录中创建了一个 META-INF 文件夹,给我留下了 2 个 META-INF 文件夹。

项目结构

app
  |__src/main/java
  |__src/main/resources
  |       |__META-INF
  |             |__context.xml
 ...

mvn包后

 app
  |__META-INF [1]
  |__WEB-INF
  |     |__classes
  |           |__META-INF [2]
  |                  |__context.xml
 ...

所以,如果战争标准规定 META-INF 应该在 classes 文件夹下,如 #2 中,为什么 maven war 会创建 #1 文件夹。有没有办法让它将文件复制到该文件夹​​而不是#2?

问候

4

1 回答 1

13

所以我发现了这个:

两个 Meta-Inf 文件夹 - 正常结构?

这表明拥有 2 个 META-INF 文件夹不是问题。挖掘了一下我发现:

JAR 文件规范

其中说明了 META-INF 文件夹:

JAR 文件本质上是一个包含可选 META-INF 目录的 zip 文件。... META-INF 目录(如果存在)用于存储包和扩展配置数据,包括安全性、版本控制、扩展和服务。

和这个:

JSR-000315 JavaTM Servlet 3.0

其中,在第 10.6 节中,说明了 WAR 文件结构:

当打包成这种形式时,将出现一个 META-INF 目录,其中包含对 Java 归档工具有用的信息。该目录不能直接作为内容由容器响应 Web 客户端的请求,尽管通过 ServletContext 上的 getResource 和 getResourceAsStream 调用,servlet 代码可以看到其内容。此外,任何访问 META-INF 目录中资源的请求都必须返回 SC_NOT_FOUND(404) 响应。

因此,从 WAR 规范来看,正确的位置是 WEB-INF/classes/META-INF。然而,由于 war 是一个特殊的 jar 文件,因此将 /META-INF 作为扩展点是有意义的。可以在 JPA persistence.xml 与 Tomcat context.xml 文件中看到如此不同的用途:前者应放在 WEB-INF/classes/META-INF 中,而后者应放在 /META-INF 中。

于 2013-08-02T12:41:04.690 回答