我如何检测maven 2 jar依赖项?

时间:2010-07-29 11:42:08

标签: java maven-2 dependencies

我在pom.xml中添加了一些jar作为依赖项,但似乎其中一些是无用的,因为这些jar已经使用依赖机制下载了......

有没有办法看到这些“内置”依赖项,以便我只能在我的pom.xml中添加所需的依赖项?

例如,如果我在pom.xml中添加一个hibernate依赖项,则不需要cglib。

5 个答案:

答案 0 :(得分:3)

不要这样做 - 列出你的代码的每个依赖项,而不是你使用的库的列表; Maven将完成其传递依赖性事务并对其进行处理。

答案 1 :(得分:2)

您可以运行mvn dependency:tree来获取整个树,包括项目中包含的瞬态依赖项。 在那里你可以开始寻找

希望有所帮助

答案 2 :(得分:1)

首先,查看Transitive Dependencies

  

传递依赖是一个新的   Maven 2.0中的功能。这可以让你   避免需要发现和   指定您自己的库   依赖性需要,包括   他们是自动的。

然后,一个好的依赖性分析器将有助于......

mvn 命令行是您的急救:

mvn dependency:tree

有时您必须弄清楚版本号的来源(另请参阅:Dependency Management)。在这里你必须公开父关系,'effective-pom'命令可以帮助解决这个问题:

mvn help:effective-pom

工具支持也很有用......

m2eclipse Dependency Tree tab,显示不同层次结构如何崩溃::

alt text http://www.sonatype.com/books/m2eclipse-book/reference/figs/web/eclipse_pom-editor-depend-tree.png

IntelliJ 还有另一个interesting view that lets you detect the conflicts

alt text http://blogs.jetbrains.com/idea/wp-content/uploads/2010/05/3.png

答案 3 :(得分:0)

如果您正在使用Eclipse,那么您将看到一个自动生成的可视依赖树。在添加依赖项时,如果您不希望它自动提取某些传递依赖项,请使用排除标记,如此

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate</artifactId>
  <version>${hibernate.version}</version>
  <exclusions>
    <exclusion>
      <groupId>asm</groupId>
      <artifactId>asm</artifactId>
    </exclusion>
    <exclusion>
      <groupId>asm</groupId>
      <artifactId>asm-attrs</artifactId>
    </exclusion>
    <exclusion>
      <groupId>cglib</groupId>
      <artifactId>cglib</artifactId>
    </exclusion>
  </exclusions>
</dependency>

由于cglib使用某些版本的hibernate和AOP时存在一些已知的冲突。

答案 4 :(得分:0)

  

有没有办法看到这些“内置”依赖项,以便我只能在我的pom.xml中添加所需的依赖项?

没有内置依赖项。但是,当声明对给定工件的依赖时,Maven还将传递地检索此依赖关系的依赖关系。这种依赖关系称为3.4.4. Transitive Dependencies

  

传递依赖是依赖的依赖。如果project-a取决于project-b,而project-c依赖于project-c,那么project-a将被视为project-c的传递依赖关系。如果project-d取决于project-d,那么project-a也会被视为mvn dependency:tree的传递依赖关系。

因此,如果您需要在项目中使用依赖项,只需声明它(并且此依赖项的依赖项将会传递)。

要可视化项目的依赖关系树,最好的工具是pom.xml(或者您最喜欢的IDE提供的任何前端)。这是一个必须使用的工具,用于分析您的依赖关系并检查它们是否正确收敛以及导致使用预期版本的潜在冲突。

  

例如,如果我在pom.xml中添加一个hibernate依赖项,则不需要cglib。

实际上,这是一个不好的例子,cglib是Hibernate Core的optional依赖,它在<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-cglib-repack</artifactId> <version>2.1_3</version> <optional>true</optional><!-- think of it as "excluded by default" --> </dependency> 声明:

{{1}}

Hibernate为您提供了javassist和cglib之间的选择,由您决定使用哪一个并明确声明它,因此可选状态。

另见