参考学习:【maven插件】flatten-maven-plugin : 处理版本占位符

研究的maven版本管理的原因是觉得有些项目管理方式感觉不太科学,比如在微服务系统当中,有一种做法是所有服务都依赖一个包,里面进行版本管理。可是里面的每个服务的version版本管理却是单独使用一个版本号。快速迭代的版本中,通常是要不断地切换version,那么当服务众多的时候,修改起版本来就很麻烦。

比如 SimonLee/xkcoding_spring-boot-demo 这个大哥写的demo就很不错,我会来参考学习。然后看它的版本管理方式:




fleet 使用 maven_maven


最外层的parent这里写死了版本


fleet 使用 maven_boot版本是什么 cent os_02


然后里面的单独的dubbo系统里也写死了版本。

也就是全部都写死了版本。(大哥他不需要更新,所以这些写没啥毛病)

然后我们在版本快速迭代中,也这样使用的话,通常做法就是全局搜索替换版本号,这样就显得很捞,感觉不太科学。

然后就有了revision的占位符统一管理。

Maven官方文档说:自 Maven 3.5.0-beta-1 开始,可以使用 ${revision}, ${sha1} and/or ${changelist} 这样的变量作为版本占位符

这种写法也可以在springboot源码中有看到。

https:///spring-projects/spring-boot/blob/2.0.x/pom.xml


fleet 使用 maven_boot版本是什么 cent os_03


然后你可以看到里面其它子系统都是使用这种方式进行管理的。

然后拿个具体的demo来试试,这是我以前学习dubbo从网上复制改编的例子

原来的结构是这样的


fleet 使用 maven_fleet 使用 maven_04


父类传递依赖。然后里面也是直接写死了版本,然后我使用revision来修改


fleet 使用 maven_maven_05


这个是父pom


fleet 使用 maven_jar包_06


这个是子类pom.

然后编译运行也是没什么问题的。

然后install、deploy的时候就出现问题了。打出来的jar包的pom文件里还是原来的revision变量,即到maven仓库中查看


fleet 使用 maven_jar包_07


这里识别不出版本号,这样就可能导致引用方不能识别你的jar包。

然后这个时候就需要一个插件来改善一下了


<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>flatten-maven-plugin</artifactId>
				<version>1.1.0</version>
				<configuration>
					<updatePomFile>true</updatePomFile>
					<flattenMode>resolveCiFriendliesOnly</flattenMode>
				</configuration>
				<executions>
					<execution>
						<id>flatten</id>
						<phase>process-resources</phase>
						<goals>
							<goal>flatten</goal>
						</goals>
					</execution>
					<execution>
						<id>flatten.clean</id>
						<phase>clean</phase>
						<goals>
							<goal>clean</goal>
						</goals>
					</execution>
				</executions>
			</plugin>


也就是在父pom中引入 flatten-maven-plugin 插件。

然后install之后,这个时候再观察项目结构


fleet 使用 maven_maven_08


发现多了pom文件。

点开一看


fleet 使用 maven_maven_09


发现这是把占位符替换掉的完整的pom文件。

然后再比对一下两者的控制台输出


fleet 使用 maven_fleet 使用 maven_10


发现使用插件之后,发现它是把这个新的pom打到jar包里。也就是说,这个插件的作用就是在install或者deploy的时候,生成一个新的替换占位符的pom文件,也就是帮你替换了这些变量,接着把新的pom文件打入到jar包里。

然后此时再来看maven仓库的内容


fleet 使用 maven_占位符_11


发现是新的pom文件。这样其实就和之前的没什么差别了。

我install的是父工程,直接打子类会出问题,这些就是maven基础了,不多赘述。

然后,这样就可以比较好地解决了快速版本替换时的修改问题了。

这是我接触到的一种方式,应该还有其它更好的管理方式,欢迎交流讨论~