Maven可以在编译而不是运行时抛出错误吗?

时间:2020-11-04 07:50:40

标签: java maven

我正在开发一个Maven项目A。它有一个相关的程序包B。B有一个相关的程序包C。

B(1.0版)具有一种方法:

// B(version 1.0)
public class TestB {
    public static String invoke() {
        return TestC.invoke("nnn");
    }
}

C(版本1.0)具有一种方法:

// C(version 1.0)
public class TestC {
    public static String invoke(String name) {
        return name;
    }
}

在项目A(取决于B1.0和C1.0)中,我调用TestB.invoke(),它运行良好。

由于某种原因,我必须更改TestC方法:

C(版本1.1)

// C(version 1.1)
public class TestC {
    public static String invoke(Long name) {  // params[0] changged here
        return name.toString();
    }
}

在这种情况下,A取决于B(1.0)和C(1.0),B(1.0)取决于C(1.0),它仍然可以正常工作。但是,如果A依赖于B(1.0)和C(1.1),它将成功编译,但是在调用TestB.invoke()时会引发异常。

我的问题是:是否有可能在编译期间而不是运行时引发此错误?

enter image description here

上图:在项目A中,我打开了B源类,Intellij知道出了点问题。我猜maven也可以知道它,并在mvn编译期间抛出编译错误。然后,我会注意到B的开发人员要更新C。

也许这是一个软件工程问题。我上面描述的是一个抽象。现实是:我正在A上工作,其他人正在B上工作。在我的工作分支中,我需要更新依赖项C。但是我不知道有多少个依赖C的程序包也需要更新C。在B上工作的家伙不知道他们必须更新C。

3 个答案:

答案 0 :(得分:0)

简而言之,Maven只是一个构建工具,因此它只会在构建期间(而非运行时)发生错误。

如果您需要更多信息,也许可以添加更多细节,例如pom文件和错误消息。

答案 1 :(得分:0)

当API更改时,解决方案应该是使用新版本的C。

然后B将使用C的旧版本,而A将使用旧版本。没有错误,但版本已过时。

将B对C的依赖关系更新到最新版本会在B中产生编译错误。

一切稳定。

答案 2 :(得分:0)

从本质上讲,程序执行期间会引发异常。因此,如果您正在寻找一个一般性的答案:您不能。不过,静态代码分析工具可以为您提供帮助。

如果您正在寻找特定问题的答案,可以通过多种方法来解决。如@Ikamal所指出,准确的答案将需要更多详细信息。

根据对不同库的控制程度,您可以重构代码以删除异常(在何种程度上?不知道它真正取决于代码)。

按原样处理代码,因为您已经知道库版本之间不兼容,所以可以精确确定需要/禁止的版本,以确保具有正确的兼容性。看看Maven enforcer plugin

单元测试是解决此问题的另一种方法。严格来说,这无助于在编译时检测错误。但这有助于在项目构建过程中检测错误。因此,在程序真正执行之前。

编辑:所以最后,看来您正在寻找像这样的Maven插件:https://github.com/openhab/static-code-analysis/blob/master/docs/maven-plugin.md