Maven占位符、定界符

一、缘起

在前面写了一篇《Maven打包SpringBoot项目,排除第三方依赖包》,写的过程中,又再次与maven占位符这个问题重逢了。说到重逢,是因为在很早之前,我刚搭建spring boot项目的时候,就栽在这个坑里了。那是只是浅显的知道spring boot 偷偷摸摸地把maven的默认占位符给修改了,但是,没有去深入的理解。现在,回过头来,梳理一遍。

二、运行环境

操作系统:Windows 10 ;
开发工具:IDEA-2019.3;
Web服务器:Tomcat 9.0.24;
JDK版本: jdk 1.8.0_221;
Maven版本:apache-maven-3.6.1
Spring boot 版本:2.0.9.RELEASE

三、原理分析

工欲善其事,必先利其器。想要把功能做好,就要先明白背后的原理。原理理解清楚了,实际操作可谓是手到擒来。
说到maven的占位符,其实并不准确。这也是一直让我混淆的概念。
我们分开来讲:

  1. maven中有很多内置变量,具体有哪些变量,可以参考https://www.jianshu.com/p/ded7dfa2c3d8。比如,basedir表示项目根目录,version表示项目版本。而这些变量如何使用呢,就是使用占位符了,如${version}。这里的占位符就是${ }。这里是maven默认的,而这个占位符使用的场景,也就是在pom.xml之中。这里的占位符,我几乎没有见过要去修改的。
  2. 而通常意义上说的,其实是maven的 maven-resources-plugin插件中的一个配置项<delimiter>${resource.delimiter}</delimiter>。翻译过来,是定界符的意思。中文互联网太多以讹传讹和一知半解了。那么,这个只是一个小小插件的配置项,为何就上升到了好像成了一个maven的一个配置呢?
    首先,就是这个定界符和上面的变量占位符长的一毛一样,这不就是故意让人混淆的嘛;其次,还要从 maven-resources-plugin这个插件本身的功能和特别之处说起了。
    Resources插件负责处理项目资源文件并拷贝到输出目录。Maven将main resources和test resources分开,一般main resources关联main source code,而test resources关联test source code。
    这有啥特殊的呢?看一下官方的这句话:

Starting with version 2.3 this plugin uses the Maven Filtering shared component for filtering resources.

就是说呢,从2.3版本开始,resources插件可以实现过滤资源了。这里过滤的名称起的不好,其实,可以说预编译,或者是替换。就是把定界符里的变量用真实的值替换掉。
这里定界符一般定义在src/main/resources目录下的文件中,而真实的值可以是maven内置变量,<properties>中定义的变量,或者是<filter>过滤器中引用的文件中的变量值。这里是否启用过滤功能,也是可以配置的。说这么多有啥用呢?这个主要就是用在项目多环境配置中。

五、总结

寻找资料,来来回回还都是官方文档是最权威的。本身基础不牢固,就要把基础打牢靠才可以。

六、附录

  1. maven resources插件官方地址:http://maven.apache.org/plugins/maven-resources-plugin/index.html
  2. maven filter功能官方地址:http://maven.apache.org/shared/maven-filtering/
  3. maven 父子模块的插件传递机制
    maven子模块可以通过继承获得的pom中元素有:
  • properties:自定义的Maven属性
  • dependencyManagement:项目的依赖管理配置
  • build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
  1. maven 中的resoures插件
    resoures插件,是maven默认绑定的插件,所以,不用显式的引入。这里还是我的知识盲点,到底是如何引入的,我还没有弄清楚。
  2. spring boot 中 定界符的配置
    官方文档:“How-to” Guides => 2. Properties and Configuration => 2.1.1. Automatic Property Expansion Using Maven:

If you inherit from the spring-boot-starter-parent POM, the default filter token of the maven-resources-plugins has been changed from ${*} to @ (that is, @maven.token@ instead of ${maven.token}) to prevent conflicts with Spring-style placeholders. If you have enabled Maven filtering for the application.properties directly, you may want to also change the default filter token to use other delimiters.

上面是官方的文档。大概意思就是说,因为maven的定界符和spring自身的属性配置的占位符冲突了,所以,spring boot中把maven的定界符改成了@,而spring自己还是使用${}。

  1. 父(Super)POM

父(Super)POM是 Maven 默认的 POM。所有的 POM 都继承自一个父 POM(无论是否显式定义了这个父 POM)。父 POM 包含了一些可以被继承的默认设置。因此,当 Maven 发现需要下载 POM 中的 依赖时,它会到 Super POM 中配置的默认仓库 http://repo1.maven.org/maven2 去下载。
Maven 使用 effective pom(Super pom 加上工程自己的配置)来执行相关的目标,它帮助开发者在 pom.xml 中做尽可能少的配置,当然这些配置可以被重写。
使用以下命令来查看 Super POM 默认配置:
mvn help:effective-pom

上面这段话,是我摘抄自https://www.runoob.com/maven/maven-pom.html的,因为说的太好了。完美解释了maven构建的底层逻辑和思想。给我解了惑。
但是上面去默认仓库下载的路径是打不开的。我找了一下,可以在这个路径找到:http://maven.apache.org/ref/3.0.4/maven-model-builder/super-pom.html

  1. Maven的几个核心概念
    生命周期(lifecycle):maven将构建项目的过程进行了抽象,抽象出来了一个过程,这个过程被称作生命周期(lifecycle)。lifecycle是有多个有序的阶段(phase)构成的。
    阶段(phase):maven将lifecycle划分为多个有序的过程(step),每一个过程被称作一个阶段(phase)。
    目标(goal):goal在maven中是真正执行任务的单元,goal的提供者是插件(plugin),每一个plugin可能提供多个goals。例如 mvn compiler:compile表示了一个goal,其提供者是插件 compiler。compiler其实是这个插件的缩写,其完整的插件名字为org.apache.maven.plugins:maven-compiler-plugin,compile仅仅是这个一个插件中的一个goal。
    三者之间的管理:goal是一个执行任务的最小单元,每一个goal都是由其对应的plugin提供的;可以将对应的goal绑定到某个phase上,当在进行maven构建的过程中只要执行到了对应的phase上,就可以在当前phase上完成goal的执行。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容