我想根据配置文件('dev'或'prod')配置属性文件,但是在执行maven安装目标时,属性文件中的占位符不会被替换。
这是pom文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>abc.myproject</groupId>
<artifactId>myartifact</artifactId>
<packaging>war</packaging>
<version>0.1.0-SNAPSHOT</version>
<name>projectname</name>
<description>Site Description</description>
<url>http://www.myproject.abc</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven-war-plugin.version>2.4</maven-war-plugin.version>
<tomcat-deploy-path>output</tomcat-deploy-path>
</properties>
<dependencies>
// various dependencies
</dependencies>
<build>
<finalName>v${project.artifactId}#${project.version}</finalName>
<filters>
<filter>src/main/resources/profiles/${build.profile.id}/mongo.properties</filter>
</filters>
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>${maven-war-plugin.version}</version>
<configuration>
<outputDirectory>${tomcat-deploy-path}</outputDirectory>
<failOnMissingWebXml>true</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<build.profile.id>dev</build.profile.id>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<build.profile.id>prod</build.profile.id>
</properties>
</profile>
</profiles>
</project>
占位符mongo.properties文件:
database.name=${database.name}
database.port=${database.port}
database.host=${database.host}
database.username=${database.username}
database.password=${database.password}
配置文件/ dev / mongo.properties文件:
database.name=mydatabase
database.port=27017
database.host=localhost
database.username=root
database.password=psw1
目录结构如下:
> myproject
pom.xml
> src
> main
> java
> resource
> profiles
mongo.properties
> dev
mongo.properties
> prod
mongo.properties
> webapp
> test
我按照此博客文章中的说明操作:http://www.petrikainulainen.net/programming/tips-and-tricks/creating-profile-specific-configuration-files-with-maven/
答案 0 :(得分:1)
我刚测试了您的设置并且工作正常:文件WEB-INF/classes/mongo.properties
已正确替换。
您遇到的问题是,您要在war
下的不文件夹中输出最终target
这一事实。这是一个非常糟糕的主意。目前,最终的WAR是在目录output
内生成的,该目录对应于POM中的属性tomcat-deploy-path
。
<tomcat-deploy-path>output</tomcat-deploy-path>
这种设置的一个大问题是,运行mvn clean
将不删除该目录,后续版本不会覆盖它,这意味着WAR将永远不会更新将保留旧的过时WAR。我强烈建议你在Maven构建目录下移动这个属性,比如
<tomcat-deploy-path>${project.build.directory}/output</tomcat-deploy-path>
以便在运行mvn clean
时正确清理。
因此,要解决您的问题,您应手动删除文件夹output
并重新运行mvn clean install
。它应该生成一个适当的新WAR。
答案 1 :(得分:0)
例如尝试使用 @..@
而不是 ${}
database.name=@database.name@
更多信息请参考:https://docs.spring.io/spring-boot/docs/1.4.x/reference/html/howto-properties-and-configuration.html