我有两个依赖项,这两个依赖项指向冲突的javax.validation:validation-api
版本。为了解决这个问题,我使用最新版本的validation-api
添加了一个dependencyManagement
部分。
虽然这会导致应用程序构建正确,并且应用程序在运行时工作,但在测试期间,构建会在引用验证api的行处中断(通过@Valid
注释)。
冲突的依赖关系是:
<dependency>
<groupId>io.dropwizard</groupId>
<artifactId>dropwizard-core</artifactId>
<version>0.9.2</version>
</dependency>
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-user</artifactId>
<version>2.8.0-beta1</version>
<scope>provided</scope>
</dependency>
我添加了以下dependencyManagement
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
这在运行时和编译时都有效,但在我引用@Valid
的测试中失败。
将非常感谢任何帮助,因为这让我发疯。
发布于 2016-04-12 17:54:15
运行下面的代码,首先省略dropwizard-core
mvn dependency:tree -Dincludes=javax.validation
输出将为:
[INFO] +- com.google.gwt:gwt-user:jar:2.8.0-beta1:provided
[INFO] | +- javax.validation:validation-api:jar:1.1.0.Final:compile
[INFO] | \- javax.validation:validation-api:jar:sources:1.0.0.GA:provided
因此采用所需的1.1.0最终版本,而不是可传递的1.0.0.GA版本。
但是,由于依赖项管理条目的原因,validation-api
在compile
上。
虽然省略了gwt-user
,但输出将是:
[INFO] com.sample:sample2:jar:0.0.1-SNAPSHOT
[INFO] \- io.dropwizard:dropwizard-core:jar:0.9.2:compile
[INFO] \- io.dropwizard:dropwizard-validation:jar:0.9.2:compile
[INFO] \- org.hibernate:hibernate-validator:jar:5.2.2.Final:compile
[INFO] \- javax.validation:validation-api:jar:1.1.0.Final:compile
此外,已经为默认(compile
)作用域定义了validation-api
的依赖项管理,影响了Maven通过gwt-user
引入它的方式(上面列出的是compile
,尽管gwt-user
是provided
,它的所有可传递依赖项也将在provided
上,除非依赖项管理以不同的方式定义,如本例)。
对于每个official Maven documentation,提供的依赖项是
编译和测试类路径上提供的
因此,在编译和测试过程中,您需要将两个库结合在一起,即validation-api
和gwt-user
,这两个库在运行时会有不同的耦合(gwt-user
将由运行时容器提供)。
如果gwt-user
必须在provided
范围内,我建议采用更精细的治理,并直接从gwt-user
中排除validation-api
。因此,将从dropwizard-core
中引入依赖项管理所需的版本的validation-api
。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>io.dropwizard</groupId>
<artifactId>dropwizard-core</artifactId>
<version>0.9.2</version>
</dependency>
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-user</artifactId>
<version>2.8.0-beta1</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
更新
在下面的评论中,您还使用了以下内容作为依赖项管理的一部分:
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt</artifactId>
<version>2.8.0-beta1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
然后,它还在其依赖项管理中指定了以下内容:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
<!-- Note: use classifier=sources rather than type=java-sources so they're added to the classpath -->
<classifier>sources</classifier>
</dependency>
虽然您设法覆盖了第一个,但没有覆盖第二个,实际上它仍然被添加到类路径中(检查上面的依赖关系树输出,1.0.0.GA源代码仍然在提供的作用域中。这是编译器/测试和运行时之间的进一步区别。在运行时,您没有将它作为类路径的一部分。
因此,我建议将其1.1.0的最终版本作为重写添加到您的依赖项管理中,这样它将与第一个版本保持一致。
发布于 2016-04-12 17:54:25
您必须从一个或另一个依赖项中排除依赖项,如下所示:
<dependency>
<groupId>io.dropwizard</groupId>
<artifactId>dropwizard-core</artifactId>
<version>0.9.2</version>
</dependency>
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-user</artifactId>
<version>2.8.0-beta1</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</exclusion>
</exclusions>
</dependenc
https://stackoverflow.com/questions/36568756
复制相似问题