Profile

有時候我們必須依環境不同,而有不同的作法,所以可以用Profile將各個Plugin作區別設定, 然後以 "mvn -P設定" 來決定要如何執行特定的Plugin。 例如在Andord開發的時候,用模擬器測試的時候,為加快速度,根本不必考慮簽署apk的問題,但是發佈App時則一定要簽署才行。 所以我們設定如下:

<project ...>
    <profiles>
        <profile>
            <id>sign</id><!--我們自行命名的Profile-->
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-jarsigner-plugin</artifactId>
                        <version>3.0.0</version>
                        <executions>
                            <execution>
                                <id>signing</id><!--為執行的作業命名-->
                                <goals>
                                    <goal>sign</goal><!--我們要執行的Goal-->
                                </goals>
                                <phase>package</phase><!--在Package的Phase執行這個Goal-->
                                <inherited>true</inherited>
                                <configuration>
                                    <archiveDirectory></archiveDirectory>
                                    <includes>
                                        <include>${project.build.directory}/*.apk</include><!--要簽署的apk-->
                                    </includes>
                                    <keystore>${somewhare}/keystorefile</keystore><!--key store檔案的所在路徑-->
                                    <storepass>key-store_password</storepass><!--Key sotre 的密碼--->
                                    <!--keypass>密碼</keypass --> <!-如果使用的key有密碼的話--->
                                    <alias>key's alias name</alias><!--加簽所使用的 alias-->
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

所以最後要建立發佈的App時,只要執行 "mvn -Psign install "就可以為建立的apk檔案加簽了。

另外的例子如Web程式在開發時用的是Window的環境,而發佈主機則是Linux環境,因為我們須要在環境內放一個system.properties 來為不同的環境設定不同的參數, 例如我們在專案下開了兩個目錄TomcatEnv?與JbossEnv?,裡面各放了一個system.properties,然後打打包專案時,才指定要用那一個檔案。

<project ...>
    <profiles>
        <profile>
        <id>product</id><!--我們自行命名的Profile-->
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <build>
          <plugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-war-plugin</artifactId>
              <version>3.4.0</version>
              <configuration>
                <webResources>
                  <resource>
                    <directory>productEnv</directory><!--引用的資源目錄-->
                    <targetPath>WEB-INF/classes</targetPath><!--打包時拷貝的目的目錄-->
                  </resource>
                </webResources>
              </configuration>
            </plugin>
          </plugins>
        </build>
        </profile>
        <profile>
        <id>develop</id><!--我們自行命名的Profile-->
        <build>
          <plugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-war-plugin</artifactId>
              <version>3.4.0</version>
              <configuration>
                <webResources>
                  <resource>
                    <directory>developEnv</directory><!--引用的資源目錄-->
                    <targetPath>WEB-INF/classes</targetPath><!--打包時拷貝的目的目錄-->
                  </resource>
                </webResources>
              </configuration>
            </plugin>
          </plugins>
        </build>
        </profile>
    </profiles>
</project>

上述只是示範,通常為了達成同樣的目的,我們只會用Maven本身的過濾功能(參見之前的目錄架構):

<project>
  <profiles>
    <profile>
      <id>product</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <spring.profiles.active>product</spring.profiles.active><!--配合Spring的@Profile-->
        <other4filter>d:\attach\<other4filter>
      </properties>
    </profile>
    <profile>
      <id>develop</id>
      <properties>
        <spring.profiles.active>develop</spring.profiles.active>
        <other4filter>${project.build.directory}/attach/<other4filter>
      </properties>
    </profile>
  </profiles>
  <build>
      <resources>
        <resource>
          <directory>${project.basedir}/src/main/resources</directory>
          <filtering>true</filtering>
        </resource>
      <</resources>
  </build>
</project>

所以當我們在開發環境時,執行Maven 總要加上 mvn -Pdevelop xxx,而要打包正式佈署的程式時,只要執行 mvn package 就可以了。