我正在测试japicmp的Maven插件:
Public Function x(i As Control)
Dim d As HTMLDocument
Dim f As MSHTML.HTMLFormElement
Dim e As MSHTML.HTMLInputElement
Set e = d.getElementById("x")
Set f = e.form
f.submit
End Function
为了测试它,我多次复制了一个现有项目,并向接口添加了一个方法(即打破了API)。
如果我只增加补丁版本(1.0.0 - > 1.0.1),并且主要版本(1.0.0 - > 2.0.0)正确忽略,则会正确报告API中断。
但是,对于次要版本更改,不会报告。我可能忽略了一些基本的东西,但应该报告API中断以进行次要版本更改。
我检查了manual,但它只声明:"如果设置为true,插件会分析旧档案和新档案的版本,并根据这些版本决定二进制兼容或允许或不允许不兼容的更改。此选项需要Major.Minor.Patch形式的版本(例如1.2.3或1.2.3-SNAPSHOT)。"
japicmp后来链接到semver.org,其中指出:"当你以向后兼容的方式添加功能时的MINOR版本" - 所以接口的新方法显然是一个API中断。
如果我删除界面而不是添加方法,则构建失败(应该如此)。
我找到了这个用例的测试:CompatibilityChangesTest#testMethodAddedToInterface:所以看起来问题是设置,而不是工具本身。
我做了什么?我忽略了什么?
答案 0 :(得分:2)
向接口添加方法实际上是二进制兼容的,因为使用您的库的应用程序不了解新方法,因此不会调用它。如果一个类实现了接口中定义的所有方法,那么JVM不会在运行时检查,只能由编译器完成。
向接口添加方法只是源不可用。这意味着如果您针对更改的接口重新编译源代码,那么编译将失败,因为实现接口的类现在必须实现新方法。