1

我有两个依赖项指向冲突的javax.validation:validation-api. 为了解决这个问题,我添加了一个dependencyManagement包含最新版本的validation-api.

虽然这会导致应用程序构建正确,并且应用程序在运行时工作,但在测试期间,构建会在引用验证 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

非常感谢任何帮助,因为这让我发疯。

4

2 回答 2

2

可能的故障排除路径在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-userprovided范围内。但是,因为依赖项管理条​​目而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-userisprovided及其所有传递依赖也将 on provided,除非依赖管理以不同方式定义,就像在这种情况下)。

提供的依赖项,根据官方 Maven 文档

在编译和测试类路径中可用

因此,您在编译和测试两个库的结合中具有validation-apigwt-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版本也添加到您的依赖项管理中,使其与第一个版本保持一致。

于 2016-04-12T09:54:15.427 回答
0

您必须像这样排除一个或另一个的依赖项:

       <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
于 2016-04-12T09:54:24.920 回答