我正在开发/维护一个Java库,并希望跟踪版本之间的向后兼容的变化。此列表可能包含类声明,方法签名等的更改。
例如,如果我(意外地)通过添加参数来更改构造函数,那么我希望将其包含在列表中并收到有关更改的警告。
// before
public MyCar(String name) { ... }
// after (some accidental change)
public MyCar(String name, long mileage) { ... }
// an application using my library depending on this constructor would be broken
// when it updates to the new version
是否有自动生成此列表的方法?感觉就像IntelliJ或Gradle应该能做的事情。
我的团队已尝试审核拉取请求并手动维护CHANGELOG(这似乎是一种常见方法),但这很容易出现人为错误。我寻求一种理想情况下可以成为构建系统一部分的自动化方法。
答案 0 :(得分:3)
我一直手动维护兼容性列表,但有时候会遗忘。
快速浏览一下几个开源库,但他们近10年来没有发布新版本。所以我不知道他们是否可以使用新的Java 7或8功能。
注意:我从未使用过任何这些!
CLIRR - 一些其他apache项目使用的apache项目来显示已经发生了什么变化(来自apache commons-lang here的示例输出。2005年最后一次更新甚至没有使用Maven 2构建(或者3)
JDiff javadoc doclet比较器。可能支持Java 5.最后更新于2008年
Japitools - 显然是由GNU Classpath项目用来比较它们的API,以便与不同版本的Sun Java类库签名兼容。看起来自2006年以来一直没有更新
答案 1 :(得分:1)
有一种更好的方法。
通过@Deprecated
注释您的方法,保留一段时间的向后兼容性,并指出它们何时不受支持。然后将@deprecated
部分添加到您的Javadoc,这将是最终用户需要关注的automatically generate a list of deprecated features。
这有一个额外的好处,允许您介绍何时引入功能(@since
),以及什么时候删除功能,而不必大肆渲染太多其他工具。
由于你已经添加了一个更具体的代码示例,我将再添加一个注释:那些类型的更改......是有意识的设计决策的结果,它带来了两个问题:
任何传统工具都无法摆脱这些问题;这需要认真讨论从一个API转换到另一个API所需的时间。如果您发现需要向核心引入新功能,那么您最好确定没有破坏旧版本的情况。
这就是拥有API的意思 - 你 让旧版本潜伏一段时间。