Maven配置文件过滤器在构建WAR时起作用,但在Tomcat7中不起作用

时间:2014-04-09 18:09:32

标签: java maven tomcat

我尝试使用Maven在开发和生产中的web.xml文件中引入不同的配置点。看起来使用配置文件和过滤器是一种方法,当我使用" mvn install"构建WAR文件时,这确实有用。或" mvn包。"但是,通过Tomcat 7插件运行它总是导致"无法解析占位符"错误。以下是相关部分:

web.xml中的

- 这是我尝试设置

的占位符
/WEB-INF/${sec-file-path}

在pom.xml中

<profiles>
    <profile>
        <id>development</id>
        <properties>
            <sec-file-path>one-thing-for-dev.xml</sec-file-path>
        </properties>
    </profile>
    <profile>
        <id>production</id>
        <properties>
            <sec-file-path>one-thing-for-prod.xml</sec-file-path>
        </properties>
    </profile>
</profiles>

....

        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.0</version>
        </plugin>

        <plugin>
            <artifactId> maven-war-plugin </artifactId>
            <version>2.4</version>
            <configuration>
                <webResources>
                    <resource>
                        <filtering>true</filtering>
                        <directory>src/main/webapp</directory>
                        <includes>
                            <include>**/web.xml</include>
                        </includes>
                    </resource>
                </webResources>
                <warSourceDirectory>src/main/webapp</warSourceDirectory>
                <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
            </configuration>
        </plugin>

运行命令&#34; mvn package -P development&#34;按预期工作并适当填写占位符。但是,运行&#34; mvn tomcat7:运行-P开发&#34;结果导致&#34;无法解决占位符&#34;错误。欢迎大家提出意见。

1 个答案:

答案 0 :(得分:0)

我发现了类似的行为,在运行mvn tomcat时:run(Tomcat 6)会(貌似)正确放置占位符值,但突然mvn tomcat7:run(Tomcat 7)会失败。

我认为,实际上,Tomcat6插件超出了它的界限,Tomcat7插件正常工作。 (我不是Spring或Maven的专家,所以请大量使用该语句。)

Spring文件(applicationContext.xml)应该从属性占位符文件而不是Maven过滤器进程获取其占位符值。

如何解决此问题的方法是使用Spring控制的属性文件中的占位符值而不是maven过滤器文件。您仍然可以利用过滤器文件中的数据,只需将它们传递给属性文件即可完成工作。

照常设置过滤器:

的pom.xml

<build>
    <filters>
        <filter>src/main/filters/local.properties</filter>
    </filters>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/webapp</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
...
</build>

创建过滤器属性文件:

的src /主/滤波器/ local.properties

# Session
session.timeout=20

创建Spring占位符属性文件:

的src /主/资源/ META-INF /弹簧/ timeout.properties

# Session
spring.session.timeout = ${session.timeout}

最后,在应用程序上下文中配置占位符:

的src /主/资源/ META-INF /弹簧/ applicationContext.xml的

<beans xmlns="http://www.springframework.org/schema/beans"  xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans      http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-   context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">

<!--  Properties file for Session Configuration --> 
<context:property-placeholder location="/opt/Projects/workspace/application_server/src/main/webapp/WEB-INF/spring/*.properties"/>
...

<bean id="timeout.example" class="java.lang.Integer">
    <constructor-arg value="${spring.session.timeout}"/>
</bean>

</beans>

当Maven运行其资源阶段时,timeout.properties文件中的占位符值将更新为它在local.properties文件中找到的值。

当Spring进程运行时#34;之后&#34; (在运行阶段)然后它将询问applicationContext.xml文件以找到占位符,它将填充它在PlaceholderConfigured文件中找到的值(timeout.properties)。

(注意:变量名称不必相同(例如spring.session.timeout与session.timeout)。我只是在这里区分两者。)