2013-08-01 49 views
12

我的工作,它使用JAAS,不幸的是,我的Tomcat需要一个文件被放在一个META-INF文件夹中的战争的根源项目META-INF文件夹Maven的战争在两个地方

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

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

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

所以我使用Maven,其中指出,在任何的src /主/资源/ 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应该是类文件夹下,如#2,为什么maven war创建#1文件夹。有没有办法让文件复制到该文件夹​​而不是#2?

问候

回答

11

所以我发现这一点:

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客户端的请求而作为内容提供,尽管其内容对servlet代码可通过ServletContext上的getResource和getResourceAsStream调用来看到。此外,访问META-INF 目录中资源的任何请求都必须返回一个SC_NOT_FOUND(404)响应。

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

+0

.war文件是一个.jar文件,因此它可以具有META-INF目录,就像.jar文件一样。 – Hong