使用 maven profile
一個項目可以部署在不同的環境當中,maven 的 profile 針對不同的環境指定各自的編譯方法。在 pom.xml 的 profile 中,可以根據不同的環境定制以下內容:
- <repositories>
- <pluginRepositories>
- <dependencies>
- <plugins>
- <properties>
- <dependencyManagement>
- <distributionManagement>
- <build>
- <defaultGoal>
- <resources>
- <testResources>
- <finalName>
可以設置默認激活的 profile
<profiles> <profile> <id>profile-1</id> <activation> <activeByDefault>true</activeByDefault> </activation> ... </profile> </profiles>
build 配置項
build 配置項可以在兩處出現:
<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"> ... <!-- 項目級別的構建,基礎配置 --> <build>...</build> <profiles> <profile> <!-- 特殊的構建 --> <build>...</build> </profile> </profiles> </project>
以下是 build 的詳細配置
<build> <defaultGoal>install</defaultGoal> <directory>${basedir}/target</directory> <finalName>${artifactId}-${version}</finalName> <filters> <!-- 過濾器,用於過濾resource中的各個文件 --> <filter>filters/filter1.properties</filter> </filters> <resources> <resource> <targetPath>META-INF/plexus</targetPath> <filtering>false</filtering> <!-- 是否使用過濾器 --> <directory>${basedir}/src/main/plexus</directory> <includes> <include>configuration.xml</include> </includes> <excludes> <exclude>**/*.properties</exclude> </excludes> </resource> </resources> <testResources> ... </testResources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.0</version> <extensions>false</extensions> <!-- 是否使用擴展 --> <inherited>true</inherited> <!-- 是否可繼承 --> <configuration> <!-- 當前插件的配置 --> <classifier>test</classifier> </configuration> <dependencies>...</dependencies> <executions> <!-- 配置插件在哪個階段使用 --> <execution> <id>echodir</id> <goals> <goal>run</goal> </goals> <phase>verify</phase> <inherited>false</inherited> <configuration> <tasks> <echo>Build Dir: ${project.build.directory}</echo> </tasks> </configuration> </execution> </executions> </plugin> </plugins> <sourceDirectory>${basedir}/src/main/java</sourceDirectory> <scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory> <testSourceDirectory>${basedir}/src/test/java</testSourceDirectory> <outputDirectory>${basedir}/target/classes</outputDirectory> <testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory> <extensions> <!-- 通過擴展來修改插件的行為 --> <extension> <groupId>org.apache.maven.wagon</groupId> <artifactId>wagon-ftp</artifactId> <version>1.0-alpha-3</version> </extension> </extensions> </build>
filter 規則
maven 通過過濾器來修改部署時的不同配置。部署時的所有資源的配置,如果根據環境不同,有不同的配置,則需要在資源中加上以下形式的標記:
${tag.subtag}
如,在 spring.xml 中要配置上傳文件的路徑:
<beans> <bean id="uploadService" class="com.oist.project.service.UploadServiceImpl"> <property name="uploadDir" value="${spring.uploadDir}"/> </bean> </beans>
在 pom.xml 中進行以下配置:
<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"> ... <build> <filters> <!-- 指定 filter --> <filter>src/main/filters/${deploy.env}.properties</filter> </filters> <resources> <resource> <!-- spring.xml 應該在 src/main/resource 目錄下 --> <filtering>true</filtering> <!-- 是否使用過濾器 --> </resource> </resources> </build> <profiles> <profile> <id>development</id> <activation> <activeByDefault>true</activeByDefault> </activation> <propertys> <deploy.env>develop</deploy.env> </propertys> </profile> <profile> <id>test</id> <propertys> <deploy.env>test</deploy.env> </propertys> </profile> <profile> <id>production</id> <propertys> <deploy.env>production</deploy.env> </propertys> </profile> </profiles> </project>
然后就可以針對不同的環境設置不同的目錄了:
src/main/filters/develop.properties 文件
# 上傳路徑: spring.uploadDir=c:/uploadDir
src/main/filters/test.properties 文件
# 上傳路徑: spring.uploadDir=/tmp/upload_dir
src/main/filters/production.properties 文件
# 上傳路徑: spring.uploadDir=/app/project/upload_dir
如果配置了多個 filter,並且兩個 filter 中有相同的 key,則后面的 value 為最終取值。
<build> <filters> <filter>src/main/filters/production.properties</filter> <filter>src/main/filters/test.properties</filter> </filters> </build>
如以上的配置,因為 test.properties 在最后,因而 spring.uploadDir 為 test.properties 的取值 /tmp/upload_dir
maven 的 properties 加載順序
- <build><filters> 中的配置
- pom.xml 中的 <properties>
- mvn -Dproperty=value 中定義的 property
相同 key 的 property,以最后一個文件中的配置為最終配置。
利用這一規則,可以在打升級 war 包的時候,不將 lib/*.jar 打進 war 包。
<project> ... <properties> <lib.exclude>abc.jar</lib.exclude> </properties> ... <build> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.3</version> <configuration> <packagingExcludes>WEB-INF/lib/${lib.exclude}.jar</packagingExcludes> </configuration> </plugin> </build> </project>
打第一個 war 包的時候,可以使用以下命令:
mvn clean compile war:war -Pproduction
今后要升級,不用再把 lib 打進 war 包(這樣可以使得 war 包體積減少很多),可以使用以下的命令:
mvn clean compile war:war -Pproduction -Dlib.execlude=*
