文档章节

Maven Multi-environment package

Nathans
 Nathans
发布于 2016/09/07 11:33
字数 1782
阅读 38
收藏 0

Multi-environment


The project is divided into three kinds of environment:local、dev、pro。

不同的环境配置不同,如果只拥有一套配置的话,会导致在不同的环境上需要反复的修改相同配置进行打包,比如说现在本地经过测试,需要发布到开发环境,则需要修改配置文件,改为开发环境的配置参数,进行打包,然后又调整为本地环境进行开发与测试。

Filtering

  Filtering是maven的resource插件提供的功能,作用是对资源文件中的占位符进行替换。称为maven resources filter。替换的便来来自system.properties,project proerties(pom.xml的<properties>)、filter resources(filter配置文件)和command line。替换指定目录*.properties文件里的占位符(${jdbc.url}),具体使用如下:
  在src/main/resources/conf目录有个配置文件jdbc.properties,内容如下:

jdbc.url=${jdbc.url}
jdbc.username=${jdbc.username}
jdbc.password=${jdbc.password}

  maven default生命周期,process-resources阶段执行maven-resources-plugin的resources目标处理主资源目下的资源文件时,是否对主资源目录开启资源过滤

<resources>
    <resource>
        <directory>src/main/resources/conf</directory>
        <filtering>true</filtering>
    </resource>
</resources>

maven resource plugin开启filtering进行占位符替换处理。

例如从pom.xml的project proerties元素获取变量replace placeholder variables。

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.panda.pack</groupId>
  <artifactId>bird</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  
  <!-- Define placeholder variables -->
  <properties>
	<jdbc.url>jdbc:mysql://127.0.0.1:3306/panda</jdbc.url>
	<jdbc.username>root</jdbc.username>
	<jdbc.password>panda</jdbc.password>
  </properties>
  
  <build>
        <mvn resource pulgin filtering -->
        <resources>
          <!-- scan directory -->
          <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
          </resource>
        </resources>
  </build>
</project>

execute "mvn clean package -Dmaven.test.skip=true",编译后target directory的jdbc.properties内容为:

jdbc.url=jdbc:mysql://127.0.0.1:3306/panda
jdbc.username=root
jdbc.password=panda

or filter resouces 通过将变量定义在配置文件中比如filters.properties,pom.xml:

<build>
    <filters>
         <!-- Define placeholder variables -->
        <filter>src/main/filters.properties</filter>
    </filters>

    <resources>
       <resource>
           <directory>src/main/resources</directory>
           <filtering>true</filtering>
       </resource>
    </resources>
</build>

filters.properties content is as follows:

jdbc.url=jdbc:mysql://127.0.0.1:3306/panda
jdbc.username=panda
jdbc.password=panda

Profile

Define profile

  pom.xm中的profile元素,可以在两个文件中配置:maven install directory/conf/settings.xml 和 pom.xml file of the project。

  •   settings.xml中define的profile是全局的,对maven项目有效,只能定义<repositories>、<pluginRepositories>、 <properties>元素。

  • pom.xml中define的profile是局部的,只对当前pom.xml所在的项目有效。

Using a profile

  maven 的-P参数指定profile,参数的值是profile的id,多个profile以逗号分割,如果不想激活某个默认的profile,在id前加个!。

  mvn clean package -Dmaven.test.skip=true -Plocal,dev,!pro (ignore production profile)

IDEA里则可以在 Maven Projects 里直接勾选想要激活的profile

Or Define profile时, <profile> 的 <activation> 元素下配置默认的profile。

pom.xml:

<!-- default use local profile-->
<profiles>
  <profile>
     <id>local</id>
        <properties>
            <active.profile>local</active.profile>
        </properties>
     <activation>
        <activeByDefault>true</activeByDefault>
     </activation>
  </profile>
</profiles>

  settings.xml文件通过<activeProfiles>配置default use的profile列表。

<activeProfiles>
    <activeProfile>profile ids</activeProfile>
</activeProfiles>

Example

pom.xml

<project>
	<profiles>
		<profile>
			<id>dev</id>
			<properties>
				<active.profile>local</active.profile>
				<jdbc.url>jdbc:mysql://127.0.0.1:3306/local</jdbc.url>
				<jdbc.username>root</jdbc.username>
				<jdbc.password>local</jdbc.password>
			</properties>
			<!-- Set the current configuration for the default profile -->
			<activation>
				<activeByDefault>true</activeByDefault>
			</activation>
		</profile>
		  
		<profile>
			<id>pro</id>
			<properties>
				<profiles.active>dev</profiles.active>
				<jdbc.url>jdbc:mysql://127.0.0.1:3306/dev</jdbc.url>
				<jdbc.username>root</jdbc.username>
				<jdbc.password>dev</jdbc.password>
			</properties>
		</profile>
		  
		<profile>
			<id>pro</id>
			<properties>
				<profiles.active>pro</profiles.active>
				<jdbc.url>jdbc:mysql://127.0.0.1:3306/pro</jdbc.url>
				<jdbc.username>root</jdbc.username>
				<jdbc.password>pro</jdbc.password>
			</properties>
		</profile>
	</profiles>
  
	<build>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
			</resource>
        </resources>	
	</build>
</project>

  使用不同Profile 的<properties> variables进行占位符替换。以上方式是将占位符变量值定义在profile的<properties>元素中进行替换,这样不方便维护,建议设置在相应配置文件中。

<project>
	<profiles>
		<profile>
			<id>dev</id>
			<properties>
				<active.profile>local</active.profile>
			</properties>
			<!-- Set the current configuration for the default profile -->
			<activation>
				<activeByDefault>true</activeByDefault>
			</activation>
		</profile>	
		<profile>
			<id>dev</id>
			<properties>
				<active.profile>dev</active.profile>
			</properties>
		</profile>
		<profile>
			<id>pro</id>
			<properties>
				<active.profile>pro</active.profile>
			</properties>
		</profile>
	</profiles>
  
	<build>
		<filters>
			<!-- active.profile is current evironment profiles.active -->
			<filter>src/main/filters-${active.profile}.properties</filter>
		</filters>
		<resources>
			<resource>
			  <directory>src/main/resources</directory>
			  <filtering>true</filtering>
			</resource>
		</resources>	
	</build>
</project> 

  上图中的<filter>的"${ative.profile}"占位符指向的是<profile>元素中<properties> 的<active.profile>元素,此值可以任意定义。

  在Project路径src/main中Create三个文件:filters-local.properties、filters-dev.properties、filters-pro.properties。

filters-local.properties:

jdbc.url=jdbc:mysql://127.0.0.1:3306/local
jdbc.username=root
jdbc.password=local

  其余两个配置文件filters-local.properties和filters-pro.properties与之类似。

  配置在配置文件中方便维护,使用不同的Profile,则替换相应的Profile的{active.profile}.properties的变量。

execute 

mvn clean package -Dmaven.test.skip=true -Plocal

  执行以上命令,将会使用local profile的配置文件filters-local.properties的变量值进行打包,如果默认不传递-P参数,则会使用default profile。

上面的方式是定义配置文件时,使用占位符,然后再定义相应的几种环境的正式配置文件,对占位符文件进行替换。例如上面的例子,需要使用的配置文件由如下几个:

filters.properties:占位符定义文件

filters-local.properties、filters-dev.properties、filters-pro.properties三种环境的配置文件。使用占位符进行替换,有些不方便。对于大型复杂项目来说容易出现错误。

推荐使用Resources

 

Resources

  此种方式不进行占位符文件替换,同时不需要定义占位符文件。通过定义不同的文件夹目录放置不同环境需要的配置文件,在打包或发布时指定环境,解压指定环境目录的配置文件至指定目录,此处是WEB/classes。

src/main/resources目录结构 as follow:

 

pom.xml as follows:

<project>
<profiles>
  	<profile>
  		<id>dev</id>
  		<properties>
  			<profiles.active>dev</profiles.active>
  		</properties>
  		<activation>
            <activeByDefault>true</activeByDefault>
        </activation>
  	</profile>
  	<profile>
  		<id>test</id>
  		<properties>
  			<profiles.active>test</profiles.active>
  		</properties>
  	</profile>
  	<profile>
  		<id>prod</id>
  		<properties>
  			<profiles.active>prod</profiles.active>
  		</properties>
  	</profile>
  </profiles>
  
  <build>
  	<resources>
  		<resource>
  			  <!-- 
		                  资源文件位置src/main/resources/,这下面的资源文件的${}会全部被替换成filter中的标签内容。
		                  directory指定的value会作为classes的资源跟目录,
		                  比如指定:src/main/resources/,则classes下会出现jdbc等包,
		                  若指定:src/main/resources/jdbc/,则classes下直接出现jdbc包下的文件,不会额外出现jdbc等其他包结构。因为他把jdbc作为了根目录
              -->
  			 <directory>src/main/resources</directory>
  			 <!-- 在某个resource中如果设置filtering为true,将会根据输入参数动态修改相关内容。 -->
  			 <filtering>true</filtering>
             <!-- 资源根目录排除各环境的配置,使用单独的资源目录来指定 -->  
             <excludes>  
             	<exclude>test/*</exclude>
                <exclude>dev/*</exclude>  
                <exclude>prod/*</exclude> 
             </excludes>  
  		</resource>
  		<resource>  
            <!-- 根据参数指定资源目录 -->  
            <directory>src/main/resources/${profiles.active}</directory>  
            <!-- 指定编译后的目录即生成文件位置(默认为WEB-INF/class)
            <targetPath>config</targetPath> -->  
        </resource>  
  	</resources>
  </build>

  <plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<version>3.5.1</version>
			<configuration>
				<source>1.7</source>
				<target>1.7</target>
				<encoding>UTF-8</encoding>  
			</configuration>
		</plugin>
  </plugins>
  
</project>

上面的配置中关键的在于<resources>元素中的<directory>的占位符src/main/resoruces/${profiles.active}。此处的profiles.active是<profile>中定义的元素。

不同环境的配置文件在不同的文件夹中,也就是不同的<profile>中,方便单独维护,使用不同的Profile,则会将相对应目录的Profile的profiles.active变量,传递给<resources>的directory元素。例如如下: 

mvn clean package -Dmaven.test.skip=true -Pprod

  执行以上命令,将会使用profile为prod对应的文件夹目录的配置文件进行打包。变量的值同时如下所示:

<resource>  
  <directory>src/main/resources/prod</directory>
</resource>

换句话说就是打包prod环境的配置文件至WEB-INF/classes(如不指定<target>元素,则默认为此目录)。

© 著作权归作者所有

Nathans
粉丝 6
博文 18
码字总数 28409
作品 0
成都
程序员
私信 提问
MAVEN开发,测试环境Properties的替换支持

参考 http://blog.csdn.net/stark_summer/article/details/42743007 1)在src/main/resources下面建立dev,product目录 src/main/resources/dev src/main/resources/product 2)分别在这两个路......

zhouyc
2015/08/30
835
0
maven lifecycle

Maven 3.x 自定义了很多的 开发需要用到的lifeCycle ,下面列举了常用的一些 lifecycle,涵盖了大部分的应用了 validate - validate the project is correct and all necessary information i...

jicui
2012/09/16
1K
0
Maven project multi environment config

在是用Jenkins进行项目自动部署的过程中,遇到一个问题:开发环境<dev>,内测环境<alpha>,测试环境<beta>,生产环境<production>的配置文件可能存在不同的情况,最初想到的是通过Git的多个b...

Geek-S
2016/06/20
91
0
MAVEN项目标准目录结构

1.标准目录结构: src-main -test -site Site(一些文档)targetLICENSE.txt Project’s licenseREADME.txt Project’s readme 工程根目录下就只有src和target两个目录 target是有存放项目构...

undefine
2014/03/28
209
1
创建支持eclipse的多模块maven项目

---title: "[创建支持eclipse的多模块maven项目]" date: 2013-07-19 17:46 创建支持eclipse的多模块maven项目 通过maven可以创建多个关联模块的项目(Multiple Module Projects)。由一个总的...

rkikbs
2013/08/08
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

为构建社交关系链手淘都做了啥?

作者|王卫(泓冰) 出品|阿里巴巴新零售淘系技术部 01、淘宝社交关系推荐的背景 1、互联网下半场到来:互联网的下半场,人口红利消失,各大平台需要对用户做精细化运营,用户的增长和留存是每一...

阿里云官方博客
12分钟前
3
0
Iaas/Paas/Saas有何区别,一个故事告诉你

云计算有三种服务模式,IaaS,PaaS和SaaS。单从英文全称去理解,他们分别是“基础设施即服务”“平台即服务”和“软件即服务”。 这样翻译过来可不好理解,但是我们可以举个例子。现在我们就以...

JEPaaS云平台
20分钟前
3
0
温度传感器怎么测好坏

  温度传感器也就是负温度系数热敏电阻,温度越高,电阻越小,测量时先看其阻值能不能根据温度的变化而变,再看其变化的阻值是不是在标定的范围之内。   有以下四种方法;   1、若是有...

仙溪
20分钟前
3
0
zk中ZooKeeperServer解析

内部类 ChangeRecord 处理PrepRP和FinalRP之间的信息 static class ChangeRecord { ChangeRecord(long zxid, String path, StatPersisted stat, int childCount, List<ACL> acl) {......

writeademo
30分钟前
3
0
LNMP---安装worrdpress、discuz,域名重定向,用户认证,nginx访问日志

4.34 安装wordpress 4.35 安装discuz 4.36 域名重定向 4.37 用户认证 4.38 nginx访问日志 一、安装wordpress 创建博客: 添加一个博客的虚拟主机 blog.tobe.com.conf 做如下更改 安装博客wor...

tobej
32分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部