首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Maven依赖管理在测试时被忽略(在运行时有效)

Maven依赖管理在测试时被忽略(在运行时有效)
EN

Stack Overflow用户
提问于 2016-04-12 17:15:07
回答 2查看 433关注 0票数 1

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

虽然这会导致应用程序构建正确,并且应用程序在运行时工作,但在测试期间,构建会在引用验证api的行处中断(通过@Valid注释)。

冲突的依赖关系是:

代码语言:javascript
运行
复制
<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

代码语言:javascript
运行
复制
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>

这在运行时和编译时都有效,但在我引用@Valid的测试中失败。

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

EN

回答 2

Stack Overflow用户

发布于 2016-04-12 17:54:15

运行下面的代码,首先省略dropwizard-core

代码语言:javascript
运行
复制
mvn dependency:tree -Dincludes=javax.validation

输出将为:

代码语言:javascript
运行
复制
[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-apicompile上。

虽然省略了gwt-user,但输出将是:

代码语言:javascript
运行
复制
[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-userprovided,它的所有可传递依赖项也将在provided上,除非依赖项管理以不同的方式定义,如本例)。

对于每个official Maven documentation,提供的依赖项是

编译和测试类路径上提供的

因此,在编译和测试过程中,您需要将两个库结合在一起,即validation-apigwt-user,这两个库在运行时会有不同的耦合(gwt-user将由运行时容器提供)。

如果gwt-user必须在provided范围内,我建议采用更精细的治理,并直接从gwt-user中排除validation-api。因此,将从dropwizard-core中引入依赖项管理所需的版本的validation-api

代码语言:javascript
运行
复制
<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>

更新

在下面的评论中,您还使用了以下内容作为依赖项管理的一部分:

代码语言:javascript
运行
复制
<dependency>
    <groupId>com.google.gwt</groupId>
    <artifactId>gwt</artifactId>
    <version>2.8.0-beta1</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

然后,它还在其依赖项管理中指定了以下内容:

代码语言:javascript
运行
复制
<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的最终版本作为重写添加到您的依赖项管理中,这样它将与第一个版本保持一致。

票数 2
EN

Stack Overflow用户

发布于 2016-04-12 17:54:25

您必须从一个或另一个依赖项中排除依赖项,如下所示:

代码语言:javascript
运行
复制
       <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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36568756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档