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检查我的更新,我发现了更重要的区别这可能对你有帮助