我认为Maven依赖关系的顺序在之前并不重要,并认为这是它的专家。这是我原来的pom.xml
依赖项:
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.19</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring3</artifactId>
<version>2.19</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.19</version>
</dependency>
</dependencies>
效果很好,今天我想将弹簧依赖性移到底部,这样那些球衣可以在一起。然而,我不能再让它工作了,我的Jetty抱怨道:
[ERROR] Failed to execute goal org.eclipse.jetty:jetty-maven-plugin:9.3.0.M1:run (default-cli) on project mtest: Execution default-cli of goal org.eclipse.jetty:jetty-maven-plugin:9.3.0.M1:run failed: A required class was missing while executing org.eclipse.jetty:jetty-maven-plugin:9.3.0.M1:run: org/apache/commons/logging/LogFactory
这真的令人困惑,所以我必须关注依赖关系顺序吗?我怎么知道正确的订单?
答案 0 :(得分:69)
依赖关系的顺序 很重要,因为Maven解决了传递依赖关系,从版本2.0.9开始。摘录自documentation:
(...)这确定在遇到多个版本的工件时将使用哪个版本的依赖项。 (...)您可以通过在项目的POM中明确声明版本来保证版本。 (...)自Maven 2.0.9起,声明中的顺序为:第一个声明获胜。
答案 1 :(得分:13)
要扩展另一个答案(声明声明顺序会影响Maven对传递依赖的依赖中介),可以使用一些工具:
mvn dependency:tree [-Dscope=[runtime|test]]
将向您显示所选范围可用的依赖项。 See here for details mvn dependency:build-classpath
为您提供了类路径中可用依赖项的顺序(如果两个或多个类路径条目具有相同的类,则前一个获胜)。 See here for details 我对您的情况了解不多,但在编译/运行时,您经常遇到错误版本的1个或更多罐子。 Declaring your own version of the library in question or locking down the version <dependencyManagement>
是(^[^\d\n]+$)\n(^[^\d\n]+$)\n^(\d+)\s+:\s+(\d+)\s*$
的选项。
现在回答你的另一个问题 - 在声明依赖关系时,你怎么知道正确的顺序是什么?
我的建议 - 正确的声明顺序可以按照您希望的顺序为您提供所需的依赖项版本。使用上述工具检查您的依赖关系,并在必要时调整声明的顺序。
请注意,大多数jar包含不相连的类,因此jar类在类路径中出现的确切顺序通常并不重要。我注意到的唯一例外是some jars in SLF4J故意影响其要替换的其他记录器库中的类。