maven的间接引用会引入其他未声明的包,maven自身的冲突解决方案,最终引用的包可能不是希望的版本。
直接声明期望的版本号,就没有间接引用的问题。
子模块很多时,可以使用dependencyManagement在父模块中统一管理。
父模块中配置:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>1.2.3.RELEASE</version> </dependency> </dependencies> </dependencyManagement>
子模块则无需指定版本信息:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
dependencyManagement中定义的只是依赖的声明,并不实现引入,因此子项目需要显式的声明需要用的依赖。
发生ClassNotFoundException等包冲突的引起的问题时,可以如下解决:
intellj中Reimport,会重新下载对应的包,解决IDE缓存的问题。
还是存在冲突时,mvn dependency:tree命令,查看间接引入的来源。
mvn dependency:tree找到是哪个模块的哪个包间接引入了版本有问题的包,使用exclusion切断引用关系。
<dependency> <groupId>org.unitils</groupId> <artifactId>unitils-dbmaintainer</artifactId> <version>${unitils.version}</version> <exclusions> <exclusion> <artifactId>asm</artifactId> <groupId>asm</groupId> </exclusion> </exclusions> </dependency>