Maven环境的灵活构建(四)

大多数项目都会有开发环境、测试环境和正式环境最少三个环境下的属性配置文件。为了灵活的切换环境,maven内置了三大特性:属性、Profile和资源过滤。

1. Maven属性

Maven属性分为6类,分别为:

  • 内置属性
  • POM属性
  • 自定义属性
  • Settings属性
  • Java系统属性
  • 环境变量属性

下面依次介绍

1.1 内置属性

内置属性主要有两个常用内置属性:

  • ${basedir}:表示项目根目录,即包含pom.xml文件的目录;
  • ${version}:表示项目版本

1.2 POM属性

用户可以使用POM属性引用POM文件中对应元素的值。例如${project.artifactId}对应元素的值。常用的POM属性包括:

  • ${project.build.sourceDirectory}:项目的主源码目录,默认为src/main/java/。
  • ${project.build.testSourceDirectory}:项目的测试源码目录,默认为src/test/java/。
  • ${project.build.directory}:项目构建输出目录,默认为target/。
  • ${project.outputDirectory}:项目主代码编译输出目录,默认为target/classes/。
  • ${project.testOutputDirectory}:项目测试代码编译输出目录,默认为target/test-classes。
  • ${project.groupId}:项目的groupId。
  • ${project.artifactId}:项目的artifactId。
  • p r o j e c t . v e r s i o n : 项 目 的 v e r s i o n , 与 {project.version}:项目的version,与 project.versionversion{version}等价。
  • p r o j e c t . b u i l d . f i n a l N a m e : 项 目 打 包 输 出 文 件 的 名 称 , 默 认 为 {project.build.finalName}:项目打包输出文件的名称,默认为 project.build.finalName{project.artifactId}-${project.version}

这些属性都对应了一个POM元素,默认值都是在超级POM中定义的。

1.3 自定义属性

最常见的使用Maven属性的方式如下所示:

<!-- 定义下面要使用的属性变量 -->
<properties>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	<spring.versioin>4.3.9.RELEASE</spring.versioin>
</properties>

通过元素,用户可以自定义一个或多个Maven属性,然后在POM的其他地方使用${属性名称}的方式引用该属性。例如:

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-webmvc</artifactId>
	<version>${spring.versioin}</version>
</dependency>

这种做法的最大意义在于消除重复,不仅减少了日后升级版本的工作量,也能降低错误发生的概率。

1.4 Settings属性

与POM属性同理,用户使用以settings开头的属性引用settings.xml文件中xml元素的值,如常用的${settings.localRepository}指向用户本地仓库的地址。

1.5 Java系统属性

所以Java系统属性都可以使用Maven属性引用,例如${user.home}指向了永固目录。用户可以使用如下命令查看所有的Java系统属性。

mvn help:system

1.6 环境变量属性

所有环境变量都可以使用以env.开头的Maven属性引用。例如${env.JAVA_HOME}指向了JAVA_HOME环境变量的值。。用户可以使用如下命令查看所有的环境变量。

mvn help:system

2. 构建环境的差异

不同的环境下,项目的配置文件会使用不同的内容,最常见的就是数据库配置了。手动修改往往效率低下,且容易发生错误。Maven针对不同的环境生成不同的构建,可以完美解决这个问题。

例如,在根目录下有个baseResources文件夹,该文件夹下有test、dev、prod三个文件夹,每个文件夹下都有一个datasource.properties文件。里面内容如下:

test/datasource.properties

dataSource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
dataSource.username=test
dataSource.password=123456

dev/datasource.properties

dataSource.url=jdbc:mysql://127.0.0.1:3306/dev?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
dataSource.username=dev
dataSource.password=123456

prod/datasource.properties

dataSource.url=jdbc:mysql://127.0.0.1:3306/prod?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
dataSource.username=prod
dataSource.password=123456

在不同的环境下,使用不同的数据库配置。可以如下配置:

  1. 在pom.xml中自定义一个Maven属性,并使用一个额外的profile将其包裹
<profiles>
	<profile>
		<id>test</id>
		<properties>
			<profiles.active>test</profiles.active>
		</properties>
		<activation>
			<activeByDefault>true</activeByDefault>
		</activation>
	</profile>
	<profile>
		<id>dev</id>
		<properties>
			<profiles.active>dev</profiles.active>
		</properties>
	</profile>
	<profile>
		<id>prod</id>
		<properties>
			<profiles.active>prod</profiles.active>
		</properties>
	</profile>
</profiles>
  1. 资源过滤是maven-resources-plugin做的是,它默认只是将项目主资源文件复制到主代码编译到输出目录中,所以要将baseResources输出,需要声明多个资源目录提供过滤配置。
<build>
	<finalName>TestDemo</finalName>
	<resources>
		<resource>
			<directory>baseResources/${profiles.active}</directory>
			<!--<filtering>true</filtering>-->
		</resource>
		<resource>
			<directory>src/main/resources</directory>
			<!--<filtering>true</filtering>-->
		</resource>
	</resources>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<version>3.3</version>
			<configuration>
				<source>1.8</source>
				<target>1.8</target>
				<encoding>UTF-8</encoding>
			</configuration>
		</plugin>
	</plugins>
</build>

上面代码中,有一个注释了的filtering标签,这个是用来将pom中定义的属性放到其他文件下生效使用的。例如,在刚刚的datasource.properties中有如下定义:

dataSource.maxIdle=${maxIdle}

在pom中定义了该属性:

<profiles>
	<profile>
		<id>test</id>
		<properties>
			<maxIdle>100</maxIdle>
		</properties>
	</profile>
</profiles>

要想让定义的maxIdle属性值在datasource.properties中变为100,需要将filerting设置为true。

  1. 激活profile
  • 3.1 命令行激活

用户可以使用mvn命令行参数-P加上profile的id来激活profile,多个id之间以逗号分隔。

mvn clean install -Ptest

-Ptest 代表安装的时候,使用test的数据库配置

  • 3.2 settings文件显示激活

如果用户希望某个profile默认一直处于激活状态,如下配置

<settings>
    ...
    <activeProfiles>
        <activeProfile>test</activeProfile>
    </activeProfiles>
    ...
</settings>
  • 3.3 系统属性激活

用户可以在配置当某系统属性存在的时候,自动激活profile

<profiles>
    ...
	<profile>
		<activation>
			<property>
			    <name>test</name>
			</property>
		</activation>
	</profile>
	...
</profiles>

可以进一步配置当某系统属性test存在,且值等于x的时候激活profile

<profiles>
    ...
	<profile>
		<activation>
			<property>
			    <name>test</name>
			    <value>x</value>
			</property>
		</activation>
	</profile>
	...
</profiles>

注意:不要忘了,用户可以在命令行声明系统属性

mvn clean install -Dtest=x

多个profile的时候完全可以使用同一个系统属性来激活

  • 3.4 操作系统环境激活

Profile可以根据操作系统环境激活,如果构建在不同的操作系统有差异,用户可以完全将这些差异写进profile中,然后配置它们自动基于操作系统环境激活。

<profiles>
    ...
	<profile>
		<activation>
			<os>
			    <name>Windows XP</name>
			    <family>Windows</family>
			    <arch>x86</arch>
			    <version>5.1.2600</version>
			</os>
		</activation>
	</profile>
	...
</profiles>

family的值包括Windows、UNIX和Mac等。其他几项可以通过查看环境变量中的系统属性os.name、os.arch、os.version获得。

  • 3.5 文件存在与否激活
    Maven可以根据项目中某个文件存在与否来决定是否激活profile
<profiles>
    ...
	<profile>
		<activation>
			<file>
			    <missing>x.properties</missing>
			    <exists>y.properties</exists>
			</file>
		</activation>
	</profile>
	...
</profiles>
  • 3.6 默认激活

用户可以在定义profile的时候指定其默认激活,例子中的test就是默认激活

<profiles>
	<profile>
		<id>test</id>
		<properties>
			<profiles.active>test</profiles.active>
		</properties>
		<activation>
			<activeByDefault>true</activeByDefault>
		</activation>
	</profile>
</profiles>

如果任何一个profile通过以上任意一种方式被激活了,其他所有的默认激活配置都会失效。如果项目中有很多的profile,它们的激活方式各异,可以通过maven-help-plugin插件帮助用户了解当前激活的profile:

mvn help:active-profiles

该插件还有另外一个目标用来列出当前所有的profile:

mvn help:all-profiles

4. profile的分类

根据需要,可以在以下位置声明profile

  1. pom.xml:只对当前项目有效
  2. 用户settings.xml:用户目录下,.m2/settings中的profile对本机上该用户的所有Maven项目有效。
  3. 全局settings.xml:Maven安装目录下conf/settings中的profile对本机上所有的Maven项目有效。
  4. profiles.xml:还可以在项目根目录下使用一个额外的profiles.xml文件来声明profile,不过该特性已经在Maven3中移除。建议用户将这类profile移到settings.xml中。

为了不影响其他用户且方便升级Maven,用户应选择配置用户范围的settings.xml,避免修改全局的settings.xml文件。

5. Web资源过滤

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值