升级第三方jar时,是否必须重新编译应用程序?

时间:2009-02-11 14:18:11

标签: java

我有一个使用某些第三方API的java应用程序。由于各种补丁,第三方jar文件会相当频繁地更改,但API本身并不会经常更改。

每次第三方jar更改时,是否必须重新编译应用程序?

5 个答案:

答案 0 :(得分:8)

如果API发生更改,即使您不需要对源代码进行任何更改,也应重新编译。如果API未更改,则无需重新编译。

“即使您不需要进行任何更改”的原因是某些与源兼容的更改可能不是二进制兼容的。例如,假设您当前正在呼叫:

public void foo(String x)

在更高版本中,这将更改为:

public void foo(Object x)

显然你的代码仍然会编译,但它解析调用的方法会改变。

当然,这有点边缘。基本上,只要你知道API何时发生变化,你应该没问题。

答案 1 :(得分:5)

理论上需要重新编译的另一种情况是常量。常量的值字面上编译为使用它的类的字节码。如果在新版本的API中更改了值,则针对旧版本编译的任何内容都将继续使用旧值,这可能会导致不同的行为并且很难诊断错误。

当然,没有大脑的API设计师如果可以避免,就不会改变公共常数的值,但可能会出现需要的情况。

答案 2 :(得分:3)

不,您只需要重新编译您更改的代码。

答案 3 :(得分:3)

一般不会,如果第三方设计得很好。

但是,在(更糟糕的)API更改方法签名或删除方法/类的情况下,您需要修改并重新编译自己的代码。

例如,如果doSomething(String value);成为doSomething(int value);(或String doSomething()成为int doSomething()),那么调用doSomething(...)的应用程序代码将会不再工作了。因此需要修改代码(然后重新编译)。

但是,您必须知道这种情况非常罕见(例如,如果您使用的是pre-alpha依赖项)。通常,为了确保向后兼容性,API永远不会删除类或方法。而是使用@Deprecated注释来迫使开发人员使用另一个方法/类...

答案 4 :(得分:1)

java不是C ++:当你使用库时,你不会导入一行代码。您只需根据请求加载库并使用它。 因此,您无需重新编译代码:)