为什么Spring Boot入门依赖项被设计为与Maven的传递依赖机制的声明目的相反?

M. *_*tin 13 spring dependency-management maven maven-dependency-plugin spring-boot

根据Maven依赖文档,所有编译依赖项都是明确列出的,而不是在编译时传递使用:

它的意思是[传递编译依赖项]应该是运行时范围,因此必须明确列出所有编译依赖项 - 但是,有一种情况,您依赖的库从另一个库扩展一个类,迫使您在编译时间.因此,编译时依赖性仍然是编译范围,即使它们是可传递的.

Spring Boot有一个"Starter"依赖的概念.从Spring Boot自己的文档(以及我在Spring Boot自己的示例和其他地方看到的许多使用示例)中可以清楚地看出,这些示例旨在传递大量其他依赖项,以便在运行时和编译时使用.Per Spring Boot的文档:

启动器是一组方便的依赖关系描述符,您可以在应用程序中包含这些描述符.您可以获得所需的所有Spring和相关技术的一站式服务,而无需搜索示例代码并复制粘贴的依赖描述符.例如,如果您想开始使用Spring和JPA进行数据库访问,只需在项目中包含spring-boot-starter-data-jpa依赖项,就可以了.

启动器包含许多依赖项,这些依赖项是使项目快速启动和运行所需的依赖项,以及一组受支持的托管传递依赖项.

使用这种机制传递引入编译范围的依赖关系似乎与Maven官方打算如何使用它们的意图不一致.使这一点非常清楚的一个地方是Maven 依赖:分析插件目标,它在直接使用Maven启动器依赖项时显示警告.例如,mvn dependency:analyze在Spring Boot自己的" Getting Started "示例上运行会生成以下输出:

[WARNING] Used undeclared dependencies found:
[WARNING]    org.springframework:spring-web:jar:4.3.6.RELEASE:compile
[WARNING]    org.springframework.boot:spring-boot-test:jar:1.5.1.RELEASE:test
[WARNING]    org.springframework.boot:spring-boot-test-autoconfigure:jar:1.5.1.RELEASE:test
[WARNING]    org.springframework:spring-test:jar:4.3.6.RELEASE:test
[WARNING]    org.springframework.boot:spring-boot:jar:1.5.1.RELEASE:compile
[WARNING]    org.hamcrest:hamcrest-library:jar:1.3:test
[WARNING]    org.springframework:spring-context:jar:4.3.6.RELEASE:compile
[WARNING]    junit:junit:jar:4.12:test
[WARNING]    org.springframework.boot:spring-boot-autoconfigure:jar:1.5.1.RELEASE:compile
[WARNING]    org.springframework:spring-beans:jar:4.3.6.RELEASE:compile
[WARNING] Unused declared dependencies found:
[WARNING]    org.springframework.boot:spring-boot-starter-web:jar:1.5.1.RELEASE:compile
[WARNING]    org.springframework.boot:spring-boot-starter-test:jar:1.5.1.RELEASE:test
[WARNING]    org.springframework.boot:spring-boot-starter-actuator:jar:1.5.1.RELEASE:compile
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么Spring Boot启动器模式的设计方式与底层构建系统的声明方式完全相反.是否有关于该主题的发布讨论,或在任何地方给出解释?

M. *_*tin 1

这个问题是在 Spring Boot 项目中作为一个问题提出的spring-boot#8341提出的。几位 Spring Boot 开发人员回应了该问题,并表示这实际上并不是对 Maven 依赖机制的滥用。

\n

评论

\n
\n
\n

为什么 Spring Boot 启动器模式的设计方式与底层构建系统的意图直接相反?

\n
\n

IMO,您对 Maven 文档中的一句话读得太多了。我认为这表明即使被警告你也必须选择加入。

\n
\n

有没有理由认为这种滥用是“可以”的?

\n
\n

滥用是相当主观的。我不认为首发是一种误用。如果这样做,那么您可以自由地显式声明所有编译依赖项。

\n
\n

是否有一种“正确”的方法可以更好地实现此功能 \xe2\x80\x94 通过单个简单的 Maven 配置 \xe2\x80\x94 方便地在设置的已知版本上提供一组依赖项?

\n
\n

我不这么认为,这可能是传递编译依赖项保留在编译范围内并且默认情况下不生成警告的一个很好的原因。

\n
\n

评论

\n
\n

您过度阅读了这一点,并且您的观点在我看来缺乏实用性。dependency:analyze 目标是为用户提供一种方法来检测您的编译类路径仅包含您实际需要的内容。文档中的这句话只是为了解释为什么编译范围也是传递的。

\n

[...]

\n

回想起来,您遇到的是 Maven 问题,而不是 Spring Boot 问题,因为大量未使用 Spring Boot 的项目本身并未列出所有编译依赖项。

\n
\n

根据此反馈,票证MDEP-557已为 Maven 依赖项插件创建

\n

因此,为了回答这个问题,Spring Boot 团队认为这是传递依赖的适当用法,并且这并不违背 Maven 的意图。

\n