指定Maven插件具体版本是否存在问题?附版本升级场景咨询
Maven插件版本指定相关问题解答
1. 指定surefire、compiler等插件版本有没有问题?
不仅没问题,这是推荐的最佳实践。Maven虽然自带一套默认插件版本,但不同Maven版本内置的插件版本差异极大,直接指定版本能确保在本地、CI服务器、同事机器等不同环境中使用完全一致的插件版本,避免因版本不一致导致的构建失败或结果差异。
2. Maven 3.5+Java 8能否使用最新插件?
不能直接用最新版插件,因为高版本插件通常对Maven和Java版本有最低要求:
- 以surefire插件为例:3.0.0及以上版本要求Maven 3.6.0+、Java 8+,Maven 3.5.x不满足最低Maven版本要求,强行使用会出现API兼容错误,所以Maven3.5+Java8只能用2.x系列的surefire插件(比如2.22.2,这是2.x的最终稳定版,兼容Maven3.0+和Java1.5+)。
- 以compiler插件为例:最新的3.12.x版本要求Maven3.8.6+、Java8+,Maven3.5.x适配的compiler版本是3.8.x系列(比如3.8.1,兼容Maven3.1+、Java6-11)。
升级到Maven3.8.x+Java11+后,就可以放心使用最新版插件:比如surefire 3.2.x、compiler 3.12.x,这些版本对Java11+的支持更完善,也修复了旧版本的诸多bug。
3. 不指定插件版本,靠根POM引入是否更合理?
分两种情况看待:
- 使用官方/靠谱的父POM管理版本:合理。比如Apache的
maven-parent或者Spring Boot的父POM,这类父POM会根据自身兼容的Maven和Java版本,维护一套经过验证的插件版本集合,引入后无需自己指定插件版本,既省心又能保证兼容性。 - 完全不指定版本,依赖Maven内置默认版本:不合理。不同Maven版本内置的插件版本差异极大,比如Maven3.5内置的surefire是2.19.1,Maven3.8内置的是3.0.0-M5,后者在Java11下才能正常工作,前者在Java11下会出现测试执行失败的问题,完全不指定版本会导致构建稳定性无法保障。
示例优化(Maven3.5+Java8环境)
你提供的surefire 2.12.4版本可以正常使用,但建议升级到2.x系列的最终稳定版2.22.2,修复了更多bug且兼容性一致:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> <configuration> <skipTests>${skipTests}</skipTests> </configuration> </plugin>
内容的提问来源于stack exchange,提问作者Berlin Brown
相关产品推荐
相关产品推荐

