我正在试图弄清楚是否可以检查maven依赖项是否仍然在项目的已配置配置中兼容。
这是我的测试设置:
有3个项目。 Child-A
,Child-B
,Child-C
。
Child-A
在2版本中可用,彼此不兼容。
版本0.0.1-SNAPSHOT
有一个方法
public void myMethod(String oneParameter)
版本0.0.2-SNAPSHOT
将此方法更改为
public void myMethod(String oneParameter, String secondParameter)
Child-B
与版本Child-A
中的0.0.1-SNAPSHOT
相关,并使用一个参数调用该方法。
public class ChildB {
public void callChild(String myParam) {
final ChildA test = new ChildA();
String methodParam = String.format("%s is calling %s with Parameter %s ", this.getClass().getName(),
test.getClass().getName(), myParam);
test.myMethod(methodParam);
}
}
Child-C
现在依赖于Child-B和对Child-A Version 0.0.2-SNAPSHOT
的依赖。
Child-C
以这种方式调用Child-B
:
public static void main(String[] args) {
ChildB inner = new ChildB();
inner.callChild(" Parameter from main method! ");
}
对于编译器来说这很好,但是在运行时期Child-B
会遇到麻烦,因为版本Child-A
中存在0.0.2-SNAPSHOT
,因此只有一个参数的方法不再存在
我正在尝试以这样的方式配置我的maven设置:当Child-C
构建时,它将检查其依赖关系的签名/兼容性以及它的有效pom的设置。
我认为maven animal-sniffer插件可能是一个解决方案,但没有找到检查内部依赖关系的部分。
有人知道如何检查这些行为吗?
答案 0 :(得分:0)
问题不在于Maven。即使两个版本都在运行时存在,JVM也只会加载一个版本,因此由于缺少一个或另一个方法,您将获得运行时异常。
最佳解决方案是将单参数方法添加到版本0.0.2并在所有poms中指定该版本。如果这不起作用,您将需要修改代码,因此只调用双参数方法。
答案 1 :(得分:0)
您可以使用Maven强制程序来实现依赖项收敛。
https://maven.apache.org/enforcer/maven-enforcer-plugin/
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.0.1</version>
<executions>
<execution>
<id>enforce</id>
<configuration>
<rules>
<DependencyConvergence/>
</rules>
</configuration>
<goals>
<goal>enforce</goal>
</goals>
<phase>validate</phase>
</execution>
</executions>
</plugin>
</plugins>
这将向您显示依赖项收敛问题,如下所示:
Dependency convergence error for org.codehaus.jackson:jackson-jaxrs:1.7.1 paths to dependency are:
+-com.nodeable:server:1.0-SNAPSHOT
+-org.mule.modules:mule-module-jersey:3.2.1
+-com.sun.jersey:jersey-json:1.6
+-org.codehaus.jackson:jackson-jaxrs:1.7.1
and
+-com.nodeable:server:1.0-SNAPSHOT
+-org.mule.modules:mule-module-jersey:3.2.1
+-org.codehaus.jackson:jackson-jaxrs:1.8.0
这样,您可以确保同一库没有多个版本作为依赖项,并消除了类加载问题的可能性。
如果您提到的方法的签名发生了变化,那么您仍然应该能够在编译时看到错误。