JDK和JRE到底是什麼,JAVA EE 和 JAVA SE的區別

幹了這麼久的後端開發程序員,回首想想當初爲什麼選擇了Java,還真說不上來原因,好像順其自然的上學學到了,好像順其自然畢業找到了一份Java開發的工作,一干就到現在,Java這門經久不衰的語言到底何去何來,我自己也沒有什麼123可說的,於是還是加班之餘(此處應有滑稽表情)做了一些瞭解和總結。

一、Java是什麼

Java是什麼,大家好像覺得這不是一個問題,Java就是一門面向對象的編程語言唄。Java是一門編譯語言不假,但實際上它的價值早已超過作爲一門語言那麼簡單了,客觀上說,它已經逐漸演變成了一個技術體系,一個提供了完整的用於日常跨平臺開發和跨平臺部署的技術體系。

二、Java技術體系

1.Java技術體系組成

Java技術體系都包括什麼呢,我們先想一想一個Java程序的執行過程,當我們編輯並運行一個Java程序時,首先需要使用文字編輯軟件或集成開發環境在Java源文件中定義不同的類(.java文件),然後在這些類中書寫給人看的代碼,接着我們需要把源文件編譯生成一種二進制中間碼,存儲在class文件中(.java文件被編譯成了給虛擬機看的.class字節碼文件),然後再通過運行與操作系統平臺環境相對應的Java虛擬機來運行class文件,執行編譯產生的字節碼,調用class文件中實現的方法來滿足程序的Java API調用,如果需要,我們還可能引入調用第三方提供的JavaAPI。

所以,我們可以總結一下,Java技術體系大致應該包括:Java編程語言(起碼可以叫人編碼開發)豐富的Java類庫API(畢竟大部分程序員都喜歡找封裝好的API拿來就用,另外個人感覺也是提供了一個較爲統一的API規範)Class文件格式(人來開發,但是還需要一個翻譯給翻譯成虛擬機能看懂的字)Java虛擬機(廢話,真正幹活的就是它)。比較官方的說法由JCP(Java Community Process的簡寫,是一個開放的國際組織,主要由Java開發者以及被授權者組成,職能是發展和更新)提出的定義Java技術體系包括以下幾部分:

  • Java程序設計語言
  • Java虛擬機
  • Class文件格式
  • Java類庫API(其中可以包括Java本身的API和第三方Java類庫API)

2.Java技術體系組成劃分

(1)對於Java技術體系,如果我們按照各個組成部分的功能來劃分的話,還可以將其分爲兩大部分:JDKJRE

JDK(Java Development Kit):直接翻譯過來就是Java開發工具包,JDK是用於支持Java程序開發的最小環境。簡單說就是程序員日常開發需要的一個環境,那麼我們日常開發需要什麼呢?Java程序設計語言、Java虛擬機、Java類庫,以上三個便是組成JDK的必要部分。

截自Jdk 8 中的 README 自述文件

JRE(Java Runtime Environment):直接翻譯過來就是Java運行時環境。當我們對一個類或一個系統開發完畢,將其編譯成字節碼或打成jar包時,這時候我們的任務就完成了,接下來運行程序的話需要Java虛擬機運行,虛擬機在運行程序的時候還需要一些基礎類庫。所以JRE由Java虛擬機和Java類型API組成(這裏細說的話,其實是Java SE中的所有類庫)。

截自Jre 8 中的 README 自述文件
總結:
1.JDK = JRE + Java開發工具
2.你要想開發的話需要JDK,如果你只是想運行一個編譯好的.class文件時,只需要JRE

說道這裏,我們再一起看看當我們在操作系統(以windows舉例)安裝了JDK之後,安裝文件夾下邊都有些什麼東西。

當然,這是我早就裝好了的,可以看到包含jdk和jre兩個文件夾。那先看看jdk中都有些什麼:

一個個的分別來說一下,bin目錄裏面存放了JDK的各種工具命令即JDK開發工具的可執行文件其中這些可執行文件都是二進制的,其中包括編譯器、解釋器以及其他一些工具,比如我們剛開始用的Javac、Java命令去檢查JDK是否安裝配置正確就是在這個目錄下面的命令。bin目錄下的內容如下圖:

include目錄裏面是一些供C語言使用的標題文件,其中C語言的頭文件支持Java本地接口和Java虛擬機調試程序接口的本地編程技術。這裏頭文件的作用是讓Java調用C/C++實現的函數功能。include目錄下的內容如下:

jre目錄路徑下安裝的就是運行Java程序所必須的JRE環境。我們可以看到在jre目錄下的bin裏面有java.exe、javaws.exe,但沒有javac.exe。jre目錄下的內容如下:

lib目錄:該路徑下存放的是JDK工具命令的實際執行程序。lib目錄下的內容如下:

src.zip目錄:該壓縮文件裏面存放的就是Java所有核心類庫的源代碼。src.zip目錄解壓內容如下:

那麼和jdk同級的jre文件下有什麼呢,內容如下:

好像和jdk文件夾下的jre的內容一樣。誒?等等,爲什麼已經有個單獨的jre文件夾,jdk裏還要加個jre問價夾呢?jdk文件夾下的jre和與jdk同級的jre有什麼區別呢?接下來我們先說說這個。

其實jdk裏面的jre一般用於運行java本身的程序,比如javac等可執行程序,而和jdk同級的jre是用於運行用戶編寫的java程序。簡單來說就是JDK裏的工具幾乎是用Java所編寫,所以也是Java應用程序,因此要使用JDK所附的工具來開發Java程序,也必須要自行附一套JRE纔行。那麼當在執行java.exe的時候,怎麼知道要使用哪個jre呢,操作系統尋找JRE的方式如下:

  •  先找當前目錄下有沒有JRE
  • 再找父目錄下有沒有JRE
  • 接着在PATH路徑中找JRE
  • 註冊表HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\ 查看CurrentVersion的鍵值指向哪個JRE

所以,當執行jdk\bin\java.exe的時候,用的jre是bin的父目錄jdk下面的jre,而運行\jre\bin\java.exe的時候,用的則是與jdk同級的jre,並且當java.exe找到了對應的jre之後還有一個驗證程序,驗證jre和java.exe的版本是否一致,如果不一致也會發生錯誤。這也是我們在安裝JDK時會在操作系統的環境變量裏配置Path。當我們在之後文章中瞭解了jvm之後,在將java代碼整個的運行過程串一遍,會清晰很多。

(2)言歸正傳,如果按照技術服務的領域或者按照技術關注的重點業務來劃分,Java技術體系可以分爲以下幾個產品線:

  • Java Card:支持Java小程序(Applets)運行在小內存設備(如智能卡)上的平臺。
  • Java ME(Micro Edition):支持Java程序運行在移動端的平臺,及JDK6之前的J2ME,雖然Android主要使用Java語言開發,但是Android並不是屬於Java ME的。
  • Java SE(Standard Edition):支持桌面級應用的Java平臺,提供了完整的Java核心API,比如java.*包下的API,另外這也是爲什麼說組成JDK的Java類庫API來自於Java SE了。
  • Java EE(Enterprise Edition):支持使用多層架構的企業應用的Java平臺,除了包括Java SE的API之外,還做了大量針對性的擴充,比如javax.*包下的API。

網絡上普遍認爲javaME就是用來開發嵌入式的,javaSE就是用來開發桌面的,javaEE就是用來開發企業端的。這也許沒錯,但是爲什麼我們採用SSH框架和SSM框架的時候使用的是javaEE的技術,爲什麼下載的是jdk就可以了呢。

  • JDK不分ME,SE,EE,他們都是對Java即JDK的一種封裝和規範。

  • 下面引自: http://javaligang.blog.51cto.com/5026500/1825681
    Java剛開始的時候,因爲各種應用和生態不成熟,很多東西需要有人牽頭制定強制規範引導Java的發展,於是Java EE曾經引領了企業級應用的開發。
    但隨着時代的進步,以及越來越多的公司和組織參與到Java世界,出現了各種各樣的Java EE組件的代替者,比如Hibernate、Spring就是其中兩個典型。相反,Java官方制定的各種Java EE規範反而不太受歡迎,他們制定了JSF規範,但實際企業開發喜歡用Struts 2、Spring MVC;他們制定了EJB規範,但實際企業開發往往還是喜歡用Spring;他們制定了JPA規範,但實際企業開發往往還是喜歡直接用Hibernate、MyBatis。
    現代企業級應用常用的各種框架和工具,比如Struts 2、Spring、Hibernate、jBPM、Activiti、Lucene、Hadoop、Drools、CXF等這些大家耳熟能詳的組件,全部都不是來自Oracle官方,但是卻在企業應用中開發經常用到的。
    現在企業裏面,真正常用的Java EE規範有什麼?Servlet、JSP、JMS、JNDI。這些技術都只是充當了一個程序的入口而已。
    Oracle之所以可能考慮放棄Java EE,正體現了Oracle對喪失Java控制權的無奈。企業的本質是逐利,Oracle每年爲制定Java EE規範投入不少人力、財力,但制定的規範最終並沒有獲得市場的青睞,所以Oracle可能放棄這種喫虧不討好的事情。
    但Java不同,2016年6月,Java在商業語言排行榜上的市場份額將近21%,龐大到恐怖的市場份額,背後隱藏着巨大各種專利使用費和盈利商機,任何一個理智的公司都不會放棄這個會下金蛋的母雞。

由此可見,oracle上提供的java EE是官方指定的javaEE規範,裏面都是符合官方指定的javaEE組件,我們用SSM,SSH開發後臺時使用到的只有Servlet、JSP、JMS等少量的java EE規範,沒有必要使用orcale提供的java EE版本,直接使用jdk就可以當然還需要maven等管理第三方的jar包來實現功能。所以,無論是JavaEE還是JavaSE都只是oracle將自己的JDK再次封裝,提供的一個比較成熟的解決方案或標準,類似於Spring,只不過是Java EE變得越來越被動。

 

附:下面爲一個較爲完整的Java技術體系所包含的內容的圖:

 

最後,思考幾個小問題,看看是否已經掌握了:

1.什麼是JAVA SE 、EE、ME?

2.什麼是JDK、JRE?

3.JDK中都包含什麼?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章