首页 文章

Maven war在两个地方都有META-INF文件夹

提问于
浏览
14

我正在开发一个使用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文件夹 .

Project Structure

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

After mvn package

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

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

问候

1 回答

  • 12

    所以我发现了这个:

    Two Meta-Inf folders - normal structure?

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

    JAR File Specification

    其中说明了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代码可见 . 此外,必须使用SC_NOT_FOUND(404)响应返回访问META-INF目录中的资源的任何请求 .

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

相关问题