十一、灵活的构建

今天无意中刺激到我啦,这促使我发现自己还不够强大,我需要不断充实自己,扩充自己的实力,加油吧,骚年!!!

干吧得.jpg

今天我要讲的是maven灵活构建相关的知识,请做好准备,知识点有点多哦~~~

maven属性

首先带来的是maven的属性知识,在maven中一共有6大属性,分别为:

内置属性
basedir 项目pom文件所在地址
version 项目版本
使用方式为直接使用${basedir}的方式进行引用

pom属性
可以使用该类属性引用pom文件中的配置,因为pom文件根元素为project,所以使用时通过${project.version},${project.groupId}的方式引用

settings属性
可以使用该类属性引用settings文件中的配置,前面已经提到,我们推荐在用户目录下使用该settings.xml文件,比如我在windows系统中该文件位置为:C:\Users\Administrator\.m2\settings.xml,settings.xml中根元素为settings,所以引用需要通过${settings.localRepository}的方式

自定义属性
这也许是我们最常用的一种属性了,在pom文件的properties中定义我们想要引用的属性,然后再通过${property_name}的方式引用,比如

<project>
    <properties>
        <spring.version>3.2.0</spring.version>
    </properties>
</project>

通过${spring.version}方式引用

java系统属性
这种属性可以通过在控制台中输入mvn help:system的方式查询当前系统中存在的系统属性,通过${prop_name}的方式引用,比如${file.encoding.pkg}

查看系统java系统属性.png

环境变量属性
环境变量属性也可以通过mvn help:system的方式查看,引用的方式通过${env.varname}的方式引用

查看系统环境变量属性.png

使用这些属性可以帮我们在引入模块时简化维护和配置的工作

管理多模块依赖

groupId,version都是相同的,这时可以通过pom属性将groupId,versionId进行简化

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>account-service</artifactId>
    <version>${project.version}</version>
</dependency>

管理项目依赖
依赖某一个模块,比如spring一系列的jar包时,他们的version其实是一样的,所以我们也可以通过自定义属性定义spring.version属性,将版本号抽离出来放入<properties>标签中然后进行引用

配置插件
大量插件也用到了属性,比如maven-surefire-plugin中的reportsDirectory我们可以通过pom属性修改报告的位置

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.5</version>
    <configuration>
        <reportsDirectory>${project.build.directory}/test-reports/</reportsDirectory>
    </configuration>
</plugin>

构建环境的差异

在不同的环境中,项目的源码应该会用不同的方式进行构建,比如数据库的配置,在测试、开发、正式这三个不同的环境下是不会一样的,按照传统的方式,在src/main/resources下放置有配置文件jdbc.properties

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root

其中包含了数据库连接的配置信息,当在不同的环境中时,手工修改这个数据库配置,然后再构建,但这种方式是非常麻烦笨拙的

资源过滤(命令行)
为了解决上面的变化,maven提供了一种解决方式,通过profile隔离环境的变化
首先将jdbc.properties变化的配置抽离出来

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

通过maven属性与profile结合的方式配置不同环境的特有属性

<profiles>
    <profile>
        <id>dev</id>
        <properties>
    <jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName/>
    <jdbc.url>jdbc:mysql://localhost:3306/test</jdbc.url>
    <jdbc.username>root</jdbc.username>
    <jdbc.password>root</jdbc.password>
        </properties>
    </profile>
</profiles>

我们知道,对于maven的属性,只能在pom文件中使用,那么在资源配置文件jdbc.properties中是无法访问的,为了让其能够访问到属性,我们需要使用maven-resources-plugin做一些配置:

<resources>
    <resource>
        <directory>${basedir}/src/main/resources</directory>
        <filtering>true</filtering>
    </resource>
</resources>

通过directory指定资源配置文件所在的目录,并通过filtering=true表示当前目录下的资源文件都需要进行过滤,也就是其中配置的属性引用需要被pom属性值替换
配置完之后。我们可以通过命令行mvn clean install -Pdev的方式运行,完成后输出目录中的数据库配置就被dev中的属性替换掉了

maven profile
上面提到,我们可以通过profile来隔离不同环境的属性变化,然后通过命令行-PprofileId的方式激活profile,对于profile的激活,还可以有其他几种方式

profile激活

命令行激活方式
mvn命令行参数-P加上profileId来激活profile,多个profile逗号隔开
mvn clean install -Pdev-x,dev-y,这里将会激活dev-x,dev-y的配置信息

settings文件显示激活
如果希望某一配置默认一直处于激活状态,就可以配置settings.xml文件中的activeProfiles元素,它表示配置的profile对所有项目都处于激活状态

<settings>
    <activeProfiles>
    <activeProfile>nexus</activeProfile>
  </activeProfiles>
</settings>

系统属性激活
可以用当某一个系统属性存在的时候自动激活profile

<profiles>
    <profile>
        <activation>
            <property>
                <name>test</name>
            </property>
        </activation>
        ...
    </profile>
</profiles>

可以进一步精确,当存在属性test,且值为x时激活profile

<profiles>
    <profile>
        <activation>
            <property>
                <name>test</name>
                <value>x</value>
            </property>
        </activation>
        ...
    </profile>
</profiles>

我们可以通过命令行声明系统属性,所以我们可以通过
mvn clean install -Dtest=x的方式从命令行激活profile

操作系统环境激活

<profiles>
    <profile>
        <activation>
            <os>
                <name>Windows 10</name>
                <family>Windows</family>
                <arch>amd64</arch>
                <version>10.0</version>
            </os>
        </activation>
    </profile>
</profiles>

family包括Windows,UNIX,Mac等,其他几项name,arch,version可以通过mvn help:system方式查看os.开头的系统属性,这里分别对应os.name,os.arch,os.version

文件是否存在激活

<profiles>
    <profile>
        <activation>
            <file>
                <missing>x.properties</missing>
                <exists>y.properties</exists>
            </file>
        </activation>
        ...
    </profile>
</profiles>

存在y.properties,且不存在x.properties时激活profile

默认激活(开发中用的最多)
用户可以在配置profile时指定默认激活

<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
</profiles>

不过需要注意的是,如果有任何一个profile通过其他以上任意一种方式被激活了,那么当前的默认激活配置就会失效
如果项目中配置了多种激活方式,那么我们可以通过maven-help-plugin查看
查看当前已激活的配置
mvn help:active-profiles
列出当前所有profile
mvn help:all-profiles

profile的种类

根据需要,用户可以将profile配置到:
pom.xml 只对当前项目有效
用户settings.xml 对本机该用户所有项目有效
全局settings.xml 安装maven目录下的conf/settings.xml中的profile对本机所有用户的所有项目有效
profile中可以使用的pom元素

<project>
    <repositories></repositories>
    <pluginRepositories></pluginRepositories>
    <distributionManagement></distributionManagement>
    <dependencies></dependencies>
    <dependencyMangement></dependencyManagement>
    <modules></modules>
    <properties></properties>
    <reporting></reporting>
    <build>
        <plugins></plugins>
        <defaultGoal></defaultGoal>
        <resources></resources>
        <testResources></testResources>
        <finalName></finalName>
    </build>
</project>

web资源过滤

与普通的配置文件一样,web资源(src/main/webapps/下的资源文件css/js/img等)也不能使用pom属性,需要通过maven-war-plugin进行配置

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1</version>
    <configuration>
        <webResources>
            <resource>
                <filtering>true</filtering>
                <directory>src/main/webapp</directory>
                <includes>
                    <include>**/*.css</include>
                    <include>**/*.js</include>
                </includes>
            </resource>
        </webResources>
    </configuration>
</plugin>

通过directory声明web资源目录src/main/webapp(这也是默认的web资源目录),然后配置filtering开启过滤,并使用includes指定要过滤的文件,这里指定所有的js,css都需要进行过滤

在工作中的使用
我们需要根据不同环境配置不同的参数,就拿数据库配置为例,account-web表示项目名
我们需要在account-web下建立不同环境的配置文件,用于分离环境参数配置

项目配置环境分离.png

dev.properties的配置如下,其他环境比如testproduction环境可能需要配置不同的数据库连接方式

jdbc.username=root
jdbc.password=root
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/account?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&failOverReadOnly=false&maxReconnects=10

pom中指定三种不同环境的profile

<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <env>dev</env>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>test</id>
        <properties>
            <env>test</env>
        </properties>
    </profile>
    <profile>
        <id>production</id>
        <properties>
            <env>production</env>
        </properties>
    </profile>
</profiles>
<build>
    <filters>
        <filter>${basedir}/config/${env}.properties</filter>
    </filters>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.xml</include>
                <include>**/*.xsd</include>
                <include>**/*.properties</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

这里需要注意使用includes表示构建时需要将那些资源文件纳入构建中,这里需要指定所有需要用到的资源文件,否则在目标构建中将不会包含include之外的配置文件
如此在运行maven命令进行打包时就会使用激活的profile对应的配置替换其中变量
好啦,今天就讲到这里,刚好00:00,还有其他事情要做,今天就到这里吧~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容

  • 基础概念 灵活的构建能够解决项目构建过程中一个常常需要面对的问题,就是不同的平台环境差异,这可能是操作系统的差异、...
    依然爱笑的薰衣草阅读 318评论 0 0
  • 包含内容 maven属性 构建环境的差异 资源过滤 Maven Profile Web资源过滤 在profile中...
    zlcook阅读 1,060评论 0 7
  • 简介 Apache Maven是一个软件项目管理和理解工具。基于项目对象模型(POM)的概念,Maven可以从一个...
    我为峰2014阅读 1,936评论 0 1
  • 一、配置分级 首先需要了解的是Maven配置文件以及配置方式的分级,才能做到我们自己在日常开发配置中灵活使用。根据...
    老猫烧须阅读 14,548评论 1 12
  • Maven概述 Maven定义Maven是一个项目管理和整合,统一管理jar包的工具;Maven为开发者提供了一套...
    THQ的简书阅读 760评论 0 0