我正在开发一个使用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 package之后
app
|__META-INF [1]
|__WEB-INF
| |__classes
| |__META-INF [2]
| |__context.xml
...
因此,如果战争标准规定META-INF应该在类文件夹下,如#2,为什么maven war会创建#1文件夹。有没有办法让它将文件复制到该文件夹而不是#2?
此致
答案 0 :(得分:12)
所以我发现了这个:
Two Meta-Inf folders - normal structure?
表示拥有2个META-INF文件夹不是问题。挖了一点我发现:
说明了META-INF文件夹:
JAR文件本质上是一个包含可选META-INF目录的zip文件。 ... META-INF目录(如果存在)用于存储包和扩展配置数据,包括安全性,版本控制,扩展和服务。
和此:
,在第10.6节中,说明了WAR文件结构:
当打包成这样的形式时,将出现META-INF目录 包含对Java归档工具有用的信息。 此目录不得直接使用 作为响应Web客户端请求的容器,它被用作内容 通过getResource和getResourceAsStream可以看到servlet代码的内容 调用ServletContext。此外,任何访问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中。