- Java SE (Java Standard Edition) 是 Java 的基础,它包含了构建任何类型 Java 应用程序所需的核心库和虚拟机。
- Java EE (Java Platform, Enterprise Edition) 是在 Java SE 基础之上构建的企业级应用开发平台,它提供了大量用于开发大型、分布式、多层、事务性、安全的网络应用程序的 API 和运行时环境。
详细对比
为了更好地理解,我们可以用一个表格来对比它们的核心差异:

| 特性 | Java SE (标准版) | Java EE (企业版) |
|---|---|---|
| 定位 | 基础平台,所有 Java 版本的核心。 | 企业级应用平台,构建在 Java SE 之上。 |
| 核心组件 | - Java 虚拟机 - 核心语言特性 - 基础 API (集合、IO、网络、多线程等) - Swing/AWT (桌面 GUI) |
- Web 容器 (如 Tomcat, Jetty) - 应用服务器 (如 WebLogic, WebSphere) - 企业级服务 API |
| 主要用途 | - 开发桌面应用程序 - 开发控制台应用程序 - 学习 Java 语言基础 - 开发 Android App (基于 Java SE) |
- 开发 Web 应用 (网站、后台服务) - 开发分布式系统 - 开发大型企业级应用 (如银行、电商系统) |
| 关键 API/技术 | - java.lang, java.util, java.io, java.net- JDBC (数据库连接基础) - 多线程 |
- Servlet/JSP (Web 请求处理) - EJB (Enterprise JavaBeans) (业务逻辑组件) - JPA (Java Persistence API) (ORM 对象关系映射) - JMS (Java Message Service) (消息队列) - JTA (Java Transaction API) (事务管理) - JAX-RS/JAX-WS (Web 服务) |
| 运行环境 | 可以在任何安装了 JRE 的机器上运行。 | 通常需要运行在应用服务器或Web 容器中。 |
| 关系 | 是 Java EE 的基础,没有 Java SE,Java EE 就无法运行。 | 是 Java SE 的超集,在其上增加了大量企业级功能。 |
深入解析
Java SE (Java Platform, Standard Edition)
你可以把 Java SE 想象成盖房子的“砖、水泥、钢筋”和“地基”,它提供了最核心、最通用的功能。
-
核心是什么?
- JVM (Java Virtual Machine):Java 程序运行的心脏,负责执行字节码,实现“一次编写,到处运行”。
- 核心类库:提供了语言本身之外的所有基础功能,比如处理字符串、集合、文件输入输出、网络连接、多线程等,这些都在
java.*包下。 - 基础语言特性:面向对象、异常处理、泛型等。
-
它能做什么?
- 一个简单的计算器程序。
- 一个控制台输出的“Hello, World!”。
- 一个桌面客户端软件,比如用 JavaFX 开发的工具。
- 它是学习 Java 的第一步,也是所有 Java 开发者必须掌握的基础。
Java EE (Java Platform, Enterprise Edition)
你可以把 Java EE 想象成盖“摩天大楼”的“预制件和施工蓝图”,它利用 Java SE 的砖块,提供了专门用于构建大型、复杂、高并发、高可用性建筑的模块和工具。

-
它解决了什么问题? 企业级应用通常非常复杂,需要处理:
- 高并发:成千上万的用户同时访问。
- 事务性:保证数据操作的原子性、一致性、隔离性和持久性(比如银行转账)。
- 安全性:用户认证、授权、数据加密等。
- 分布式:系统由多个独立的服务组成,通过网络通信。
- 可扩展性:能够根据负载增加服务器来应对更高的访问量。
-
它提供了什么“预制件”?
- Servlet:处理来自 Web 浏览器的 HTTP 请求,可以理解为 Web 服务器的“门卫”或“前台接待”,负责接收请求并分发。
- JSP (JavaServer Pages):用于动态生成 HTML 页面,它让 Java 代码和 HTML 模板可以混合编写,方便展示数据。
- EJB (Enterprise JavaBeans):封装复杂的业务逻辑,它是一个服务端的“组件模型”,让你可以方便地创建可重用、安全的业务逻辑模块。
- JPA (Java Persistence API):让你可以用 Java 对象来操作数据库,而不用写繁琐的 SQL 语句,这是 ORM (Object-Relational Mapping) 的标准。
- JMS (Java Message Service):实现应用程序之间的异步通信,用户下单后,系统可以发送一个“订单已创建”的消息,通知库存、物流等系统去处理,而不需要等待这些处理完成才返回响应给用户。
- JTA (Java Transaction API):提供跨多个资源(如数据库、消息队列)的事务管理能力。
演示一个简单的例子
假设我们要开发一个用户登录功能。
使用 Java SE (简化版):

// 1. 连接数据库 (需要自己管理连接、处理异常)
Connection conn = DriverManager.getConnection("jdbc:mysql://...", "user", "pass");
// 2. 编写 SQL 语句
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
// 3. 创建 Statement 并执行
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "admin");
pstmt.setString(2, "password123");
ResultSet rs = pstmt.executeQuery();
// 4. 处理结果
if (rs.next()) {
System.out.println("登录成功!");
} else {
System.out.println("用户名或密码错误!");
}
// 5. 关闭资源 (非常重要,容易忘记)
rs.close();
pstmt.close();
conn.close();
这个代码片段有很多问题:数据库连接怎么管理?连接池呢?事务怎么办?代码耦合度高,难以复用。
使用 Java EE (更规范的方式):
// 1. 使用 JPA (Entity)
@Entity
public class User {
@Id
private String username;
private String password;
// getters and setters
}
// 2. 使用 EJB (Session Bean) 封装业务逻辑
@Stateless
public class UserLoginService {
@PersistenceContext // 容器自动注入 EntityManager
private EntityManager em;
public boolean login(String username, String password) {
// JPA 自动帮你生成 SQL 并处理结果
User user = em.find(User.class, username);
if (user != null && user.getPassword().equals(password)) {
return true;
}
return false;
}
}
// 3. 使用 Servlet 处理 Web 请求
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@EJB // 容器自动注入 EJB
private UserLoginService loginService;
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
String username = request.getParameter("username");
String password = request.getParameter("password");
if (loginService.login(username, password)) {
// 登录成功,重定向到主页
response.sendRedirect("home.jsp");
} else {
// 登录失败,返回错误信息
request.setAttribute("error", "用户名或密码错误");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
}
对比一下,Java EE 的方式:
- 关注点分离:数据访问、业务逻辑、Web 请求处理被清晰地分离开。
- 容器管理:数据库连接、事务、安全等由应用服务器容器自动管理,开发者无需关心。
- 代码更简洁、更健壮:使用注解(如
@EJB,@PersistenceContext)极大地减少了样板代码。
现状与演进:从 Java EE 到 Jakarta EE
这是一个非常重要的知识点!
由于 Oracle 公司对 Java EE 商标和规范的变更,为了避免法律纠纷,Java EE 社区(主要是开源社区)在 2025 年发起了 Jakarta EE 项目。
- Java EE 是 Oracle 拥有的商标。
- Jakarta EE 是由 Eclipse 基金会管理的开源品牌。
主要变化:
所有 javax.* 包名的 API 都被重命名为 jakarta.*。
javax.servlet->jakarta.servletjavax.persistence->jakarta.persistencejavax.ejb->jakarta.ejb
这意味着什么? 如果你现在开始学习一个新的 Java 企业级项目,你几乎肯定会使用 Jakarta EE 的规范和 API,虽然很多老项目仍在使用 Java EE (javax),但新项目都应该拥抱 Jakarta EE。
总结一下演进路径: Java SE 8 -> Java EE 8 -> Jakarta EE 8 / 9 / 10 ...
| Java SE | Java EE / Jakarta EE | |
|---|---|---|
| 角色 | 基石,提供核心语言和运行时。 | 上层建筑,提供企业级应用开发的框架和工具。 |
| 学习路径 | 必学第一步,所有 Java 开发的基础。 | 在掌握 Java SE 之后,用于构建大型、复杂的网络应用。 |
| 现代选择 | 依然是所有 Java 开发的起点。 | Jakarta EE 是当前和未来的标准,Spring Boot 等框架也大量借鉴了其思想,但提供了更简洁的开发体验。 |
Java SE 是“地基”,Java EE (Jakarta EE) 是“在上面盖大楼用的专业工具包”,两者相辅相成,共同构成了强大的 Java 生态系统。
