亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否有實際理由強制執行 JDK 版本進行構建?

是否有實際理由強制執行 JDK 版本進行構建?

慕無忌1623718 2022-06-04 09:25:17
存在maven enforcer 插件,它可以強制構建僅在特定 JDK 版本上運行。我想知道是否有任何實際的理由可以做到這一點?我們已經構建配置來指定源和目標版本。據我了解,這應該綽綽有余,因為Java是向后兼容的。例如它在 gradle 中的外觀:compileJava   {  sourceCompatibility = '1.8'  targetCompatibility = '1.8'}這就是它在maven中的樣子:  <properties>    <maven.compiler.source>1.8</maven.compiler.source>    <maven.compiler.target>1.8</maven.compiler.target>  </properties>如果您發現任何需要確切 jdk 版本的理由 - 請您也將其寫下來。UPD。問題更多是關于使用 JDK 8、9、10 或 11 編譯版本 8 的 java 源/目標項目是否有任何實際區別......
查看完整描述

3 回答

?
手掌心

TA貢獻1942條經驗 獲得超3個贊

造成這種情況的主要原因可能是在較新的 JDK 的編譯器中進行了一些更好的優化。因此,即使目標字節碼級別與舊編譯器相同,目標字節碼本身也可能會得到改進。

根據 Brian Goetz的說法,這很重要:

有時,通過 JVM 改進可以更好地從源代碼轉換為字節碼。比如5之前,Foo.class被翻譯成反射調用;之后,去LDC。

因此,您可能有理由希望在整個組織中堅持使用給定的語言級別(因為共享代碼),但特定應用程序仍然可以利用 VM 改進。


編輯:對不起!引用的推文是關于使用低于目標(例如)的源進行編譯-source 8 -target 11,因此它與 OP 詢問的內容不同。盡管如此,即使目標保持不變,也許更新的編譯器也可以生成更好的字節碼。


PS。根據Basil的建議,讓我提一下 JDK 9+ 的javac--release標志,它可以防止在堅持舊語言級別的同時使用較新 JDK 的 API。


查看完整回答
反對 回復 2022-06-04
?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

一點也不。來源主要是關于語法。目標是關于特定的字節碼幻數和功能。

但是您可以很好地編寫符合 Java 7 的代碼,使用只有 jdk 8 或更新版本提供的單個 X 類。然后,當您使用 Java 8 jdk 時,該編譯器將找到該類 X 并構建良好。但是在 Java 7 jvm 上運行該代碼時,Java 8 類 X 丟失,導致運行時異常。

所以:強制 jdk 會阻止您使用在目標版本之后添加到 Java 的類。


查看完整回答
反對 回復 2022-06-04
?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

那么有多種原因。我要指出的是在企業環境中部署。

假設您在公司中運行著數千臺維護的機器,您只是無法在每臺計算機上安裝每個版本的 java。此外,安全性通常不允許下載(通常根本無法直接訪問 Internet),并且每個可用的 Java 版本都需要在安全性方面進行維護 - 需要大量文書工作和討論(例如安全性)。

底線是:在企業中,可用的 Java 版本非常有限,而且通常不是最前沿的。

現在,假設可用版本是 Java 8?,F在,如果您希望應用程序在您必須確保的環境中運行,它實際上在可用版本上運行(如 Java 8)。如果它使用該版本中不可用的東西,它就不會運行或崩潰。本質上,這樣的應用程序根本無法在企業中使用。這意味著企業會尋找不同的解決方案,他們可以在他們的環境中實際使用。

因此,能夠告訴編譯器目標版本有助于創建一個可以并且將實際使用的應用程序(并且不會在用戶機器上崩潰)。


查看完整回答
反對 回復 2022-06-04
  • 3 回答
  • 0 關注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號