升级第三方 jar 时是不是必须重新编译我的应用程序?

Posted

技术标签:

【中文标题】升级第三方 jar 时是不是必须重新编译我的应用程序?【英文标题】:Do I have to recompile my application when I upgrade a third party jar?升级第三方 jar 时是否必须重新编译我的应用程序? 【发布时间】:2009-02-11 14:18:11 【问题描述】:

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

每次第三方 jar 更改时我都必须重新编译我的应用程序吗?

【问题讨论】:

【参考方案1】:

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

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

public void foo(String x)

在以后的版本中,这改为:

public void foo(Object x)

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

当然,这有点极端。基本上,只要您知道 API 何时更改,就应该没问题。

【讨论】:

我之前一直对不断变化的值有所了解。如果常量(public static final)的改变了,即使常量的名字(也就是API)没有改变,你也需要重新编译。 Java 在编译时内联常量值。【参考方案2】:

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

当然,任何有头脑的 API 设计者都不会在可以避免的情况下更改公共常量的值,但在某些情况下可能是必要的。

【讨论】:

“当然,没有一个有脑子的 API 设计师”让我哈哈大笑。【参考方案3】:

不,你只需要重新编译你改变的代码。

【讨论】:

【参考方案4】:

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

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

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

常量除外(public static final)。这些被内联到您的编译代码中。

以上是关于升级第三方 jar 时是不是必须重新编译我的应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

升级的 Python;我是不是必须手动重新安装所有站点包?

在基于 NetBeans Maven 的项目中,在编程和编译时包含一个库,但从构建中排除

Ruby 和“您必须使用 OpenSSL 支持重新编译 Ruby 或更改 Gemfile 中的源代码”

从 2.1 升级到 2.2.4 后 Grails 自动编译中断

求助,win10下MDK5编译例程出错,怎么解决

使用第三方库时,它们是否被编译为我的应用程序版本?