我有一个使用某些第三方API的java应用程序。由于各种补丁,第三方jar文件会相当频繁地更改,但API本身并不会经常更改。
每次第三方jar更改时,是否必须重新编译应用程序?
答案 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 ++:当你使用库时,你不会导入一行代码。您只需根据请求加载库并使用它。 因此,您无需重新编译代码:)