1. 程式人生 > >面對未來的 Java,舊式桌面應用的出路何在?

面對未來的 Java,舊式桌面應用的出路何在?

點選上方“CSDN”,選擇“置頂公眾號”

關鍵時刻,第一時間送達!

Java推出了新的釋出計劃,而Oracle也決定移除JRE中一些舊的和不建議使用的功能。本文將據此介紹一下Java即將發生的變化。由於部分移除的功能對於使用Java開發桌面應用的開發者有重大影響,因此本文將深入討論桌面領域的變化。影響許多公司和開發者的功能之一,就是Java 11將移除Java Web Start。據此,本文將介紹以後Java Web Start的支援情況。

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

新的Java釋出計劃

幾個月之前,Oracle公佈了新的Java釋出計劃。在新的計劃下,Java每六個月會發佈一個主版本,所以Java生態環境將更加敏捷。因此,新的Java特性會更快地推出。一個例子就是Java 10中引入的var。

大多數Java開發者還沒怎麼用過六個月前公佈的Java 9。Java 9中引入了一些新的特性如模組化,而現在Java 10也釋出了,又引入了一些新特性。因此,Java開發者要想跟上潮流,就必須更快地學習新功能和新特性。對於採用微服務架構的新專案來說,升級到Java新版本很容易,因此新的釋出計劃是個好訊息,但對於老式的大型專案來說升級依然很困難。不過,也許不需要為每個Java版本進行升級。Oracle提供了Java的LTS(Long-term support,長期技術支援)版本,其技術支援期限較長。

因此,雖然Java 9和Java 10的生命週期只有六個月,但計劃2018年9月釋出的Java 11將稱為第一個LTS版。

640?wx_fmt=png

因此,Oracle將為Java 11提供幾年的技術支援,為其提供更新和安全補丁。稍後本文會討論LTS版本的具體計劃和限制。

Oracle如何清理JRE

一年前,Oracle宣佈將刪除JRE的部分功能,在Java社群引發了軒然大波。

在Java 8之前,Oracle刪除JRE中的舊程式碼的唯一手段就是@Deprecated註解。從Java 9開始,Oracle開始主動刪除Java中的舊程式碼。討論最激烈的就是sun.misc.Unsafe類。該類不像其他java.*包中定義的類,它不是JCP標準的一部分,因此理論上開發者不應該使用該類。

但是,即使一些標準的功能,在Java 9中也被移除了,如java.util.logging.LogManager類中的這些方法:

java.util.logging.LogManager.addPropertyChangeListener

java.util.logging.LogManager.removePropertyChangeListener

我完全理解,為了以後的模組化Java,部分程式碼必須被移除。LogManager方法使用得很少,因此版本移植並不是很困難。

但從Java 9開始,Oracle開始不斷刪除不建議使用的部分,導致JRE上的應用無法正常執行。例如,Java 10中刪除了java.long.Runtime和java.lang.SecurityManager中的一些方法。因此,使用JRE中不建議使用的功能已經和五年前完全不同了。

今天,Java開發者必須更積極地避免使用這些API,並重構舊程式碼使之不再使用這些API。也許這些API下個版本就會被刪除了,甚至不用等著看兩三個新版本之後的情況。

對於桌面應用開發者這意味著什麼?

如果你的團隊多年來一直使用Swing或JavaFX前端建立應用,你也許會認為這些訊息跟你沒什麼關係。那就大錯特錯了。從今年9月份即將釋出的Java 11開始,一些與Java桌面開發緊密相關的重要功能將從JRE中移除:

Java Applets

Java Web Start

JavaFX

完整的描述可以參見Oracle三月份釋出的官方Java客戶端計劃:

http://www.oracle.com/technetwork/java/javase/javaclientroadmapupdate2018mar-4414431.pdf

我不會討論Applet,因為我的確希望它們在所有舊有專案中消失。瀏覽器廠商早已不再支援Applet、Flash或Silverlight等外掛,或至少已經宣佈了不再支援的計劃。然而另外兩點卻很重要。一些文章討論了JavaFX和Java 11中UI工具鏈的缺失,而我在這篇文章中打算重點討論Java Web Start。我打算等該領域的情況再明朗些,JavaFX的未來確定之後,再寫一篇類似的文章討論JavaFX(或許還有Swing/AWT)。現在討論這些未免會夾雜許多假設。

對於基於Java Web Start的客戶端,這意味著什麼?

對於那些使用基於Java Web Start的應用的公司來說,這絕對是個壞訊息。如果不在執行客戶端的機器上控制Java版本,就會有大麻煩了。

一旦9月份Java 11釋出,使用者在任何機器上安裝了預設的JRE,Java Web Start就不能用了。

儘管近年來我在竭力避免使用Java Web Start,但我知道許多公司依然在使用基於該技術的客戶端。一些公司僅在內部使用Web Start,因此可以控制JRE的版本。另一些公司將基於Web Start的客戶端提供給客戶使用,這樣幾乎不可能控制所有客戶的JRE版本。

可見,一些應用開發者會遇到麻煩:要麼找個辦法不再使用Web Start,要麼讓所有客戶繼續使用舊版本的Java。對於大型的應用,這將需要大量的修補工作,而一些公司已經預見到不可能在秋天之前停止使用Java Web Start。

因此對於基於Java Web Start的應用來說,合理的兩個方案包括:

  • 管理客戶安裝的Java版本。這樣就能爭取到更多時間去重構應用;

  • 儘快移除Java Web Start,為Java 11做好準備。

我們來討論下兩種方案,看看怎樣才能刪除Java Web Start。

Java Web Start和LTS

之前說過,Java 11會移除Java Web Start。更不幸的是,Java 11是下一個提供LTS支援的版本。Java 9和Java 10都只提供六個月的更新和技術支援。就算願意花錢從Oracle購買Java技術支援,這些版本以後也得不到任何更新補丁。

但即使是Java 11,其LTS跟以前的老版本Java如6、7或8的支援也完全不一樣。未來幾年內釋出的所有LTS版,免費支援只提供六個月。因此,如果不從Oracle購買商業支援,那麼為了獲得Java的bug修復和安全補丁,就得每六個月升級一次Java版本。

對於LTS版本(如Java 11),Oracle將提供為期幾年的商業支援。而舊版本Java則完全不同,它們即使在後繼版本釋出之後,也會提供相當長的免費支援。這些“舊”版本就是部分基於Web Start的應用的救命稻草。與僅提供六個月支援的Java 9和Java 10不同,Java 8的技術支援仍然有效。免費的Java 8支援將於2019年1月結束。因此,如果你的Web Start應用能在Java 8上執行,並且能控制客戶的JRE版本,那麼你可以在今年年底之前更新你的應用程式,而無需購買商業支援。

640?wx_fmt=png

但是,如果你需要更多時間,那麼也有辦法。Oracle對Java 8的商業支援將持續到2025年。我認為絕大多數Java開發者從來沒有關心過Java的商業支援,因為之前的所有Java版本的免費生命週期已經足夠更新應用程式了。但是,從新的發行計劃開始,再加上移除Web Start等問題,一些公司將會面臨新的挑戰。因此,我將介紹下Java的商業支援。

Java的商業支援

我並不是Oralce的員工,而且商業支援的資訊很難找到,因此我只能談談我所瞭解的情況。所幸,Oracle的Wolfgang Weigend幫忙提供了一些關鍵的資訊。說起Java的商業支援,你可以選擇兩種不同的模型:

基於CPU的許可證(CPU-based license)

基於使用者的許可證(Named User Plus license)

基於CPU的許可證適合在伺服器上執行Java的人。這種情況下,伺服器上的每個CPU將單獨收費。但這並不適用於桌面應用程式。桌面應用程式必須使用NUP(Named User Plus)許可證。使用該許可證,需要為每個使用Java應用的使用者付費。實際上,這意味著每臺執行客戶端的機器都要付費。

假設你的Web Start應用程式有100個客戶使用。即使只有20個客戶同時使用,你也要為100臺機器付費。好訊息是許可證並不貴。具體的價格取決於公司所在的國家,但一般來說差不多每年$30-40。有了這個許可證,支援的Java版本將獲得每年四次更新,包括bug修復、安全更新等。

因此,如果你的Java Web Start應用有100個客戶,並且不想放棄Java的安全更新,那麼可以每年花大約$3500購買商業支援。

說到Java的商業支援,我還想提一點,那就是Oracle並不是唯一一家提供商業支援的公司。例如,Azul提供Zulu發行版的支援。Zulu是個經過認證的OpenJDK版本,可以很容易地替代Oracle的JRE。Zulu的最大優勢是他們未來的非LTS版的支援時間比Oracle長。

但很不幸,對於使用Java Web Start的公司來說,Zulu並不是個可行的選擇,因為它從來沒支援過Java Web Start。

即使你能控制所有客戶的JRE版本,並且願意為商業支援付費,你也應該立即做出計劃,以停止使用Java Web Start。如果Java的發行計劃沒有變化,2025年將釋出Java 23,到那時你肯定不想再使用Java 8了。因此,是時候討論下如何替代Web Start了。

停止使用Java Web Start

停止使用Java Web Start並沒有靈丹妙藥。目前,沒有任何工具或技術可以提供與Java Web Start相同的功能。Web Start的最大好處就是它很容易使用,因為Web Start部分整合在JRE的原生可執行檔案中。

因此,瀏覽器會下載一個JNLP檔案,然後Java會自動執行並解釋該檔案。Web Start被移除後,這就不會再發生了。因此,任何Web Start技術的後繼者至少需要在客戶機器上安裝軟體。另一個方法是通過許多公司都在使用的作業系統原生工具在客戶的機器上安裝並管理軟體。一個例子就是Active Directory Group Policy Objects,可以用於在Windows客戶端上安裝並管理軟體。

我並不是管理員,因此我對這方面沒什麼經驗。但一些客戶已經在這麼做了,並且在通過這種方式分發原生Java應用。這種原生應用可以很容易地利用javapackager建立。該工具是Java的一部分,可以把應用程式和JRE打包,以建立原生應用程式。這樣,開發者很容易就可以定義執行軟體所需的JRE版本,而無需事先安裝Java。

這種方法很容易使用,而且是個移除Web Start的好辦法,但我們還不知道Java 11會不會包含javapackager。之前說過,Java 11不會包含Applet,Web Start和JavaFX。javapackger是JavaFX的一部分,它是和JavaFX一起開發的。

儘管該工具並不依賴於JavaFX,而且可以用來為Swing、AWT或命令列應用建立原生應用程式,它的歷史可能會導致它在Java 11中被移除。因此目前還不知道javapackager能不能用。

有時候Oracle會提到“jlink”,這是Java 9引入的一個工具,可以提取應用程式需要的模組,以建立一個僅包含應用程式所需的功能的JVM。目前還不能通過jlink建立真正的原生應用程式。因此如果想要使用jlink,就要寫一個批處理指令碼來啟動應用程式。關於jlink的例子可以參考這裡:https://github.com/steve-perkins/jlink-demo。

還有一些第三方工具可以把Java應用程式打包成原生應用程式,如install4J、JWrapper、IzPack。如果你的客戶有自己的分發軟體和更新的方法,這些工具就都能派上用場。

如果需要為Web Start應用程式提供通用的解決方案,從而不依賴於客戶的軟體管理方式,可以考慮一些提供類似於Web Start的開源專案,如UpdateFX 或GetDown。當然,這些工具並不能提供完整的Web Start的功能,而且一些專案的維護並不是很好。我的觀點是,目前還沒有能完美替代Web Start的方案。我認為,這種工具應該提供以下功能:

小型、原生的客戶端工具,只需安裝一次

該工具應該能夠管理多個應用程式

該工具應該能自動下載應用程式的更新

該工具應該支援Java security manager

該工具應該支援檢查JAR簽名

該工具應該能夠管理安裝的JRE,並安裝指定版本的JRE,或安裝額外的JRE

該工具應該能從指定的下載點下載JRE

應用程式應該能指定所需的JRE版本範圍,或指定特定的JRE版本

應用程式應該可以指定由jlink為該應用程式建立的定製JRE

該工具應該可以在作業系統中安裝應用程式快捷方式

據我來看,目前沒有任何工具支援以上所有功能。希望有人能抓住這個機會,提供並維護一個工具。

否則,Java桌面應用程式的開發者社群將分裂到無盡的定製方案中。

明朗的未來?

如前所述,關於Java桌面API的未來的一些觀點仍在討論中,我真誠希望未來幾個月內能成立一個基金會,來管理JavaFX、Swing和AWT的未來。也許,該組織能建立並維護一個工具來替代Java Web Start。

但是,像Jakarta EE一樣,建立這種組織需要花費很多時間,因此社群應該立即開始為未來做準備。

結論

如你所見,目前還有一些點並不明朗,Java桌面API的未來需要進一步討論。目前唯一確定的就是未來幾年內Oracle JRE的結構和釋出計劃。其結論就是,對於Oracle來說,Java桌面API已不那麼重要。

但即使我們能成立一個強力的開源基金會,以繼續發展Java的桌面框架,而且就算我們在未來幾年內比Oracle做得更好,Java Web Start也總是要消亡的。

因此,如果你正在開發的應用程式中用到了Java Web Start,那麼應該立即尋找其他解決方案,或者直接將其替換掉,或者考慮長期的Java商業支援。

原文:https://dzone.com/articles/what-the-future-java-releases-will-mean-for-legacy

譯者:彎月,編輯:言則

————— 推薦閱讀 —————

點選圖片即可閱讀

640?wx_fmt=png640?wx_fmt=jpeg640?wx_fmt=jpeg640?wx_fmt=png640?wx_fmt=gif