这似乎是一个愚蠢的问题,但在我在团队会议上开枪之前,我想绝对确定我能正确理解事情。
我有一个引用第三方jar文件的Java应用程序。我的代码只使用他们的接口。如果第三方给我一个不同版本的jar文件,我只需用旧的替换旧的jar我需要重新编译我的应用程序吗?
如果接口方法签名包含其中一个类,例如
,这仍然是正确的public void thirdPartyMethod(ThirdPartyEvent e);
据我了解,除非界面已更改,否则我不必重新编译。即使ThirdPartyEvent
类被更改(添加了新方法),我仍然不需要重新编译,除非我想访问这些新方法。
我的理解是否正确?
提前致谢。
编辑: 这个问题可以关闭它是重复的。我在搜索时没有看到它 - 不知道我怎么能错过它......
BTW我的问题没有明确说明,但API没有改变 - 接口是相同的。
最终编辑: 我想要注意的是,有时候部署新版本的第三方jar比部署整个重新编译的应用程序要容易得多......
作为一种惯例,我经常重新编译,这样做绝对没有害处。但是,在我工作的地方,完全缺乏对Java接口如何工作的理解。每个人都担心新的第三方实施已经改变,我们的申请将不再适用。我告诉他们,只有当第三方改变API或给我们一个破碎的罐子时才会发生。
无论如何长话短说,我想如果我可以证明你可以替换jar而不是重新编译那将说明(至少部分)接口是如何工作的。我已经通过电子邮件发送了这篇帖子的链接,副本和Mik378的链接,希望它最终会沉入......
答案 0 :(得分:2)
Here是有关Java二进制兼容性的规则。
从那里,你可以保持你的代码不变 ONLY 如果更改(在Jar中)关注:
重新实现现有方法,构造函数和初始化器 提高绩效。
更改方法或构造函数以返回输入的值 他们以前要么抛出通常不应该发生的异常 或者因为进入无限循环或导致死锁而失败。
将新字段,方法或构造函数添加到现有类或 接口
删除类的私有字段,方法或构造函数。
更新整个软件包时,删除默认值(仅限软件包) 访问类和接口的字段,方法或构造函数 包裹。
重新排序现有类型中的字段,方法或构造函数 声明。
在类层次结构中向上移动方法。
重新排序类或接口的直接超接口列表。
在类型层次结构中插入新的类或接口类型。
对于所有其他情况,您必须更改您的代码,以便从新Jar中获益(没有奇怪的意外)。
答案 1 :(得分:1)
这是对的。只要第三方没有改变其公共界面,并且你没有做任何像使用反射来访问你不应该做的事情,那么就没有理由重新编译你的代码。
答案 2 :(得分:1)
两者都是假的,他们可以改变接口方法或类方法的签名(参数号,类型等)。
编辑:您可以检查他们是否使用semantic versioning,因此通过版本控制,您可以推断他们是否引入了不兼容的更改。
答案 3 :(得分:0)
这并非绝对必要,但如果内部代码调用签名可能已更改的新方法或方法,则会冒NoSuchMethodErrors
的风险。
所以,没有必要,但强烈推荐。
答案 4 :(得分:0)
<强> BIG YES
强>
如果你的新接口包含你的实现者类需要实现的新方法,或者更糟糕的是它们现在抛出一些已检查的异常怎么办。你需要处理这些事情并重新编译整个代码