可能的故障排除路径在provided
定义的范围 () 上gwt-user
,这是唯一引入validation-api
应用上述依赖项管理的库。
运行以下第一个省略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.Final版本而不是传递的1.0.0.GA版本。
(请注意上面的范围,每个依赖项条目的最后一个标记,它们都应该打开,provided
因为它的根gwt-user
在provided
范围内。但是,因为依赖项管理条目而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
因此,确实,两者都会引入它,但第一个被定义为provided
范围,而第二个被定义为默认 ( compile
) 范围。
此外,validation-api
已经为 default ( compile
) 范围定义了依赖管理,这会影响 Maven 如何通过gwt-user
(上面列出的) 引入它compile
,即使gwt-user
isprovided
及其所有传递依赖也将 on provided
,除非依赖管理以不同方式定义,就像在这种情况下)。
提供的依赖项,根据官方 Maven 文档是
在编译和测试类路径中可用
因此,您在编译和测试两个库的结合中具有validation-api
和gwt-user
,然后它们在运行时将具有不同的耦合(gwt-user
预计将由运行时容器提供)。
如果gwt-user
必须在provided
范围内,我建议采用更精细的治理并validation-api
直接从gwt-user
. 因此,validation-api
将从dropwizard-core
依赖项管理所需的版本中引入。
<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.Final版本也添加到您的依赖项管理中,使其与第一个版本保持一致。