借助Maven实现多环境下的打包

实际的工程开发中,我们经常接触到的部署场景至少存在本地,测试,生产三类。一般情况下三者之间有着或多或少的差异,诸如数据库链接地址,附件服务器存储路径等等。这种时候如果试图靠人工来进行相应的替换构建和部署,实在有违我们这个行业的初衷。

1. 概述

Maven提供了多种特性来帮助我们实现多环境下的打包构建。这次我们就以一个现实的场景为例,介绍一类完整的实现方式。

2. 场景介绍

场景如下:“产品需要被部署到多个地区,因此每次编译都要根据各个地方上不同的情况将诸如数据库配置,附件服务器位置配置等其它信息进行相应的替换,才能进行最终的测试和发包”。

3. 实现

3.1 项目目录结构

首先让我们看看目录结构:

│ pom.xml
└─src
    ├─main
    ├─test
    └─_res
        ├─assembly
        │      assembly.xml      # 供 maven-assembly-plugin 使用
        └─profiles
            ├─dev                # 开发环境配置
            ├─product            # 生产环境配置
            │  │  application.yml       # 存储有区域性配置的配置文件
            │  │  db.properties         # 存储有区域性配置的配置文件 
            │  │
            │  └─_area					# 区域特意信息
            │          Beijin.properties  
            │          Xian.properties
            │
            └─test               # 测试环境配置
3.2 pom.xml文件
	<properties>
		<jdk>1.8jdk>
		
		<build.assemblySavePath>C:/Users/LQ/Desktop/build.assemblySavePath>	
			
		<area.name>area.name>
	properties>

	<profiles>
		<profile>
			<id>productid> 
			<build>
				<resources>
					<resource>
						<directory>src\main\resourcesdirectory>
						<excludes>
							<exclude>application.ymlexclude>
							<exclude>db.propertiesexclude>
						excludes>
					resource>
				resources>

				<plugins>
					
					<plugin>
						<artifactId>maven-antrun-pluginartifactId>
						<version>1.8version>
						<executions>
							<execution>
								<phase>compilephase>
								<goals>
									<goal>rungoal>
								goals>
								<configuration>
									<tasks>										
										 
										<copy file="${basedir}/src/_res/profiles/product/db.properties"
											tofile="${project.build.directory}/db.properties" filtering="true"
											overwrite="true">
											<filterset filtersfile="${basedir}/src/_res/profiles/product/_area/${area.name}.properties">												
											filterset>
										copy>
										<copy file="${basedir}/src/_res/profiles/product/application.yml"
											tofile="${project.build.directory}/application.yml"
											filtering="true" overwrite="true">
											<filterset filtersfile="${basedir}/src/_res/profiles/product/_area/${area.name}.properties">
											filterset>
										copy>
									tasks>
								configuration>
							execution>
						executions>
					plugin>		

					
					<plugin>
						<groupId>org.apache.maven.pluginsgroupId>
						<artifactId>maven-assembly-pluginartifactId>
						<configuration>
							<skip>falseskip>
							
							<finalName>${project.artifactId}-${area.name}finalName>
							
							<appendAssemblyId>trueappendAssemblyId>							
							
							<outputDirectory>
								${build.assemblySavePath}
							outputDirectory>
							
							<descriptors>
								<descriptor>
									src/_res/assembly/assembly.xml
								descriptor>
							descriptors>

						configuration>
						<executions>
							<execution>
								
								<id>make-assemblyid>
								
								<phase>packagephase>
								<goals>
									<goal>singlegoal>
								goals>
							execution>
						executions>
					plugin>
				plugins>
			build>
		profile>
	profiles>
3.3 assembly.xml文件
<assembly
	xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">

	<id>binid>
	<formats>
		<format>zipformat>
	formats>
	
	<includeBaseDirectory>falseincludeBaseDirectory>
	
	<baseDirectory>xxxbaseDirectory>	
	
	<files>
		<file>
			
			<source>target/${artifactId}.jarsource>
			<outputDirectory>.outputDirectory>
			<destName>${artifactId}.jardestName>
		file>
	files>

	<fileSets>
		<fileSet>
			
			<directory>${project.build.directory}directory>
			<outputDirectory>.outputDirectory>
			<includes>
				<include>*.ymlinclude>
				<include>*.propertiesinclude>
			includes>
		fileSet>
	fileSets>
assembly>
3.4 其它配置文件
# 1. application.yml
server: 
    port: @port@      # 没错, 这种格式在 maven-antrun-plugin 中是默认的占位符格式。

# 2. db.properties
@areaName@

# 3. Beijin.properties
areaName=Beijin
port=8090

# 4. Xian.properties
areaName=Xian
port=8091

4. Maven打包

# 注意这里的 "-Dxxx=yyy" 参数因为笔者习惯于在Powershell下执行, CMD下需要去掉这些""。
mvn clean package "-Dmaven.test.skip=true" -P product "-Dbuild.assemblySavePath=./" "-Darea.name=Xian"

Build Success

5. Links

  1. 《Maven实战》 第十四章
  2. Office Site - maven-antrun-plugin

你可能感兴趣的:(DevOps,Maven)