更改第三方jar的版本是否需要重新编译我的代码?

时间:2014-03-27 14:26:17

标签: java interface jar

这似乎是一个愚蠢的问题,但在我在团队会议上开枪之前,我想绝对确定我能正确理解事情。

我有一个引用第三方jar文件的Java应用程序。我的代码只使用他们的接口。如果第三方给我一个不同版本的jar文件,我只需用旧的替换旧的jar我需要重新编译我的应用程序吗?

如果接口方法签名包含其中一个类,例如

,这仍然是正确的
public void thirdPartyMethod(ThirdPartyEvent e);

据我了解,除非界面已更改,否则我不必重新编译。即使ThirdPartyEvent类被更改(添加了新方法),我仍然不需要重新编译,除非我想访问这些新方法。

我的理解是否正确?

提前致谢。

编辑: 这个问题可以关闭它是重复的。我在搜索时没有看到它 - 不知道我怎么能错过它......

BTW我的问题没有明确说明,但API没有改变 - 接口是相同的。

最终编辑: 我想要注意的是,有时候部署新版本的第三方jar比部署整个重新编译的应用程序要容易得多......

作为一种惯例,我经常重新编译,这样做绝对没有害处。但是,在我工作的地方,完全缺乏对Java接口如何工作的理解。每个人都担心新的第三方实施已经改变,我们的申请将不再适用。我告诉他们,只有当第三方改变API或给我们一个破碎的罐子时才会发生。

无论如何长话短说,我想如果我可以证明你可以替换jar而不是重新编译那将说明(至少部分)接口是如何工作的。我已经通过电子邮件发送了这篇帖子的链接,副本和Mik378的链接,希望它最终会沉入......

5 个答案:

答案 0 :(得分:2)

Here是有关Java二进制兼容性的规则。

从那里,你可以保持你的代码不变 ONLY 如果更改(在Jar中)关注:

  

重新实现现有方法,构造函数和初始化器   提高绩效。

     

更改方法或构造函数以返回输入的值   他们以前要么抛出通常不应该发生的异常   或者因为进入无限循环或导致死锁而失败。

     

将新字段,方法或构造函数添加到现有类或   接口

     

删除类的私有字段,方法或构造函数。

     

更新整个软件包时,删除默认值(仅限软件包)   访问类和接口的字段,方法或构造函数   包裹。

     

重新排序现有类型中的字段,方法或构造函数   声明。

     

在类层次结构中向上移动方法。

     

重新排序类或接口的直接超接口列表。

     

在类型层次结构中插入新的类或接口类型。

对于所有其他情况,您必须更改您的代码,以便从新Jar中获益(没有奇怪的意外)。

答案 1 :(得分:1)

这是对的。只要第三方没有改变其公共界面,并且你没有做任何像使用反射来访问你不应该做的事情,那么就没有理由重新编译你的代码。

答案 2 :(得分:1)

两者都是假的,他们可以改变接口方法或类方法的签名(参数号,类型等)。

编辑:您可以检查他们是否使用semantic versioning,因此通过版本控制,您可以推断他们是否引入了不兼容的更改。

答案 3 :(得分:0)

这并非绝对必要,但如果内部代码调用签名可能已更改的新方法或方法,则会冒NoSuchMethodErrors的风险。

所以,没有必要,但强烈推荐。

答案 4 :(得分:0)

<强> BIG YES

如果你的新接口包含你的实现者类需要实现的新方法,或者更糟糕的是它们现在抛出一些已检查的异常怎么办。你需要处理这些事情并重新编译整个代码