決定在 CodeData 推出 Java Tutorial 系列,最主要的是想模彷 Python Tutorial 的流程,推出一系列六小時課程,讓對某技術有興趣但想在短時間內上手的開發者,可以藉由六小時的課程,快速概覽某個技術的生態系,選擇 Java 作為主題,是此系列第一個嘗試。
你可以在 Google Play 或 Pubu 上,取得本系列的電子書版本。
本課程搭配之投影片:
課程目的
六小時絕對不可能讓開發者完全學會某個技術,然後用該技術飛天鑽地,六小時目的在於介紹一個技術的輪廊,某些程度上要呈現該技術的優良部份(The good part),並期望在六小時課程結束之後,開發者可以有個出發點與方向,自行去參與更多的主題,研究更多的內容。Java Tutorial 會是全新撰寫並以連載方式進行,因而沒有像 Python Tutorial 第一堂(1)揭開序幕 中有段信件往來的故事,也沒有 PyCon Taiwan 2013 Tutorial 這現成投影片可以發表在本篇文章中,所以接下來就直接進入課程正軌…
Java 現在來看,可算是門不新甚至有點古老的語言,就撰寫的這個時間點而言,JDK 已經歷七個版本,就參考實作(Reference Implementation, RI)而言,也有各種 Sun JDK、OpenJDK 等實作,如果你是第一次來到 Java 的世界,面對這些版本與實作會有些混亂,因而課程一開始就先來快速認識這些東西吧!
JDK 的版本
以目前撰寫文章的時間點來說,正式釋出的 JDK 最新版本為 JDK7,Java 向後相容(Backward compatibility)做得很好,過去 JDK 版本編譯後可運行的 Java 程式,盡力保證在新版本的 JDK 上可以運行;不過,Java 歷經幾個重要的版本變化,有些版本影響了人們稱呼它的方式,有些版本則在語法上有重大變化,因而有必要先瞭解一下過去 Java 的幾個重大版本。1995 年 5 月 23 日被認為是 Java 的生日,Sun 發表了 Java Development Kits(當時的JDK全名)1.0a2;1998 年 12 月 4 日,Sun 發佈 Java 2 Platform,簡稱 J2SE 1.2,從該版本之後,大家開始習慣用 Java 2 這個名稱,之後約每隔兩年發表的 J2SE 1.3、J2SE 1.4,也一直使用 Java 2 這個名稱。
從 J2SE 1.2 至 1.4 的這幾個 Java 2 版本,JDK 工具、JVM 效能與 API 的功能不斷增強,語法基本上變化不大;2004 年 9 月 29 日發表了 J2SE 5.0,版號從 1.4 突增至 5.0,主要是為了彰顯這個版本增加的重大語法以及功能躍進,至今常用的重大語法變化有像是泛型(Generics)、列舉(Enum)、標註(Annotation)等,都是在這個版本奠定。
2006 年 12 月 11 日,Sun 發表 Java Platform, Standard Edition 6,簡稱 Java SE 6,Sun 官方從這個版本開始,不再使用 Java 2 而是使用 Java 這個名詞了,過去基於 Java 2 的 J2EE(Java 2 Platform, Enterprise Edition)與 J2ME(Java 2 Platform, Micro Edition),後續在基於 Java SE 6 版本而推出的新版本,也正名為 Java EE 與 Java ME,雖然如此,Java 2、J2SE、J2EE、J2ME 這些名稱,因為大家耳熟能詳,其實一直仍常在開發者之間聽到。
從 Java SE 6 之後,停滯了四年多未曾有過新版本的發表,現在的 Java 是 Oracle 所擁有,原因在於從兩千年網路泡沫化以來,以經營伺服器為主的 Sun 營運一直低迷不振,最後在 2010 年 4 月被 Oracle 併購,在易主之後,Oracle 於 2011 年 7 月 28 日推出了 Java SE 7,這個版本就語法上而言只有一些小變化(主要是語法蜜糖),不過其實捨棄了原本 JDK7 規劃中應用的一些重大功能,目的是為了穩定 Java 開發者的信心而推出的版本,有些重大功能,像是 Lambda,被推延至未來 Java SE 8,有些功能甚至要在 Java SE 9 之後的版本才被重新考慮。
JDK8 預計於 2014 年 3 月之後釋出,其中最受人曙目的功能為 Lambda,關於 Lambda 的介紹,可參考本站的 認識 Lambda / Closure,以及 Java 開發者的函數式程式設計。
JCP 與 JSR
在定義 Java 未來功能與特性的過程中,為了讓對 Java 有興趣的廠商、組織、開發者等各方使用者可以參與,Sun 於 1998 年組成了 JCP(Java Community Process) 開放性國際組織,讓 Java 演進過程成為代表成員公開監督的過程。想在未來版本 Java 中加入的功能或特性,必須提交至 JCP 整理規範於 JSR(Java Specification Requests),JSR 而後經過 JCP 執行委員會(Executive Committee)投票決定而成為最終標準文件,最終的 JSR 會提供一個免費且公開原始碼的參考實作(Reference Implementation, RI)。
Oracle JDK 與 OpenJDK7
在過去,Sun JDK 實現,也就是被 Oracle 收購之後的 Oracle JDK 實現,就是 JDK 的參考實作,有興趣的廠商或組織也可以根據 JSR 自行實現產品,像是 IBM 就根據 JSR 實作了自家的 IBM JDK,並且只有通過 TCK 相容性測試的實作,才可以使用 Java 這個商標。2006 年的 JavaOne 大會上,Sun 宣告對 Java 開放原始碼,從 JDK7 b10 開始有了 OpenJDK,並於 2009 年 4 月 15 日正式發佈 OpenJDK。Oracle 時代發佈的 JDK7 正式版本,指定了 OpenJDK7 為官方參考實作。
與同為開放原始碼的 Sun JDK 不同的是,Sun JDK 採 JRL,而 OpenJDK7 採 GPL(帶有 GPL linking exception 的修正版本),前者原始碼可用於個人研究使用,但禁止任何商業用途,後者則允許商業上的使用,因此,OpenJDK7 必須拿掉許多在兩個授權間有衝突的程式碼,也不包括一些部署(Deployment)工具(像是 Java Web Start 等 )以及軟體套件(像是 Java DB)等;現在你在 Java Platform, Standard Edition 7 Reference Implementations 下載 RI 時,也會看到有基於GNU General Public License version 2 與 Oracle Binary Code License 兩個授權的版本。
由於 OpenJDK7 中有許多程式碼因授權衝突而必須拿掉,因此原始的 OpenJDK7 是不完整的,因此無法通過 JCK 相容測試,如果執行
java -version
,原始的 OpenJDK7 顯示的會是 openjdk version 字樣,而不是 java version 字樣。 為了解決授權問題,以便在 Fedora 或 Linux 分支中能自由發佈 OpenJDK7,Red Hat 於 2007 年發起了 IcedTea 計畫,而由於原始的 OpenJDK7 是不完整的,後來 IcedTea 致力於修補 OpenJDK7 使之完備,並通過了 JCK 相容測試,如果使用 IcedTea 修補過後的 OpenJDK7,執行
java -version
,就會顯示 java version 字樣。
OpenJDK7 與 OpenJDK6
在 OpenJDK 官方網站,也可以看到 OpenJDK6 的版本,OpenJDK6 並不是 JDK6 的分支,而是將 OpenJDK7 中 JDK7 的特性拿掉,使之符合 JDK6 的規範,因而 OpenJDK6 實際上是 OpenJDK7 的分支,OpenJDK6 可以通過 JCK 相容測試。Oracle 從 2012 年 7 月以來,就打算結束對 JDK6 的支持,在 2013 年 2 月時宣佈 JDK6 Update 43 時,宣佈這是最後一個免費更新版本(實際上後來還有 Update 45),希望大家趕快昇級至 JDK7。
由於 JDK6 在企業間仍廣泛應用,Red Hat 於 2013 年 3 月時 宣布持有 OpenJDK6 領導權,以能持續對 OpenJDK6 發現的臭蟲與安全問題進行修補,你也可以在 Red Hat Takes Over Leadership of OpenJDK 6 看到一些相關報導說明。
有關 Sun JDK7、OpenJDK 以及 IcedTea 之間的關係,也可以參考 Sun’s JDK7, OpenJDK & IcedTea: Disambiguation 這篇訪談。
瞭解了 JDK 的版本與實作之後,下一篇文章,將來準備一下課程環境,使用的 JDK 版本是 JDK7!