簡體   English   中英

升級第三方jar時,是否必須重新編譯應用程序?

[英]Do I have to recompile my application when I upgrade a third party jar?

我有一個使用某些第三方API的java應用程序。 由於各種補丁,第三方jar文件會相當頻繁地更改,但API本身並不會經常更改。

每次第三方jar改變時,我是否必須重新編譯我的應用程序?

如果API發生更改,即使您不需要對源代碼進行任何更改,也應重新編譯。 如果API未更改,則無需重新編譯。

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

public void foo(String x)

在以后的版本中,這將更改為:

public void foo(Object x)

顯然你的代碼仍然會編譯,但它解析調用的方法會改變。

當然,這有點邊緣。 基本上,只要你知道API何時發生變化,你應該沒問題。

另一種理論上需要重新編譯的情況是常量。 常量的值字面上編譯為使用它的類的字節碼。 如果在新版本的API中更改了值,則針對舊版本編譯的任何內容都將繼續使用舊值,這可能導致不同的行為並且很難診斷錯誤。

當然,沒有大腦的API設計師如果可以避免它,就不會改變公共常量的值,但可能存在必要的情況。

不,您只需要重新編譯您更改的代碼。

一般不,如果第三方設計得很好。

但是,在API更改方法簽名(或刪除方法/類)的(可怕)情況下,您將需要修改並重新編譯自己的代碼。

例如,如果你有doSomething(String value); 那變成了doSomething(int value); (或String doSomething()成為int doSomething() )然后調用doSomething(...)的應用程序代碼將不再起作用。 因此需要修改代碼(然后重新編譯)。

但是,您必須知道這種情況非常罕見(例如,如果您使用的是pre-alpha依賴項)。 通常,為了確保向后兼容性,API永遠不會刪除類或方法。 而是使用@Deprecated注釋來迫使開發人員使用另一個方法/類......

java不是C ++:當你使用庫時,你不會導入一行代碼。 您只需根據請求加載庫並使用它。 因此,您無需重新編譯代碼:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM