执行maven安装目标时,不会替换属性文件中的占位符

时间:2016-01-23 17:25:47

标签: java maven maven-war-plugin

我想根据配置文件('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/

2 个答案:

答案 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