不可移植
环境可移植
组织内部可移植
广义可移植
Maven移植-Profiles作用是:Profile允许你为移植或特殊的需要,自定义一个特殊的构建。
1、maven移植-Profiles位于pom.xml
Profile可以覆盖几乎所有的pom元素
<profile>
<build>
<defaultGoal>...</defaultGoal>
<finalName>...</finalName>
<resources>...</resources>
<testResources>...</testResources>
<plugins>...</plugins>
</build>
<reporting>...</reporting>
<modules>...</modules>
<dependencies>...</dependencies>
<dependencyManagement>...</dependencyManagement>
<distributionManagement>...</distributionManagement>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<properties>...<properties>
</profile>
2、maven移植-Profiles位于profiles.xml
Profile抽取至profiles.xml文件中,将这种profile称为外部profile。注:maven3以后不再支持
3、maven移植-Profiles位于setting.xml
在setting.xml文件中配置profiles,会在所有的项目上生效。
4、maven移植-Profiles(激活方式)
a、通过调用id激活:mvn install -Pprofile-id
b、通过<activation>条件匹配激活
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.5</jdk>
<os>
<name>Windows XP</name>
<family>Windows></family>
<arch>x86</arch>
<version>5.1.2600</version>
</os>
<file>
<exists>file2.properties</exists>
<missing>file1.properties</missing>
</file>
</activation>
<activation>
<activeByDefault>false</activeByDefault>
<property>
<name>mavenVersion</name>
<value>2.0.5</value>
</property>
<!-- 是不是不存在这个环境变量的类型 -->
<property>
<name>!environment.type</name>
</property>
</activation>
c、通过activeByDefault默认激活
<profile>
<activation>
<!-- 默认激活 -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
d、注意:只适用于settings.xml文件中激活profile,该设置只会激活settings profile,不会激活id匹配的pom.xml中的profile
<settings>
<activeProfiles>
<activeProfile>profile-id</activeProfile>
</activeProfiles>
</settings>
------------------------------------------------------------------------------------------------------------------
************************************************************************************************************
------------------------------------------------------------------------------------------------------------------
实例:
需求:如何做到对所有的项目,开发环境和生产环境的数据库配置连接不同?
下面是原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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test.maven</groupId>
<artifactId>test1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>test1</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.7.1</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>runTest</id>
<!-- 激活profile -->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<!-- 下面的build是覆盖上面的build从而达到控制是否跳过测试 -->
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.7.1</version>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
把上面的build标签中加入resources标签,制定路径以及是否过滤。
<build>
<!-- src/main/resources路径下的进行属性过滤 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.7.1</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
项目结构图:
db.properties内容
driverClassName=${jdbc.driverClassName}
url=${jdbc.url}
username=${jdbc.username}
password=${jdbc.password}
property1=${property1}
在pom.xml中的profiles中加入以下profile
<!-- 在setting.xml中配置environment.type,为dev时激活oracle的配置,为prod时激活mysql的配置 -->
<profile>
<id>development</id>
<activation>
<property>
<name>environment.type</name>
<value>dev</value>
</property>
</activation>
<properties>
<jdbc.driverClassName>oracle.jdbc.driver.OracleDriver</jdbc.driverClassName>
<jdbc.url>jdbc:oracle:thin:@proddb01:1521:DEV</jdbc.url>
<jdbc.username>dev_user</jdbc.username>
<jdbc.password>devpass</jdbc.password>
</properties>
</profile>
<profile>
<id>production</id>
<activation>
<property>
<name>environment.type</name>
<value>prod</value>
</property>
</activation>
<properties>
<jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>
<jdbc.url>jdbc:mysql://localhost:3306/production_db</jdbc.url>
<jdbc.username>prod_user</jdbc.username>
<jdbc.password>prodpass</jdbc.password>
</properties>
</profile>
在settings.xml中的profiles中加入:
<profile>
<id>environment</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<environment.type>dev</environment.type>
<property1>2</property1>
</properties>
</profile>
<profile>
<id>product</id>
<activation>
<property>
<name>environment.type</name>
<value>prod</value>
</property>
</activation>
<properties>
<database.password>sdfsdf</database.password>
<property1>3</property1>
</properties>
</profile>
执行mvn clean install,打开target下的classes中的db.properties
可以看到db.properties被改变了。
如果生产环境中的数据库连接、密码等信息不希望别人看到,我们可以在settings.xml中配置,运行后会覆盖pom.xml中的配置。我们可以在pom.xml中定义一些假的数据。
把settings.xml中生产环境下的properties改变了,如下:
<profile>
<id>environment</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<environment.type>dev</environment.type>
<property1>2</property1>
</properties>
</profile>
<profile>
<id>product</id>
<activation>
<property>
<name>environment.type</name>
<value>prod</value>
</property>
</activation>
<properties>
<jdbc.driverClassName>update_className</jdbc.driverClassName>
<jdbc.url>update_url</jdbc.url>
<jdbc.username>update_username</jdbc.username>
<jdbc.password>update_password</jdbc.password>
<property1>3</property1>
</properties>
这样执行mvn clean install -Denvironment.type=prod执行就可以看到db.properties改变成settings.xml中定义的了。(-Denvironment.type=prod是指定激活属性叫environment.type是prod的profile)
------------------------------------------------------------------------------------------------------------------
************************************************************************************************************
------------------------------------------------------------------------------------------------------------------
需求:我们希望windows系统打包以后名称带-win,Linux打包以后名称带-linux在profiles中加入以下profile:
<profile>
<id>windows</id>
<activation>
<os>
<family>windows</family>
</os>
</activation>
<!-- 打jar包的时候分类标识符加个win -->
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<classifier>win</classifier>
</configuration>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>linux</id>
<activation>
<os>
<family>unix</family>
</os>
</activation>
<!-- 打jar包的时候分类标识符加个linux -->
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<classifier>linux</classifier>
</configuration>
</plugin>
</plugins>
</build>
</profile>
执行mvn clean install
但是这样配置只针对这一个项目生效,如果我们想在所有项目中都使用这种打包方式,可以在settings.xml中定义这个profile从而生效吗?答案是不行的,原因是maven3认为一个外部的profile是不安全的,在使用的时候有很多的限制。
注意事项:settings.xml和profiles.xml里定义的profiles不会被deploy到repository,有诸多限制,因此,只有下面几个profiles能够在settings.xml和profiles.xml里定义:
repositories
pluginRepositories
properties
其他类型的profiles必须在pom.xml里定义。
在pom.xml中的build下的plugins中加入一个plugin
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<classifier>${envClassifier}</classifier>
</configuration>
</plugin>
修改profiles中的profile
<profile>
<id>windows</id>
<activation>
<os>
<family>windows</family>
</os>
</activation>
<properties>
<envClassifier>win</envClassifier>
</properties>
</profile>
<profile>
<id>linux</id>
<activation>
<os>
<family>unix</family>
</os>
</activation>
<properties>
<envClassifier>linux</envClassifier>
</properties>
</profile>
执行mvn clean install发现打成的jar包以win结尾。这样把上面的profile拿到settings.xml中去,发现运行正常。这样就完成了以后所有的项目都可以使用这个profile。
maven属性分五类:
1、project.*
2、settings.*
3、env.*
4、系统属性
5、用户自定义属性
如果pom.xml中定义了groupId为com.test.maven,那么我们可以在下面以${project.groupId}的方式进行使用。
project.groupId
project.version
project.artifactId
project.name
project.description
project.build.sourceDirectory
project.build.scriptSourceDirectory
project.build.testSourceDirectory
project.build.outputDirectory
project.build.testOutputDirectory
project.build.directory
env.PATH 包含了Maven运行的当前的Path。该Path包含了一个用来查找可运行脚本和程序的目录列表。
env.HOME (在*nix系统中)这个变量指向了用户的home目录。但你更应该使用/home/hudson,而非这个变量
env.JAVA_HOME 指向了你java的安装目录,它要么指向jdk安装目录,要么指向JRE目录。但你更应该考虑使用/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre而非这个属性。
env.M2_HOME 指向了maven2安装目录
java.version java运行环境版本
java.vendor java运行环境供应商
java.vendor.url java供应商url
java.home java安装目录
java.vm.specification.version java虚拟机规格说明版本
java.vm.specification.vendor java虚拟机规格说明供应商
java.vm.version java虚拟机实现版本
java.vm.vendor java虚拟机实现供应商
java.vm.name java虚拟机实现名称
java.specification.version java运行环境规格说明版本
java.specification.vendor java运行环境规格说明供应商
java.specification.name java运行环境规格说明名称
java.class.version java类格式版本号
java.class.path java类路径
java.ext.dirs 扩展目录路径
os.name 操作系统名称
os.arch 操作系统架构
os.version 操作系统版本
file.separator 文件分隔符(unix上是“/”,windows是“\”)
path.separator 路径分隔符(unix上是“:”,windows是“;”)
line.separator 行分隔符(在unix和windows上都是”\n“)
user.name 用户账户名称
user.home 用户home目录
user.dir 用户当前工作目录