一、自定义maven属性
可以在properties属性中自定义一个或者多个maven属性,然后在其他地方通过${属性名}的方式引用该属性。这样可以最大意义上消除重复,特别是版本号,比如spring的版本好大多数地方都是一致的。还有如果父项目可以通过定义好依赖版本号,可以保证多个子项目版本一致。
<properties>
<springframework.version>2.5.6</springframework.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${springframework.version}</version>
</dependency>
</dependencies>
maven还有其他可以直接引用的属性:
1、内置属性
${basedir}
:表示项目的根目录,即包含pom.xml文件的目录。
${version}
:表示项目的版本号。
2、POM属性
${project.build.sourceDirectory}
:项目的主源码目录,默认是src/main/java;
${project.build.testSourceDirectory}
:项目的测试源码目录,默认是src/main/test;
${project.build.directory}
:项目构建输出的目录,默认为target/;
${project.outputDirectory}
:项目主代码编译输出目录,默认为target/class;
${project.testOutputDirctory}
:项目测试代码编译输出目录,默认为target/test-classes/;
${project.groupId}
:项目的groupId;
${project.artifactId}
:项目的artifactId;
${project.version}
:项目的version,等价于${version};
${project.build.finalName}
:项目打包输出文件的名称,默认为
project.artifactId−
{project.version}。
3、settings属性
${settings.localRepository}
:指向用户本地仓库的地址。
4、java系统属性
${user.home}
:指向了用户的目录。
5、环境变量属性
所有的环境变量都可以使用env. 开头的maven属性的引用。
二、多环境构建maven项目
maven提供了一个profile属性,用来使用环境资源。
代码如下:
<profiles>
<profile>
<id>dev</id>
<properties>
<source.env>dev</source.env>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<source.env>prod</source.env>
</properties>
</profile>
</profiles>
项目结构如下:
使用build进行资源过滤,并根据不同的环境获取不同的资源文件:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<!-- 先去除掉所有的资源文件 -->
<excludes>
<exclude>dev/*</exclude>
<exclude>prod/*</exclude>
</excludes>
</resource>
<resource>
<!-- 根据${source.env}获取到对应的资源位置 -->
<directory>src/main/resources/${source.env}</directory>
</resource>
</resources>
</build>
运行mvn clean package -Pdev生成dev环境的包,运行mvn clean package -Pprod生成prod环境的包。
由于默认的profile是dev,所以如果我们不指定profile,那么加载就是开发环境dev下的配置文件了。即我们在本地开发测试时,不用关心profile的问题。