Java 是否有自动生成接口更改列表的方法?

Java 是否有自动生成接口更改列表的方法?,java,Java,我正在开发/维护一个Java库,并希望跟踪版本之间向后不兼容的更改。此列表可能包含类声明、方法签名等的更改 例如,如果我(意外地)通过添加参数更改了构造函数,那么我希望将其包括在列表中,并收到有关更改的警告 // before public MyCar(String name) { ... } // after (some accidental change) public MyCar(String name, long mileage) { ... } // an application u

我正在开发/维护一个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应该能够做的事情


我的团队已经尝试过手动查看请求和维护变更日志(这似乎是一种常见的方法),但这很容易出现人为错误。我寻求一种理想情况下可以成为构建系统一部分的自动化方法。

有更好的方法

通过使用
@Deprecated
注释您的方法,在一段时间内保持向后兼容性,并指示何时不支持这些方法。然后将
@deprecated
片段添加到您的Javadoc中,这将是最终用户需要关心的

这样做的另一个好处是,您可以在何时引入功能(
@自
)以及何时删除功能,而无需对许多其他工具操心太多

既然您添加了一个更具体的代码示例,我将再添加一个注释:这些类型的更改……是有意识的设计决策的结果,它带来了两个最重要的问题:

  • 回归测试(如中所示,测试应该捕捉到这一点)
  • 易于过渡到较新的API(例如,如果我需要突然给它一个新参数以获得功能,它不是一个新事物,而不是附加到旧的遗留事物上吗?)
这些问题不能用任何传统的工具来解决;这需要认真讨论从一个API转换到另一个API所需的时间。如果你发现你需要在核心中引入新的功能,那么你最好让darn确信这并没有破坏旧的情况


这就是拥有一个API意味着什么——你有一个旧版本潜伏一段时间。

我总是手动维护兼容性列表,但有时我会忘记一些事情

快速浏览一下,可以看到几个开源库,但它们已经有近10年没有发布过新版本了。所以我不知道他们是否会使用新的Java7或Java8特性

注意:我从来没有用过这些

-其他一些apache项目使用apache项目来显示发生了什么变化(apache commons lang的示例输出。上次更新于2005年,甚至没有使用Maven 2(或3)构建)

JavadocDoclet comparator。可能支持Java5。上次更新于2008年


-显然,GNU类路径项目使用它来比较它们的API与不同版本的Sun Java类库的签名兼容性。它看起来不像是自2006年以来更新的

我想我可以添加一行来描述“到目前为止已经做了什么来解决它。”如果你认为这会吸引垃圾邮件,那么就指出一个明显的答案。你可能想看看使用版本控制系统会怎么样?例如,使用git,一个“git日志”将为您提供所有提交的列表,因此如果您的提交消息是明确的,它可以作为更改日志使用。@VincentDurmont我们尝试了,但人类太容易出错。与其更改方法签名,为什么不使用方法重载?当您最终删除不推荐的方法时,您仍然会遇到与OP相同的问题。不一定。如果构建Javadoc是发布/构建步骤的一部分,它将反映在每个构建中。@Makoto我同意你的观点,但我也想找到一种方法来防止自己错误地更改接口。这在更大的团队中更为重要。@Makoto我同意你可以从Javadoc获得一个不推荐使用的方法列表,但你无法看到何时遇到这些方法HOD消失或其签名更改而不与以前的状态进行比较感谢@JimLim。因此,我认为我的建议仍然有效;以较慢的方式反对并引入功能。如果您认为有人仍在使用旧构造函数,您应该进行回归测试,以发现新构造函数的错误行为tor,以完全平滑不同API版本之间的转换。如果CLIRR有效,那将非常棒。我们将在明天试用。