这似乎是一个愚蠢的问题,但在我在团队会议上胡说八道之前,我想绝对确定我理解的是正确的。
我有一个引用第三方jar文件的Java应用程序。我的代码只使用它们的接口。如果第三方提供给我一个不同版本的jar文件,而我只是用新的jar文件替换旧的jar文件,我需要重新编译我的应用程序吗?
如果接口方法签名包含它们的一个类,例如
public void thirdPartyMethod(ThirdPartyEvent e);
这是我的理解,除非接口已经改变,我不需要重新编译。即使更改了ThirdPartyEvent
类(添加了新方法),我仍然不必重新编译,除非我想访问这些新方法。
我的理解正确吗?
提前感谢。
编辑:这个问题可以解决,它是重复的。我搜索的时候没有看到——不知道我怎么会错过它…
顺便说一句,我的问题没有明确说明,但API没有改变-接口是一样的。
最后的编辑:但我确实想指出,有时候部署第三方jar的新版本比部署整个重新编译的应用程序要容易得多……
作为一种实践,我经常重新编译,这样做绝对没有害处。然而,我工作的地方完全缺乏对Java接口如何工作的理解。每个人都担心新的第三方实现已经改变,我们的应用程序将无法再工作。我告诉他们,只有当第三方更改API或给我们一个破损的jar时,才会发生这种情况。
总之,长话短说,我认为如果我可以证明您可以替换jar而不重新编译,这将说明(至少部分)接口是如何工作的。我用电子邮件发送了这篇文章的链接,副本和Mik378的包含链接,希望它最终能被吸收…
以下是有关Java二进制兼容性的规则。
从那里,您可以保持您的代码不变只有如果更改(在Jar中)涉及:
重新实现现有的方法、构造函数和初始化式提高性能。
修改方法或构造函数的输入返回值它们以前要么抛出通常不应该发生的异常或者由于进入无限循环或导致死锁而失败。
向现有类或类中添加新的字段、方法或构造函数接口。
删除类的私有字段、方法或构造函数。
当整个包被更新时,删除default (package-only)中的类和接口的字段、方法或构造函数包。
重新排序现有类型中的字段、方法或构造函数声明。
在类层次结构中向上移动一个方法。
重新排序类或接口的直接超接口列表。
在类型层次结构中插入新的类或接口类型。
对于所有其他情况,您必须更改代码以受益于(没有奇怪的意外)新的Jar。
正确。只要第三方没有改变它的公共接口,并且您没有做任何花哨的事情,比如使用反射来访问您不应该访问的东西,那么就没有理由重新编译您的代码。
均为false,它们可以改变接口方法或类方法的签名(参数编号,类型等)。
编辑:您可以检查他们是否使用语义版本控制,因此通过其版本控制,您可以推断他们是否引入了不兼容的更改。
这不是绝对必要的,但是如果它们的内部代码调用新方法或签名可能已经更改的方法,那么您将冒NoSuchMethodErrors
的风险。
所以,没有必要,但强烈建议。
BIG YES
如果你的新接口包含了你的实现者类需要实现的新方法,或者更糟的是它们现在抛出了一些受控异常,该怎么办?您需要处理这些事情并重新编译整个代码