Maven项目中Jar包版本变更后原有调用Jar能否正常识别问题
Maven Jar包依赖兼容性问题解答
核心结论
- JVM加载类时不依赖Jar包文件名,仅通过类的全限定名匹配对应类资源,只要two-1.1.2.jar内部的类结构与one.jar构建时依赖的1.1.1版本兼容,one.jar就可以正常调用two.jar的相关逻辑
- 你可以执行
mvn dependency:tree命令,查看项目最终生效的two.jar版本,确认是否为你指定的1.1.2版本
分场景判断运行结果
兼容场景
如果two-1.1.2版本没有修改one.jar调用到的类的全限定名、公共方法签名、公共字段定义,也没有删除对应类资源,one.jar可以完全正常运行,不会感知到two.jar的版本升级和文件名变化。
不兼容场景
如果two-1.1.2版本存在破坏性变更,比如删除了one.jar依赖的类/方法、修改了方法入参出参结构、调整了类的包路径,运行时会抛出ClassNotFoundException、NoSuchMethodError、NoClassDefFoundError这类异常,这类异常是类结构不兼容导致的,和Jar包文件名没有关联。
常见误区说明
很多开发者会误以为Jar包文件名是依赖识别的核心依据,实际上Maven的groupId、artifactId、version坐标仅用于依赖管理阶段的Jar包定位和下载,运行阶段JVM只会扫描classpath下所有Jar包内的类资源,和Jar包本身的文件名没有绑定关系。
内容的提问来源于stack exchange,提问作者FreshTransistor
相关产品推荐
相关产品推荐

