說明
下面記錄一下 JavaSE、JavaEE、JavaMe 的區(qū)別。
為什么會有 java 2 的名稱
1998年12月,SUN公司發(fā)布了JDK1.2,開始使用Java 2 這一名稱。
目前,Java 2平臺有3個版本,它們是適用于小型設備和智能卡的Java 2平臺Micro版(Java 2 Platform Micro Edition,J2ME)、適用于桌面系統(tǒng)的Java 2平臺標準版(Java 2 Platform Standard Edition,J2SE)、適用于創(chuàng)建服務器應用程序和服務的Java 2平臺企業(yè)版(Java 2 Platform Enterprise Edition,J2EE)。
后來又改名為 JavaEE。
Java SE
Java SE(Java Platform,Standard Edition)。Java SE 以前稱為 J2SE。它允許開發(fā)和部署在桌面、服務器、嵌入式環(huán)境和實時環(huán)境中使用的 Java 應用程序。Java SE 包含了支持 Java Web 服務開發(fā)的類,為 Java Platform,Enterprise Edition(Java EE)提供基礎。
JavaSE是Java的核心,也就是 Java的主要部分。用于開發(fā)桌面應用程序和基于web的應用程序。它提供了從基本對象到高級類的所有東西,這些類被用于網(wǎng)絡、數(shù)據(jù)庫訪問、安全、xml解析、gui開發(fā)。除了這些核心的api之外,它還提供了虛擬機JVM、開發(fā)工具、部署技術(shù)等。
從 Oracle 官網(wǎng),下載 JDK,并安裝完成,就是一個 JavaSE 的環(huán)境了。
JDK8下載地址:https://www.oracle.com/java/technologies/downloads/#java8
安裝完成后,查看 java 版本。

Java EE 與 JavaEE(注意名字之間是否有空格)
JavaEE 與 J2EE 可以理解為同一個東西。
Java EE是一個抽象的規(guī)范。具體實現(xiàn)稱為應用服務器,如GlassFish、WildFly、WebLogic等。當你從Oracle站點下載JavaEE時,它將給你提供大量文檔和示例。例如:GlassFish服務器等。因此,它們只是提供了Java Enterprise Edition規(guī)范的實現(xiàn)。你還可以使用其他的實現(xiàn),比如RedHat WildFly,它也遵循這些規(guī)范。因此,J2EE是1999年-2003年JavaEE的抽象規(guī)范的版本名稱。EJB遵循JavaEE規(guī)范,所以EJB屬于JavaEE。
Oracle 官網(wǎng)中 JavaEE 的實現(xiàn)方案。

JavaEE(Java Platform,Enterprise Edition)。這個版本以前稱為 J2EE。企業(yè)版本幫助開發(fā)和部署可移植、健壯、可伸縮且安全的服務器端 Java 應用程序。Java EE 是在 Java SE 的基礎上構(gòu)建的,它提供 Web 服務、組件模型、管理和通信 API,可以用來實現(xiàn)企業(yè)級的面向服務體系結(jié)構(gòu)(service-oriented architecture,SOA)和 Web 2.0 應用程序。
JavaEE 號稱有十三種核心技術(shù)。它們分別是:JDBC、JNDI、EJB、RMI、Servlet、JSP、XML、JMS、Java IDL、JTS、JTA、JavaMail和JAF。
J2EE是一種利用Java 2平臺來簡化企業(yè)解決方案的開發(fā)、部署和管理相關的復雜問題的體系結(jié)構(gòu)。J2EE技術(shù)的基礎就是核心Java平臺或Java 2平臺的標準版,J2EE不僅鞏固了標準版中的許多優(yōu)點,例如"編寫一次、隨處運行"的特性、方便存取數(shù)據(jù)庫的JDBC API、CORBA技術(shù)以及能夠在Internet應用中保護數(shù)據(jù)的安全模式等等,同時還提供了對 EJB(Enterprise JavaBeans)、Java Servlets API、JSP(Java Server Pages)以及XML技術(shù)的全面支持。其最終目的就是成為一個能夠使企業(yè)開發(fā)者大幅縮短投放市場時間的體系結(jié)構(gòu)。
J2EE體系結(jié)構(gòu)提供中間層集成框架用來滿足無需太多費用而又需要高可用性、高可靠性以及可擴展性的應用的需求。通過提供統(tǒng)一的開發(fā)平臺,J2EE降低了開發(fā)多層應用的費用和復雜性,同時提供對現(xiàn)有應用程序集成強有力支持,完全支持Enterprise JavaBeans,有良好的向?qū)еС执虬筒渴饝?,添加目錄支持,增強了安全機制,提高了性能。
JavaEE 包含了對一系列標準(接口)的實現(xiàn)。
如果你要用這些接口,恐怕要使用JavaEE服務器而不僅僅是一個 Servlet 容器。
Oracle JavaEE 文檔地址:https://www.oracle.com/cn/java/technologies/java-ee-glance.html
Spring 與 JavaEE
Spring是一個分層的JavaSE/EE full-stack(一站式) 輕量級開源框架。
Spring是一個開源的框架Spring是于2003 年興起的一個輕量級的Java 開發(fā)框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。
Spring 目前主要依賴 JavaSE,依賴部分JavaEE(常見依賴:Servlet-api、JPA、Bean Validation等。一般都是用到時,使用 maven 引入)。
可以說 Java EE 是企業(yè)級開發(fā)的官方標準,也可以說 Spring 是企業(yè)級開發(fā)的實際標準。
Spring遵循所有的JavaEE規(guī)范嗎?嚴格的說不是。Spring是一個獨立的框架,它替代并改進了JavaEE的許多部分,你可以將Spring視為一個集成平臺,允許你使用所有JavaEE技術(shù)。這意味著你不一定需要完整的fledge JavaEE應用服務器來支持,你可以在像Tomcat這樣的簡單的servlet容器上運行它。Spring是一個獨立的集成平臺,在JavaEE中有改進和替換,也允許你使用JavaEE技術(shù)。
Spring 官方宣布 Spring Framework 6 和 Spring Boot 3 計劃將基于更高的基線于 2022 年的第四季度發(fā)布通用可用版本:
Java 17+(目前 Spring Framework 5.3.x 的基線是 Java 8-17)
Jakarta EE 9+(目前 Spring Framework 5.3.x 的基線是 Java EE 7-8)
基于 Spring Framework 6 和 Spring Boot 3 的應用程序在運行時方面至少需要 JDK 17,并且需要 Tomcat 10 / Jetty 11(為了兼容 Jakarta EE 9)環(huán)境。
更重要的是,應用程序的源代碼可能需要一些改變:例如,在 Jakarta EE 9 中,只要涉及到 Servlet API、JPA、Bean Validation 等功能,就需要將 javax 改為 jakarta 命名空間。
JavaEE行業(yè)認可的標準API框架;它主要基于注釋和CDI;用于WEB開發(fā)的JFC MVC框架;用于進程數(shù)據(jù)庫操作的JPA實現(xiàn);JTA API和實現(xiàn);基于EJB容器和POJO的實現(xiàn);Oracle許可證。
基于ioc和aop;基于xml配置,目前使用的是注解;使用spring dao框架連接到數(shù)據(jù)庫,基于模板設計patter;提供抽象層以支持各種JTA實現(xiàn)供應商;與不同的Java廠商的不同支持不同的功能,這樣容易與struts2等集成;提供端到端平臺構(gòu)建web應用程序,實現(xiàn)使用DI和AOP的松散耦合;開放源碼許可。
J2EE和Spring繼續(xù)相互影響并相互鼓勵。
J2EE在Spring中激發(fā)了新的增強。
spring的實現(xiàn)重點與J2EE的標準化和可移植性
springsource社區(qū)與Java社區(qū)過程的主要區(qū)別在于其不同的動機。springsource的創(chuàng)新來自于解決現(xiàn)實世界問題的需要。解決方案以解決問題為導向,這樣下一個步驟和整個項目就可以盡可能快速和順利地實現(xiàn)。JCP有點像公司,創(chuàng)新和決策與解決方案如何導致標準技術(shù)規(guī)范相關聯(lián)。另外,像Oracle、IBM、RedHat
甚至SpringSource參與JCP。大多數(shù)Java規(guī)范請求都 需要很長的路徑才能實際實現(xiàn)。例如,jsr303:Bean驗證需要三年才能完成。也許在這個領域,速度并沒有那么重要,因為大多數(shù)大型企業(yè)項目不會經(jīng)常發(fā)生變化,而且會有更長的生命周期。他們甚至可能不想要所有罪行的、但未經(jīng)證實的技術(shù)。J2EE的另一個論點是可移植性。簡而言之,J2EE是一組規(guī)范,在你的應用程序中使用的東西可以被拉入你選擇的任何J2EE兼容的容器中,簡單地說,用一些常規(guī) 的方法來包裝業(yè)務邏輯 ,為CRUD操作 提供持久性,然后從14個J2EE供應商中選擇。理想情況下,你應該能夠在不同服務器之間移動代碼。這有時行得通,首先,現(xiàn)在只有三個供應商支持J2EE7,所以很多都變得無關緊要了。其次,有些實現(xiàn)是特定于供應商的,并且仍然需要時間和資源來讓項目在不同的環(huán)境中運行。當然,這取決于項目的復雜性,一個簡單的示例應用程序?qū)娜魏我粋€開始,但不是一個復雜的。另一方面,spring只支持VMWARE,它被認為是其他庫的包裝器,將他們耦合在一起,提供更容易的訪問和配置功能–如果你知道如何做到這一點的話。但是spring應用程序可以在一個成熟的J2EE服務器上運行,也可以在輕量級JSP容器中運行,比如Jetty,Tomcat,Netty,避免了巨大的開銷。spring甚至可以在獨立模式下有運行,因為spring引導模塊可以包裝Jetty或Tomcat。對J2EE與Spring的大多數(shù)比較測試都存在缺陷。只有良好的負載和壓力測試,以及持續(xù)的基準測試才能真正分析應用程序中的瓶頸。事實上,一個或另一個容器可能更適合于任何特定的情況。
JavaEE 與 Spring 對比
JAVA EE
javaEE是一個開發(fā)分布式企業(yè)級應用的規(guī)范
javaEE 基于注解和CDI
利用web開發(fā)的JFC MVC框架
用于進程數(shù)據(jù)庫操作的JPA(java持久層API)實現(xiàn)
基于EJB(javaee服務器端組件模型)和pojo的實現(xiàn)
Spring
基于IOC和AOP
基于XML配置(注釋)
使用Spring DAO框架(基于模板設計patter)連接到數(shù)據(jù)庫
提供抽象層以支持各種JTA(事務API)實現(xiàn)供應商
提供端到端平臺構(gòu)建web應用程序,實現(xiàn)使用DI和AOP的松散耦合
開放源碼許可
Spring 與 EJB
EJB 和 Spring 是實現(xiàn)企業(yè)級業(yè)務處理的兩種解決方案,EJB 是重量級解決方案,Spring 是輕量級解決方案。
Jakarta EE
網(wǎng)站:https://jakarta.ee/
Jakarta EE 并不是新技術(shù),他的前身就是 Java EE。為什么會改名字呢?
1998年12月,SUN公司發(fā)布了JDK1.2,開始使用Java 2 這一名稱,第二年Sun公司聯(lián)合IBM、Oracle、BEA等大型企業(yè)應用系統(tǒng)開發(fā)商共同制訂了一個基于Java組件技術(shù)的企業(yè)應用系統(tǒng)開發(fā)規(guī)范,名字很自然就取為Java 2 Platform Enterprise Edition簡稱J2EE,后面的事情大家也知道,JDK版本升的很快,J2EE名稱如果跟著Java版本走必然會給開發(fā)人員造成困惑不利于該技術(shù)的推廣,終于在2006年,SUN公司在發(fā)布Java 5后正式將J2EE改名為Java EE(Java Platform, Enterprise Edition),很多早期j2ee開發(fā)者雖然現(xiàn)在用的是最新的java ee標準但他們還是認為自己在用j2ee,當然,只是名稱的改變并沒有給開發(fā)者帶來什么麻煩,相比之下下面這個就是要命。
2009年,Oracle宣布收購SUN,Java相關技術(shù)自然歸Oracle所有,在2017年,Oracle 宣布開源 Java EE 并將項目移交給 Eclipse 基金會,但Oracle移交的很不痛快,提了很多要求,其中就包括不能再使用Java EE這個名稱,雖然有點無理但Eclipse基金會還是接受了這個要求并且改名為Jakarta EE,經(jīng)歷了從j2ee到java ee的改名再經(jīng)歷一次似乎也無所謂,但要命的是Oracle要求Jakarta EE不能修改javax命名空間,這個就意味著java ee移交后代碼就此封版,如果想修改代碼,不好意思,請另起爐灶。
命名空間的轉(zhuǎn)變
如果你是用Maven進行開發(fā),那么Java EE的依賴是這么定義的
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>8.0.1</version>
<scope>provided</scope>
</dependency>
我們可以看到groupId是javax,并且源碼的結(jié)構(gòu)如下:
.
└── javax
├── annotation
├── batch
├── decorator
├── ejb
├── el
├── enterprise
├── faces
├── inject
├── interceptor
├── jms
├── json
├── mail
├── management
├── persistence
├── resource
├── security
├── servlet
├── transaction
├── validation
├── websocket
├── ws
└── xml
所有的源碼都定義在javax.*這個路徑下,根據(jù)Oracle的要求Jakarta EE不能修改javax命名空間,那么Jakarta EE只能將代碼中javax修改為jakarta,因此最新版本Jakarta Maven描述是長這樣的:
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>9.0.0-RC2</version>
<scope>provided</scope>
</dependency>
源碼目錄:
.
└── jakarta
├── activation
├── annotation
├── batch
├── decorator
├── ejb
├── el
├── enterprise
├── faces
├── inject
├── interceptor
├── jms
├── json
├── jws
├── mail
├── persistence
├── resource
├── security
├── servlet
├── transaction
├── validation
├── websocket
├── ws
└── xml
可以看到除了頂層包名稱不一樣下面的定義都一樣,那么包路徑更改會有什么影響?影響非常大。
所有java ee應用服務器比如Weblogic,GlassFish等如果要支持最新版本的jakarta ee就必須修改源碼重新編譯,并且如果支持了jakarta ee就無法支持java ee,也就是無法向前兼容,Tomcat雖然只是Servlet容器但是Servlet本身就是Java EE的一部分,因此也逃不過修改的命運。據(jù)說Tomcat可以對應用進行自動代碼轉(zhuǎn)換以支持jakarta,因此在不遠的將來我們可以看到各種奇技淫巧去兼容jakarta,是不是想起了被IE支配的恐懼。
企業(yè)如果需要用到jakarta ee最新特性必須修改現(xiàn)有代碼,修改并不復雜,就是把代碼中import javax.替換為import jakarta.,修改完重新編譯打包部署,似乎很簡單,事實上沒那么簡單。
對企業(yè)來說,保持應用服務器處于最新版本是必須的,因為新版本可能修復了老版本的漏洞,并且性能上也可能有一定的提升,但如果升級應用服務器的同時也要修改源碼代碼就很大,修改的成本,帶來的風險并不是所有企業(yè)都能接受的。
假設修改了一個應用,那么就需要部署到新版本應用服務器上,由于新服務器不兼容老應用因此需要運維兩套應用服務器,運維成本提高,兩套應用服務器也可能涉及l(fā)icense問題,不知道各廠商要怎么解決這個問題。
總之企業(yè)面臨兩難的境地,要么升級改系統(tǒng)源碼,要么保持不變不升級,要么部分升級運維兩套應用服務器,刀刀都要命。
Java ME
Java ME(Java Platform,Micro Edition)。這個版本以前稱為 J2ME。Java ME 為在移動設備和嵌入式設備(比如手機、PDA、電視機頂盒和打印機)上運行的應用程序提供一個健壯且靈活的環(huán)境。Java ME 包括靈活的用戶界面、健壯的安全模型、許多內(nèi)置的網(wǎng)絡協(xié)議以及對可以動態(tài)下載的連網(wǎng)和離線應用程序的豐富支持。
Java ME 有自己的類庫,其中 CLDC 使用的是專用的 Java 虛擬機叫做 KVM。