我尝试使用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;错误。欢迎大家提出意见。
答案 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)。我只是在这里区分两者。)