maven 中依赖传递 依赖冲突

本文介绍了Maven中的依赖传递机制及范围,包括compile、test、provided和runtime等,并详细解释了如何处理依赖冲突以及如何通过exclusions特性精确控制依赖包。

Maven中依赖是会被传递

     A-->C B-->A ==>B-->C(这种依赖是基于compile这个范围进行传递)

     在dependency配置中如果没有写scope默认就是compile范围,依赖的传递主要是针对compile作用域

     依赖的范围:

         test范围指的是测试范围有效,在编译和打包时都不会使用这个依赖

         compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去

         provided范围指的是在编译和测试的过程有效,最后生成war包时不会加入,诸如:servlet-api,因为servlet-api,tomcat等web服务器已经存在了,如果再打包会冲突

        runtime在运行的时候依赖,在编译的时候不依赖

 


     依赖冲突
     当依赖发生冲突或是希望精确的控制依赖包,可以使用依赖的排除功能——>exclusions来排除

     工程中依赖的相同包不同版本的选择问题:

     1.在工程树上,依赖树的尝试浅者优先。直接依赖的最优先被选择,间接依赖的,树的层次越浅 越被优先选择。

     2.依赖在同一层次上,在前者优先被选择。

     总之就是就近原则。版本冲突时,可使exclusions指定排除的版本。

 

 

另请参考:http://blog.youkuaiyun.com/bluishglc/article/details/6584678

 

 

### Maven依赖传递机制及其在多模块项目中的应用 Maven依赖传递机制允许一个项目通过其依赖关系间接引入其他项目的依赖,从而实现模块化开发与管理。在典型的Spring Boot多模块项目结构中,通常包含`api`、`service`和`mapper`三个模块,其中`api`依赖于`service`,而`service`又依赖于`mapper`。这种层级结构使得`api`模块可以通过`service`模块间接使用`mapper`模块的功能[^2]。 然而,在实际运行过程中,若未正确配置,可能会出现`@MapperScan`注解无法扫描到`mapper`接口的问题。这通常是由于Spring Boot默认只扫描启动类所在模块的包路径及其子包,而不包括其他模块的类路径[^2]。因此,即使`mapper`模块的包路径与`api`模块相同,Spring Boot也不会自动跨模块扫描。 #### 解决方案 1. **显式配置`@MapperScan`扫描路径** 在启动类中明确指定需要扫描的包路径,以确保能够覆盖`mapper`模块的类路径。 ```java @SpringBootApplication @MapperScan("com.example.mapper") public class ApiApplication { public static void main(String[] args) { SpringApplication.run(ApiApplication.class, args); } } ``` 2. **确保XML映射文件被正确打包** 若`mapper`模块中的XML文件存放在`src/main/java`目录下,则需要在`pom.xml`文件中添加资源过滤配置,以确保Maven编译时会处理这些文件。 ```xml <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> <resource> <directory>${project.basedir}/src/main/resources</directory> </resource> </resources> </build> ``` 这样可以保证XML文件不会被遗漏,并且可以在构建过程中被正确地复制到目标目录中[^1]。 3. **检查并确保正确的模块依赖关系** 在`service`模块的`pom.xml`文件中,确认是否已经正确声明了对`mapper`模块的依赖。如果该依赖被标记为`<optional>true</optional>`或者设置了特定的作用域(如`test`),那么它将不会被传递给`api`模块。 ```xml <dependency> <groupId>com.example</groupId> <artifactId>mapper</artifactId> <version>${project.version}</version> </dependency> ``` 4. **验证最终构建产物是否包含所有必要的类文件** 使用命令行工具检查生成的JAR文件内容,确保`mapper`相关的类文件确实存在于最终的部署包中。 ```bash jar tf api-module/target/*.jar | grep 'Mapper.class' ``` 5. **启用调试日志以便进一步诊断问题** 在`application.properties`或`application.yml`中开启Spring Boot和MyBatis的日志输出级别,有助于追踪容器初始化过程中的详细信息。 ```properties logging.level.org.springframework.context=DEBUG logging.level.org.mybatis.spring=TRACE ``` 6. **统一管理版本号以避免冲突** 在父项目的`pom.xml`文件中定义统一的版本控制策略,确保各个模块之间使用的库版本一致,减少潜在的兼容性问题。 ```xml <dependencyManagement> <dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency> </dependencies> </dependencyManagement> ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值