2016-01-23 220 views
1

我想根據配置文件('dev'或'prod')配置屬性文件,但是在執行時,屬性文件中的佔位符不會被替換maven安裝目標。在執行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/

回答

1

我只是測試你的設置,它工作正常:文件WEB-INF/classes/mongo.properties正確取代。

問題您有迴避的事實牯您輸出最終war下一個target文件夾內。這是一個非常糟糕的主意。目前,最終的WAR是在目錄output內生成的,該目錄對應於POM中的屬性tomcat-deploy-path

<tomcat-deploy-path>output</tomcat-deploy-path> 

的大問題,這樣的設置是運行mvn clean刪除該目錄,後續構建不會覆蓋它,這意味着戰爭將永遠不會被更新,你能不能讓一個古老過時的戰爭。我強烈建議你提出這個屬性的Maven下運行mvn clean時建立目錄,像

<tomcat-deploy-path>${project.build.directory}/output</tomcat-deploy-path> 

,使其適當清洗。

因此,要解決您的問題,您應手動刪除文件夾output並重新運行mvn clean install。它應該產生一個適當的新WAR。