2011-06-08 82 views
18

我只是终于习惯了在我的项目中没有使用未声明或未使用的声明依赖关系。虽然很难跟踪在依赖关系中列出的Unused声明的运行时/测试依赖关系:analyze ...只需在pom.xml中向其中写入注释或以其他方式管理它们以知道它们是测试或运行时所需的。Maven如何解决传递依赖的版本冲突?最近赢的策略

但解决版本冲突的方式对我来说还不清楚。关于传递依赖。

最近赢得策略是如何工作的?一个版本何时用于其他版本?

  • 如果要声明一个版本号的使用未申报的依赖 - 它总是赢

  • 如果不明确指定依赖的版本,Maven可以不能解决任何版本 可能出现关于这种依赖性的冲突(奇怪,但写here

  • 如果不申报未申报的使用依赖,它选择从最近的水平(最近-胜策略)传递依赖,如果冲突是在同一个水平,那么它在某种程度上决定b切口白内障手术挽A版本在版本B的...也许谈到的第一个处理depenencies时胜

+0

如果您想定义测试的依赖关系,只需通过适用于运行时的范围即可。 – khmarbaise 2011-07-21 11:12:13

回答

2

我觉得依赖解析工作,你描述的完全相同的方式。

我也在想,如果你使用<scope>子标签,您<dependency>

从Maven的官方网站援引你的生活会容易得多:

  1. 编译: 这是默认的范围,如果没有指定,则使用。编译依赖关系在项目的所有类路径中都可用。而且,这些依赖关系会传播到依赖项目。
  2. 提供:这非常类似于编译,但表示您期望JDK或容器在运行时提供依赖关系。例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖性设置为范围,因为Web容器提供了这些类。此范围仅在编译和测试类路径中可用,且不是传递性的。
  3. 运行时此范围指示编译时不需要依赖关系,但用于执行。它在运行时和测试类路径中,但不在编译类路径中。
  4. test:此范围表示依赖性对于应用程序的正常使用不是必需的,并且仅适用于测试编译和执行阶段。
  5. 系统:该范围与提供的范围相似,只是必须明确提供包含它的JAR。工件始终可用,并且不会在存储库中查找。
  6. 导入:(仅在Maven 2.0.9或更高版本中可用) 此范围仅用于该节中的类型pom的依赖项。它表明指定的POM应该替换为该POM部分中的依赖关系。由于它们被替换,因此具有导入范围的依赖关系实际上并不参与限制依赖关系的传递性。
1

有一些链接,依赖管理的文档:

http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html (importend表中节“依赖范围”)

有一家德国杂志神的文章,描述的解决依赖关系 - 这里是文章的bibtex ref:http://www.bibsonomy.org/bibtex/2ef10bb1bc1be7806bc3fba53417bbd5f/funthomas424242

有一段关于sonatype书中的依赖插件: http://www.sonatype.com/books/mvnex-book/reference/optimizing-sect-dependency-plugin.html

我希望它是有用的。