灵活构建
项目的构建根据不同的情况可能需要有一定的差异,比如编译级别、依赖、打包的属性文件等在不同的运行环境中可能需要有不同的值。为了实现灵活构建,Maven内置了三个特性:
属性:在POM中通过${属性名称}引用构建时的属性值,从而达到灵活构建的目的,主要有六种属性,包括内置属性、POM属性、自定义属性、setting属性、Java系统属性、 环境变量属性。
属性替换可以在pom.xml和资源文件中使用,在资源文件中使用时需要开启资源文件过滤,pom.xml是默认开启的。可以使用的属性如下:
1. 内置属性:如¥{basedir}表示项目根目录,¥{version}表示项目版本
2. POM属性:用户可以引用pom文件中对应的值。如:
${project.build.directory} 构建目录,缺省为target
${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
${project.build.finalName} 产出物名称,¥{project.artifactId}-¥{project.version}
${project.packaging} 打包类型,缺省为jar
${project.xxx} 当前pom文件的任意节点的内容
3. 自定义属性:用户可以在pom的元素下自定义maven属性。
4. setting属性:用户可以使用以settings开头的属性引用settings.xml中xml元素的值,如
${settings.localRepository}指向用户本地仓库的地址。
5. java系统属性:maven可以使用当前java系统的属性,如${user.home}指向了用户目录。
6. 环境变量属性:所有环境变量都可以使用以env.开头的属性。如:${env.JAVA_HOE}。
profile:profile能够定义多个POM的子集,在构建的时候动态激活某个profile,从而修改POM。
资源过滤:资源过滤是指Maven对项目资源文件内容进行变量替换。在资源过滤被激活的时候,Maven会扫描资源,寻找由${}包围的Maven属性的引用。一旦找到这些引用,就会使用合适的值去替换它们.
案例1、灵活构建测试环境和开发环境,(前提需要开启资源文件过滤)
<!-- 灵活构建 --> <profiles> <profile> <id>dev</id> <properties> <jdbc.driverClassName>oracle.jdbc.driver.OracleDriver</jdbc.driverClassName> <jdbc.ur>jdbc:oracle:thin:@localhost:1521:XE</jdbc.ur> <jdbc.username>hr</jdbc.username> <jdbc.password>hr</jdbc.password> <project.build.sourceEncoding>gbk</project.build.sourceEncoding> </properties> <!-- 默认激活 --> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>test</id> <properties> <jdbc.driverClassName>oracle.jdbc.driver.OracleDriver</jdbc.driverClassName> <jdbc.ur>jdbc:oracle:thin:@localhost:1521:XE</jdbc.ur> <jdbc.username>test</jdbc.username> <jdbc.password>test</jdbc.password> <project.build.sourceEncoding>utf-8</project.build.sourceEncoding> </properties> </profile> </profiles>
<build> <!-- 插件配置 --> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
案例2、如果属性过多,导致POM文件过大,(${profile.id}.properties 注意)
<!-- 灵活构建 --> <profiles> <profile> <id>dev</id> <properties> <profile.id>dev</profile.id> </properties> <!-- 默认激活 --> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>test</id> <properties> <profile.id>test</profile.id> </properties> </profile> </profiles>
<build> <!-- 插件配置 --> <filters> <filter>src/main/filters/${profile.id}.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>