Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Maven依赖关系管理在测试时被忽略(在运行时工作)_Java_Maven_Dependency Management_Transitive Dependency - Fatal编程技术网

Java Maven依赖关系管理在测试时被忽略(在运行时工作)

Java Maven依赖关系管理在测试时被忽略(在运行时工作),java,maven,dependency-management,transitive-dependency,Java,Maven,Dependency Management,Transitive Dependency,我有两个依赖项,它们指向一个冲突的javax版本。为了解决这个问题,我使用最新版本的验证api添加了一个dependencyManagement部分 虽然这会导致应用程序生成正确,并且应用程序在运行时工作,但在测试期间,生成会在引用验证api的行处中断(通过@Valid注释) 冲突的依赖项包括: <dependency> <groupId>io.dropwizard</groupId> <artifactId>dropwizard-core

我有两个依赖项,它们指向一个冲突的
javax版本。为了解决这个问题,我使用最新版本的
验证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>
这在运行时和编译时工作,但在我引用
@Valid
的测试中失败


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

一个可能的故障排除路径在为
gwt用户
定义的作用域(
提供的
)上,该作用域是唯一引入
验证api
并应用上述依赖项管理的库

首先运行以下操作,忽略dropwizard核心

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  
[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
因此,采用所需的1.1.0.最终版而不是可传递的1.0.0.GA版本。
(注意上面的作用域,即每个依赖项的最后一个标记,它们都应该在
provided
上,因为它的根
gwt user
provided
作用域上。但是,
validation api
compile
上,因为依赖项管理)

省略
gwt user
时,输出为:

[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  
[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
因此,实际上,两者都会引入它,但第一个定义为
提供的
范围,而第二个定义为默认(
编译
)范围

此外,已为默认(
编译
)范围定义了
验证api
的依赖关系管理,这将影响Maven如何通过
gwt用户
将其引入(如上所列,如
compile
,即使
gwt user
提供的
,其所有可传递的依赖项也将是
提供的
,除非依赖项管理有不同的定义,如本例所示)

提供的依赖项,根据

可在编译和测试类路径上获得

因此,在编译和测试期间,您将同时拥有两个库,
validation api
gwt user
,这两个库在运行时将具有不同的耦合(
gwt user
预计由运行时容器提供)

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

<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>

javax.validation
验证api
1.1.0.1最终版本
io.dropwizard
dropwizard核心
0.9.2
com.google.gwt
gwt用户
2.8.0-beta1
假如
javax.validation
验证api
更新
从下面的评论中,您还使用以下内容作为依赖项管理的一部分:

<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>

com.google.gwt
gwt
2.8.0-beta1
聚甲醛
进口
然后在其依赖项管理中指定以下内容:

<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>

javax.validation
验证api
1.0.0.GA
javax.validation
验证api
1.0.0.GA
来源
虽然您成功地覆盖了第一个,但没有覆盖第二个,实际上它仍然被添加到类路径中(检查上面的依赖关系树输出,1.0.0.GA源仍然在提供的范围内引入。这是编译器/测试和运行时之间的进一步区别。在运行时,您没有将其作为类路径的一部分


因此,我建议您也将其1.1.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

io.dropwizard
dropwizard核心
0.9.2
com.google.gwt
gwt用户
2.8.0-beta1
假如
javax.validation
验证api

同样的问题,不起作用。在运行时起作用,但测试失败。谢谢。我认为您的想法是正确的。但是,我已经尝试了排除,只是再次尝试了排除-错误不会消失。它继续出现在测试中,而运行时继续工作。因此,它不会消失在测试中。这是运行依赖项的输出tree:
[INFO]com.myproject:jar:1.0-SNAPSHOT[INFO]\-io.dropwizard:dropwizard验证:jar:0.9.2:compile[INFO]\-org.hibernate:hibernate验证程序:jar:5.2.2.最终:compile[INFO]\-javax.validation:validation-api:jar:1.1.0.Final:compile
为了获得更连贯的内容,您可以尝试将提供的范围应用到dependencyManagement条目,然后删除刚才添加的esplicit排除项。然后,在运行时可能会出现相同的错误:虽然这在一开始并不好,但它可以进一步帮助实现装配ht solution.Yep,这也会导致运行时错误。还有一件事,在我的dependencyManagement中,我有以下条目:
com.google.gwt gwt 2.8.0-beta1 pom import
@ClickUpvote检查我的更新,我发现了更重要的区别这可能对你有帮助