5

在 pom.xml 中定义数据时,我试图遵循最佳实践,所以我开始研究 Spring 源代码,我看到了:


<project xmlns="http://maven.apache.org/POM/4.0.0"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aop</artifactId>
  <packaging>jar</packaging>
  <version>3.1.1.RELEASE</version>
.....

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${project.version}</version>
      <scope>compile</scope>
</dependency>

---

<dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <scope>test</scope>
</dependency>
-----

但是,spring-beans 也依赖于 log4j。

你能告诉我,对于最佳实践方法,你应该在多大程度上依赖传递依赖?

我问这个是因为我的第一个想法是不要重新声明 log4j 依赖项,因为 spring-beans 已经声明了它。

4

2 回答 2

11

声明您明确依赖的依赖项,无论是提供您直接导入和使用的类,还是提供您直接使用的服务,例如 Log4J。传递依赖项应该只提供运行时需要但您自己不使用的依赖项。

于 2013-03-02T18:05:19.867 回答
1

这有两个部分:

log4j 是为“测试”范围声明的,它不会成为最终输出(jar/war ...)的一部分。因此,当 spring-beans 依赖 log4j 进行测试(范围)时,这并不意味着在提供或运行时(范围)使用 spring-beans 的项目存在传递依赖

依赖范围 - 这允许您仅包含适用于当前构建阶段的依赖项。... test:此范围表示该依赖项对于应用程序的正常使用不是必需的,仅适用于测试编译和执行阶段。(阿帕奇)

第二部分:

当没有指定依赖的版本时,它依赖于“其他”pom 来管理依赖。所以依赖是传递的并由其他管理。“依赖管理”

依赖管理——这允许项目作者在传递依赖或未指定版本的依赖中遇到工件时直接指定要使用的工件的版本。(阿帕奇)

Maven Apache 传递依赖

于 2013-03-02T18:50:36.617 回答