Maven war插件未按预期过滤

时间:2013-11-02 23:07:19

标签: maven filtering maven-war-plugin

我目前正在使用maven 3.1.1和maven war plugin 2.4(http://maven.apache.org/plugins/maven-war-plugin/war-mojo.html)建立一个Web项目。特别是,我正在尝试使用maven war插件复制和过滤资源,这种方式我过去已经完成并且有效。以下是相关的pom配置:

WAR插件配置

...
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1.1</version>
    <configuration>
        ...
        <webResources>
            <resource>
                <directory>src/main/webapp/META-INF</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
                <targetPath>META-INF</targetPath>
            </resource>
            ...
    </configuration>
</plugin>
...

激活的个人资料定义:

...
<profiles>
<profile>
    <id>dummyDev</id>
    <build>
        <filters>
            <filter>filters/development.properties</filter>
        </filters>
    </build>
</profile>
...

META-INF / context.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<Context reloadable="${tomcat.context.reloadable}">
</Context>

最后是“development.properties”:

tomcat.context.reloadable=true

context.xml被复制到WAR中,但不会被过滤。如果我尝试在它运行的配置文件中直接写入属性(即不引用属性文件):它仅在我引用属性文件时才起作用。看起来在读取属性文件时出现了问题。此外,在“打包”后,maven没有告诉我在控制台中找不到属性文件(所以maven找到了文件)。

最后我尝试使用maven war插件版本2.1.1(和版本2.3)来实现它的工作原理:我尝试了多次只是改变maven war插件的版本,所以我很确定问题就是这样。

我错过了什么吗?这是maven war插件的已知错误吗?我是否正在尝试以正确的方式达到结果(过滤该文件)?感谢。

1 个答案:

答案 0 :(得分:9)

好吧,我搜索了maven war插件jira&f,并且说这实际上是一个错误,在2.4版本中引入(更多在http://jira.codehaus.org/browse/MWAR-301)。

为方便起见,我引用了jira问题中指出的解决方法:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        ...
        <filters>
            <filter>${project.basedir}/src/main/filters/my-filter.properties</filter>
        </filters>
    </configuration>
</plugin>

在我的皮肤上试过它并且有效。

无论如何,我注意到如果你在这个位置指定一个属性源文件(这是pom级别的war插件声明,而不是配置文件级别),这将始终被读取,即对于你指定的每个构建配置文件。除非你为每个构建配置文件重新声明war插件,并在每个配置文件中指定一组不同的属性文件(一个非常糟糕的解决方案,这里只指出错误的方式并且为了完整性,显然恕我直言),此解决方案仅限于必须始终读取给定属性文件的情况,无论指定的构建配置文件是什么。