【问题标题】:How to check maven dependency compatibility如何检查maven依赖兼容性
【发布时间】:2016-11-23 08:03:13
【问题描述】:

我正在尝试确定是否可以检查 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 依赖于版本0.0.1-SNAPSHOT 中的Child-A,并使用one 参数调用该方法。

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 版本 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 插件可能是一个解决方案,但没有找到检查内部依赖关系的部分。

有人知道如何检查这些行为吗?

【问题讨论】:

  • 没有人知道如何继续这个挑战。

标签: java maven maven-plugin dependency-management maven-dependency


【解决方案1】:

问题不在于 Maven。即使这两个版本在运行时都存在,JVM 也只会加载一个版本,因此由于缺少一个或另一个方法,您将获得运行时异常。

最好的解决方案是在 0.0.2 版本中添加单参数方法,并在所有 pom.xml 中指定该版本。如果这不起作用,则需要修改代码,以便仅调用双参数方法。

【讨论】:

  • 感谢您的回答。我的项目中有多个依赖项,其中一些依赖于工件,但版本不同。因此,我想检查兼容性,看看我的依赖项是否会遇到问题......(在运行时!)。
【解决方案2】:

您可以使用 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

这样你可以确保你没有同一个库的多个版本作为依赖,并消除了类加载问题的可能性。

如果你提到的方法的签名发生了变化,你应该能够在编译时看到错误。

【讨论】:

    猜你喜欢
    • 2015-07-07
    • 2020-06-09
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2019-12-20
    • 1970-01-01
    • 2021-11-04
    相关资源
    最近更新 更多