maven - 传递依赖

时间:2013-03-02 18:02:14

标签: maven transitive-dependency

我在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-bean也依赖于log4j。

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

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

2 个答案:

答案 0 :(得分:10)

声明您明确依赖的依赖项,它是否提供您直接导入和使用的类,或者它是提供您直接使用的服务的东西,如Log4J。传递依赖应该只提供运行时所需的依赖关系,但是你不自己使用。

答案 1 :(得分:1)

这有两个部分:

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

  

依赖范围 - 这允许您仅包含适用于构建的当前阶段的依赖项。 ...测试:   此范围表示正常使用应用程序不需要依赖关系,并且仅可用于测试编译和执行阶段。 (Apache)的

第二部分:

如果未指定依赖项的版本,则它依赖于“其他”pom来管理依赖项。因此,依赖性是可传递的并由其他人管理。 “依赖管理”

  

依赖关系管理 - 这允许项目作者直接指定在传递依赖关系中或在未指定版本的依赖关系中遇到工件的版本。 (Apache)的

Maven Apache transitive dependency