Maven之——坐标和依赖(中)

本文深入探讨Maven中的依赖管理机制,包括传递性依赖的工作原理、依赖调节规则及可选依赖的应用场景,帮助读者更好地理解和掌握Maven依赖管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Maven之——坐标和依赖(中)


1、    传递性依赖


          1.1    何为传递性依赖

            项目中经常有引入一个jar包还要引入其他与其相关的jar包、自己搜的话要注意很多、比如版本问题等、而Maven会解析解析各个直接依赖的POM、将哪些必要的间接依赖以传递依赖的形式引入到项目中。

            依赖范围不仅可以控制依赖与三种classpath关系、还对传递依赖产生影响。

            假设A依赖B,B依赖C,我们说A对于B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖。第一直接依赖的范围和第二直接依赖的范围决定了传递性依赖的范围,如下图,最左边一列表示第一直接依赖范围,最上面一行表示第二直接依赖范围,中间交叉单元格表示传递性依赖范围。

 

compile

test

provided

runtime

compile

compile

--

--

runtime

test

test

--

--

test

rpovided

provided

--

provided

provided

runtime

runtime

--

--

runtime


2    依赖调节:


        maven引入的传递性依赖机制,一方面大大简化和方便了依赖声明,另一方面,大部分情况下我们只需要关心项目的直接依赖是什么,而不用考虑这些直接依赖会引入什么传递性依赖。但有时候,当传递性依赖造成问题的时候,我们就需要清楚地知道该传递性依赖是从哪条依赖路径引入的。

 

        例如,项目A有这样的依赖关系 :A-->B-->C-->X(1.0)、A-->D-->X(2.0),X是A的传递性依赖,但是两条依赖路径上有两个版本的X,那么哪个X会被maven解析使用呢?两个版本都被解析显然是不对的,因为那会造成依赖重复,因此必须选择一个。maven依赖调解的第一原则:路径最近者优先。该例中X(1.0)的路径长度为3,而X(2.0)的路径长度为2,因此X(2.0)会被解析使用。

 

        依赖调解第一原则不能解决所有问题,比如这样的依赖关系:A-->B-->Y(1.0),A-->C-->Y(2.0),Y(1.0)和Y(2.0)的依赖路径长度是一样的,都为2。那么到底谁会被解析使用呢?在maven2.0.8及之前的版本中,这是不确定的,但是maven2.0.9开始,为了尽可能避免构建的不确定性,maven定义了依赖调解的第二原则:第一声明者优先。在依赖路径长度相等的前提下,在POM中依赖声明的顺序决定了谁会被解析使用。顺序最靠前的那个依赖优胜。


3    可选依赖


        上面的依赖范围中的一个元素:optional。

假设有这样一个依赖关系,项目A依赖于项目B,项目B依赖于项目X和Y,B对于X和Y的依赖都是可选依赖:A-->B,B-->X(可选),B-->Y(可选)。根据传递性依赖的定义,如果所有这三个依赖的范围都是compile,那么X,Y就是A的compile范围传递性依赖。然而,由于这里X,Y是可选依赖,依赖将不会得以传递。换句话说,X,Y将不会对A有任何影响。

为什么要使用可选依赖这一特性呢?可能项目B实现了两个特性,其中的特性一依赖于X,特性二依赖于Y,而且这两个特性是互斥的,用户不可能同时使用两个特性。比如B是一个持久层隔离工具包,它支持多种数据库,包括MySQL,PostgreSQL等,在构建这个工具包的时候,需要这两种数据库的驱动程序,但在使用这个工具包的时候,只会依赖一个数据库。

        关于可选依赖需要说明的一点是,在理想的情况下,是不应该使用可选依赖的。前面我们可以看到,使用可选依赖的原因是某一个项目实现了多个特性,在面向对象设计中,有个单一职责性原则,意指一个类应该只有一项职责,而不是糅合太多的功能 。这个原则在规划maven项目的时候也同样适用。在上面的例子中,更好的做法是为mysql和postgresql分别创建一个maven项目,基于同样的groupId分配不同的artifactId。


### Spring Boot 连接 Oracle 11g 数据库所需 Maven 依赖 在 Spring Boot 中连接 Oracle 11g 数据库时,需要引入相应的 JDBC 驱动程序以及 JPA 或者其他数据访问框架的支持。以下是具体的 Maven 依赖配置: #### 1. 引入 Oracle JDBC 驱动 Oracle 提供了官方的 JDBC 驱动程序 `ojdbc8` 来支持 Java 应用程序与 Oracle 数据库之间的交互。对于 Oracle 11g 版本,可以使用以下依赖项[^3]。 ```xml <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.8.0.0</version> </dependency> ``` 需要注意的是,由于版权原因,`ojdbc` 并未托管于中央仓库 (Central Repository),因此可能无法直接通过上述方式下载驱动程序。解决方案如下: - 将手动下载的 `ojdbc.jar` 文件安装至本地 Maven 仓库或者私有 Nexus/Maven 服务器中。 - 使用命令行工具完成安装操作,例如: ```bash mvn install:install-file -Dfile=/path/to/ojdbc8.jar \ -DgroupId=com.oracle.database.jdbc \ -DartifactId=ojdbc8 \ -Dversion=19.8.0.0 \ -Dpackaging=jar ``` #### 2. 添加 Spring Data JPA 支持 为了简化数据库的操作流程并充分利用 Spring Boot 的自动化配置功能,建议加入 Spring Data JPA 及其相关组件作为辅助开发工具之一[^4]。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` #### 3. 配置 application.properties/yml 文件 最后,在项目的资源配置文件 (`application.properties`)定义好对应的数据源参数即可实现无缝对接效果。 ```properties spring.datasource.url=jdbc:oracle:thin:@//localhost:1521/orclpdb1 spring.datasource.username=scott spring.datasource.password=tiger spring.datasource.driver-class-name=oracle.jdbc.OracleDriver spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle12cDialect ``` 注意:如果使用的确实是较老版本如 Oracle 11g,则应调整 Hibernate 方言设置为兼容模式下的类名——即替换为 `org.hibernate.dialect.Oracle10gDialect`[^5]。 --- ### 总结 综上所述,要让基于 Maven 构建体系结构之上的 Spring Boot 工程成功接入 Oracle Database 11g 实例,除了正确指定必要的外部库之外,还需要合理规划内部属性设定部分的内容安排工作量较大但只要按照既定步骤逐一落实就不会存在太大难度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值