Spring Cloud中parent版本变量无法被Maven解析,该如何解决?
<version>标签中使用自定义变量? 核心问题说明
你遇到的这个问题是Maven的固有机制限制:Maven在构建项目时,会先解析父POM,再加载当前项目的<properties>配置。这意味着,你在当前项目<properties>里定义的spring-boot-docs-version变量,在父POM解析阶段还未被加载,所以无法被识别。而dependencyManagement里的变量能正常工作,是因为这部分的解析是在当前项目属性加载完成之后进行的。
可行的解决方案
既然不能直接在当前项目的properties里定义父POM版本变量,这里提供几个不丢失Spring Boot starter parent预配置的替代方案:
1. 使用Maven命令行参数传递版本
你可以在执行Maven命令时直接传入版本参数,父POM里保留${spring-boot-docs-version}的写法:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>${spring-boot-docs-version}</version> <relativePath /> </parent>
执行命令时:
mvn clean install -Dspring-boot-docs-version=2.1.8.RELEASE -Dspring-cloud-version=Greenwich.SR3
2. 使用Maven Profiles管理版本
在项目的pom.xml中定义Profiles,把版本变量放在Profile里,激活对应的Profile即可:
<profiles> <profile> <id>spring-boot-2.1.8</id> <properties> <spring-boot-docs-version>2.1.8.RELEASE</spring-boot-docs-version> <spring-cloud-version>Greenwich.SR3</spring-cloud-version> </properties> <activation> <!-- 设置为默认激活的Profile --> <activeByDefault>true</activeByDefault> </activation> </profile> </profiles> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>${spring-boot-docs-version}</version> <relativePath /> </parent>
这样Maven会在解析父POM之前加载Profile里的属性,变量就能正常被解析了。
3. 使用外部属性文件配合properties-maven-plugin
你可以把版本变量放在外部的properties文件中(比如version.properties),然后用properties-maven-plugin在构建初期加载这个文件:
<build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>properties-maven-plugin</artifactId> <version>1.0.0</version> <executions> <execution> <phase>initialize</phase> <goals> <goal>read-project-properties</goal> </goals> <configuration> <files> <file>version.properties</file> </files> </configuration> </execution> </executions> </plugin> </plugins> </build> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>${spring-boot-docs-version}</version> <relativePath /> </parent>
version.properties内容:
spring-boot-docs-version=2.1.8.RELEASE spring-cloud-version=Greenwich.SR3
补充说明
Spring Cloud Config文档里使用{spring-boot-docs-version}是文档占位符,并不是Maven可识别的变量语法,目的是方便文档替换不同版本号,实际使用时需要替换为具体版本号或者用上述方案处理。
内容的提问来源于stack exchange,提问作者maxxyme

