Java Maven项目中重复的context.xml

Java Maven项目中重复的context.xml,java,maven,tomcat,Java,Maven,Tomcat,我有以下项目结构: src/ main/ java/ ... resources/ META-INF/ context.xml persistence.xml webapp/ WEB-INF/ web.xml ... ... test/ ... xml(特别是,buildpart)如下所示: <build> <finalNam

我有以下项目结构:

src/
  main/
    java/
      ...
    resources/
      META-INF/
        context.xml
        persistence.xml
    webapp/
      WEB-INF/
        web.xml
        ...
      ...
  test/
    ...
xml(特别是,
build
part)如下所示:

<build>
<finalName>...</finalName>

<plugins>
  <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
  </plugin>

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.3</version>
    <configuration>
      <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
      <containerConfigXML>src/main/resources/META-INF/context.xml</containerConfigXML>
    </configuration>
  </plugin>
</plugins>
</build>

...
maven编译器插件
3.1
org.apache.maven.plugins
maven战争插件
2.3
src/main/webapp/WEB-INF/WEB.xml
src/main/resources/META-INF/context.xml
问题是,
context.xml
在由此引发的战争中翻了一番。它出现在

  • /META-INF
    -这是它的正确位置,而且
  • /WEB-INF/classes/META-INF
    。我看到它和其他任何资源一样从
    resources
    文件夹复制到这里

  • 应用程序部署完美无瑕,但这种重复确实困扰着我。我的设置有什么问题?

    n一般来说,对于基于Java的Maven项目,非源文件应该放在项目的src/main/resources子目录中。在构建的过程资源阶段,该资源目录的内容将复制到输出目录(默认情况下为目标/类)

    对于Maven WAR项目,它稍微复杂一些:还有src/main/webapp目录,Maven希望在其中找到WEB-INF/WEB.xml

    由于WEB-INF目录必须存在于src/main/webapp下,我建议避免在src/main/resources中再次定义它。虽然这是完全有效的,并且两个目录的内容将被合并,但如果在这两个目录中都定义了文件,则可能会产生混淆。src/main/resources的内容将优先于src/main/webapp的内容顶部

    因此您看到了重复。

    下添加
    元素,并明确排除该文件

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <excludes>
                <exclude>META-INF/context.xml</exclude>
            </excludes>
        </resource>
    </resources>
    
    
    src/main/resources
    真的
    META-INF/context.xml
    
    对于WAR构建,maven使用以下默认值:

    src/main/java goes to /WEB-INF/classes
    src/main/resources goes to /WEB-INF/classes
    src/main/webapp goes to /
    
    因此,为了快速解决您的问题,只需将META-INF从src/main/resources移动到src/main/webapp


    还要确保您更新了
    containerConfigXML

    ,首先,我们讨论的是META-INF及其内容,而不是WEB-INF。好吧,我理解复制是如何发生的,问题是如何避免。是的,这看起来更像是一种变通方法,而不是一个明确的解决方案,但很有效。这个问题很久以前就被提出了。您现在有合适的解决方案吗?
    context.xml
    应该位于webapp/META-INF下,并用
    src/main/webapp/META-INF/context.xml