Chapter one . Article Purpose
前段时间总结了maven一些知识点,都是概念性和理解性的描述,对于应用方面乏陈可言。
这里分享下我在日常项目开发中普通项目简单的分环境打包。:)
这样的文章很多,但是在这里出现的才是我最喜欢的。
Chapter two . Build in Pom.xml
MAVEN应用的最佳实践可以说就是配置pom.xml文件的过程。
这里当然要简单分析下pom.xml文件的构建过程。
首先一个普通的项目,应该包含对成熟中间件的依赖和第三方jar包的依赖。然后我这里忽略其他插件造成的影响。采用maven生命周期默认插件。
build过程一般发生在编译过程中,pom.xml文件中build节点很详细的描述了编译过程中构建源码和资源的位置和目标。
1 <!-- 描述构建过程 --> 2 <build> 3 <finalName>sapphire</finalName><!-- 最终生成应用名称 --> 4 <defaultGoal>install</defaultGoal><!-- 发生阶段 --> 5 <directory>${basedir}/target</directory><!-- 目标路径 --> 6 <!-- 源路径和编译路径 7 <sourceDirectory>${basedir}/src</sourceDirectory> 8 <outputDirectory>${basedir}/target/classes</outputDirectory> 9 --> 10 <filters><!-- 过滤器,指定过滤属性文件配置 --> 11 <filter>src/main/resources/env/ 12 filter-${env}.properties</filter><!-- 过滤文件 --> 13 </filters> 14 <resources><!-- --> 15 <resource> 16 <directory>src/main/resources</directory> 17 <filtering>true</filtering> 18 <!-- 将过滤文件键值对配置到被过滤文件中 --> 19 <includes> 20 <include>config.properties</include> 21 </includes> 22 </resource> 23 <!-- 包含的资源 --> 24 <resource> 25 <directory>src/main/java</directory> 26 <includes> 27 <include>**/*.xml</include> 28 </includes> 29 </resource> 30 <resource> 31 <directory>src/main/resources</directory> 32 <includes> 33 <include>*.*</include> 34 </includes> 35 </resource> 36 </resources> 37 </build>
经过这样的配置,你就可以在mvn clean install后获得一个sapphire.war的应用。(如果应用package为war)
备注:过滤文件中若配置了 name=sapphire会在被过滤文件中寻找${name}并填充。
这是我们在被过滤文件<filtering>true</filtering>中配置 name=${name}相当于name=sapphire。
如果你第一次看类似文章,你一定很疑惑${env}和${basedir}是什么。
maven运行时参数分为两种,一种是默认参数,如${basedir}等,还有一种就是我们说的自定义参数啦。
说明如何通过自定义参数分环境构建前,我想提出两点,是我曾经遇到的坑。
过滤文件应满足开闭原则
我曾经将所有资源配置的resource节点下都配置了<filtering>true</filtering>
这导致了过滤文件对我所有的资源文件都进行过滤配置。resource资源下除了基本MVC配置外还经常存在一些常用的资源文件。我有一次放了一些itext加载的字体文件ttc ttl,导致过滤后字体文件平白无故增加十几M而失效不识别。
所以过滤文件请配置的足够精细。
理解resource目录
resource目录中经常放置系统配置文件和常用资源。
如:数据库连接以及连接池常量配置。
FTP连接以及连接池常量配置。
Webservice Hessian HttpInvoker Rest接口URI配置。
MVC基本配置。
第三方工具常量配置。
......
还有一些系统希望通过getResource()加载的系统资源文件,如我上面描述的字体文件。
当你配置resource时,如果遗漏下部分配置文件,是不会将那些文件打包的。在install后,他们统统在WEB-INF/classes目录下。
Chapter three . within Different Environment
分环境打包分参数构建是企业级maven应用最常见的模式。
在项目过程中,开发环境一般分为:
开发环境:dev
测试环境:test
生产环境:pro
大量的参数配置和IP地址配置(cas sso)会增加项目上线时的错误可能性。我们这里引入maven的运行时参数概念。
1 <profiles> 2 <!-- 开发环境,默认激活 --> 3 <profile> 4 <id>dev</id> 5 <properties> 6 <env>dev</env> 7 <maven.test.skip>true</maven.test.skip> 8 </properties> 9 <activation> 10 <activeByDefault>true</activeByDefault> 11 </activation> 12 </profile> 13 <!-- 测试环境 --> 14 <profile> 15 <id>test</id> 16 <properties> 17 <env>test</env> 18 </properties> 19 </profile> 20 <!-- 生产环境 --> 21 <profile> 22 <id>pro</id> 23 <properties> 24 <env>pro</env> 25 </properties> 26 </profile> 27 <!-- 生产环境 --> 28 </profiles>
在刚才配置build节点的pom.xml文件中配置如上信息。
一目了然。
当你运行mvnclean install时,将env参数添加到maven内部环境变量中。这里配置的默认值为dev,
意味着我们一开始配置的过滤文件
src/main/resources/env/filter-${env}.properties ----> src/main/resources/env/filter-dev.properties
系统将默认读取过滤文件中的配置填充到被过滤文件config.properties中。
当你需要测试环境和生产环境时。只需要在命令行输出参数:
mvn clean install -P test 或者 mvn clean install -P pro就可以实现分环境打包了~!@