Maven profile整合Spring profile

在Maven的pom.xml和Spring框架中,都有profile這個概念。profile是用於區分各類環境的,例如開發環境、測試環境、正式環境等。Maven的profile常常用於在打包時根據指定環境打入不一樣的配置文件配置,如數據庫配置。Spring的Profile能夠用於在不一樣的環境下加載不一樣的bean,例如@Profile註解。本文介紹如何將兩者整合。java

Spring啓用一個profile

Spring啓用某個profile有多種方式,爲了便於整合Maven,這裏經過web.xml方式啓用:web

<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>dev</param-value>
</context-param>

在默認狀況下,會啓用Spring的dev profile,即開發環境。spring

Maven profile配置

在pom.xml中,能夠配置test和product兩個profile,分別對應測試環境和正式環境。這裏也能夠根據具體狀況自定義。數據庫

<profiles>
  <profile>
    <id>test</id>
    ...
  </profile>
  <profile>
    <id>product</id>
    ...
  </profile>
</profiles>

此時,運行mvn clean package -Ptest就會使用id爲test的profile內的配置打包,mvn clean package -Pproduct就是用來打正式環境包的命令。app

web.xml內容替換

在web.xml中<param-value>dev</param-value>是指定Spring的profile,接下里要實現這個內容的替換,讓mvn clean package -Ptest打包出來的web.xml變成<param-value>test</param-value>。這裏可使用maven-antrun-plugin來實現字符串替換:框架

<profiles>
  <profile>
    <id>test</id>
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.8</version>
          <executions>
            <execution>
              <phase>compile</phase>
              <configuration>
                <target>
                  <!-- web.xml中的<param-value>dev</param-value>替換爲<param-value>test</param-value> -->
                  <replace file="${basedir}/src/main/webapp/WEB-INF/web.xml"
                           token="&lt;param-value&gt;dev&lt;/param-value&gt;"
                           value="&lt;param-value&gt;test&lt;/param-value&gt;" />
                </target>
              </configuration>
              <goals>
                <goal>run</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>
  <profile>
    <id>product</id>
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.8</version>
          <executions>
            <execution>
              <phase>compile</phase>
              <configuration>
                <target>
                  <!-- web.xml中的<param-value>dev</param-value>替換爲<param-value>product</param-value> -->
                  <replace file="${basedir}/src/main/webapp/WEB-INF/web.xml"
                           token="&lt;param-value&gt;dev&lt;/param-value&gt;"
                           value="&lt;param-value&gt;product&lt;/param-value&gt;" />
                </target>
              </configuration>
              <goals>
                <goal>run</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>


以上的<replace file="" token="" value="" />中分別用於指定文件、待替換字符串、替換後的字符串。這裏爲何不寫成token="dev"?考慮到」dev」這個字符串過短,可能會在web.xml中別的地方出現,防止誤傷,因此這裏會用token="&lt;param-value&gt;dev&lt;/param-value&gt;"webapp

以上配置加入到pom.xml中後,再經過mvn clean package -Ptestmvn clean package -Pproduct命令打包,打包好的war包解壓出來,能夠發現<param-value>dev</param-value>被替換成了<param-value>test</param-value><param-value>product</param-value>。此時便完成了Maven和Spring的profile的整合。maven

優化:打包時不修改src目錄下的web.xml

若是使用mvn clean package -Ptestmvn clean package -Pproduct打包,會形成項目中的web.xml修改替換,此時若是忘了改回來,會形成一些問題,如再次打不一樣環境的包就找不到<param-value>dev</param-value>來replace了,還有若是此時在開發中調試會誤啓用其餘的Spring profile。測試

爲了解決這個問題,咱們能夠經過maven-antrun-plugin插件在replace前將web.xml拷貝一份出來,在拷貝出的web.xml文件上執行replace操做,打包時將拷貝出的web.xml打入war包,從而不影響原有的web.xml文件內容。優化

<profiles>
  <profile>
    <id>test</id>
    <properties>
      <!-- 使用target/web-xml中的web.xml文件打入war包 -->
      <maven.war.webxml>${basedir}/target/web-xml/web.xml</maven.war.webxml>
    </properties>
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.8</version>
          <executions>
            <execution>
              <phase>compile</phase>
              <configuration>
                <target>
                  <!-- 將web.xml拷貝一份到target/web-xml目錄下 -->
                  <copy file="${basedir}/src/main/webapp/WEB-INF/web.xml"
                        todir="${basedir}/target/web-xml" />
                  <!-- 拷貝後的web.xml中的<param-value>dev</param-value>替換爲<param-value>test</param-value> -->
                  <replace file="${basedir}/target/web-xml/web.xml"
                           token="&lt;param-value&gt;dev&lt;/param-value&gt;"
                           value="&lt;param-value&gt;test&lt;/param-value&gt;" />
                </target>
              </configuration>
              <goals>
                <goal>run</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>
  <profile>
    <id>product</id>
    <properties>
      <!-- 使用target/web-xml中的web.xml文件打入war包 -->
      <maven.war.webxml>${basedir}/target/web-xml/web.xml</maven.war.webxml>
    </properties>
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.8</version>
          <executions>
            <execution>
              <phase>compile</phase>
              <configuration>
                <target>
                  <!-- 將web.xml拷貝一份到target/web-xml目錄下 -->
                  <copy file="${basedir}/src/main/webapp/WEB-INF/web.xml"
                        todir="${basedir}/target/web-xml" />
                  <!-- 拷貝後的web.xml中的<param-value>dev</param-value>替換爲<param-value>product</param-value> -->
                  <replace file="${basedir}/target/web-xml/web.xml"
                           token="&lt;param-value&gt;dev&lt;/param-value&gt;"
                           value="&lt;param-value&gt;product&lt;/param-value&gt;" />
                </target>
              </configuration>
              <goals>
                <goal>run</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>


爲何不使用多個web.xml文件

以上是使用了一種web.xml文件字符串替換的方式來實現Maven和Spring的profile整合。另外還有一種配置多個web.xml文件的方式,即爲每一個profile拷貝一份web.xml,修改相應spring.profiles.active的值,pom.xml中每一個profile指定對應的maven.war.webxml將相應的web.xml打入war包。若是項目須要常常修改web.xml文件內容,每次都要修改好幾份web.xml文件會很是麻煩,因此不推薦使用。

相關文章
相關標籤/搜索