首页 > 代码库 > Maven3_maven移植和属性过滤

Maven3_maven移植和属性过滤

maven移植-级别
不可移植
环境可移植
组织内部可移植

广义可移植


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)

技术分享



Maven3_maven移植和属性过滤