我正在开发一个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()
时会引发异常。
我的问题是:是否有可能在编译期间而不是运行时引发此错误?
上图:在项目A中,我打开了B源类,Intellij知道出了点问题。我猜maven也可以知道它,并在mvn编译期间抛出编译错误。然后,我会注意到B的开发人员要更新C。
也许这是一个软件工程问题。我上面描述的是一个抽象。现实是:我正在A上工作,其他人正在B上工作。在我的工作分支中,我需要更新依赖项C。但是我不知道有多少个依赖C的程序包也需要更新C。在B上工作的家伙不知道他们必须更新C。
答案 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