Java EE究竟是什么?

104

对于年轻的Java开发人员来说,Java EE有一个“神秘的面纱”,我自己一直在试图揭开它,但一直没有成功。

引起困惑的原因是:

  • Java EE似乎既是库又是平台-有多种方法可以“获取”Java EE库,通常是从Oracle的Java EE SDK下载中获得。然而,除非您的代码正在运行或具有访问Java EE应用服务器(例如JBoss,GlassFish,Tomcat等)的权限,否则Java EE库将无法工作或编译。为什么?这些库不能在应用服务器环境之外运行吗?为什么我需要像JBoss这样的庞大东西才能编译简单的发送电子邮件的代码?

  • 为什么Java EE库不是“标准”的,包括在常规JVM下载和/或SDK中?

  • 为什么会有这么多Java EE产品,当然只有两种主要的标准Java产品(Oracle JVM / SDK | OpenJDK JVM / JDK)?

  • 使用Java EE可以做什么,而使用标准Java则无法实现?

  • 使用标准Java可以做什么,而使用Java EE则无法实现?

  • 开发人员什么时候决定他们“需要”Java EE?

  • 开发人员什么时候决定他们不需要Java EE?

  • 为什么Java EE库版本与标准Java库发布不同步(Java EE 6与Java 7)?

感谢您帮助我澄清这个问题!


5
FYI,这种类型的问题(一个帖子中包含许多开放性问题)在SO上不被认为是建设性的。请阅读[FAQ]和[Ask]获取有关撰写好问题的技巧。 - Jim Garrison
6
已经关闭了...希望有人能在同一个地方回答所有这些问题,而不是在网络上四处搜索... - Daniel Ryan
18
SO越来越僵化和难以使用。曾经所有聪明的人都在这里互相帮助。现在每个问题都在5分钟内关闭。它只是过度管制和无法使用,令人沮丧。是所有维基百科删除管理员都来到这里了吗? - user573215
34
我喜欢你的问题,当我正在输入答案时,突然弹出一条消息,告诉我这个问题已经关闭了。就我所知,在这种情况下,规则是个问题。虽然我理解问答和一般规定的目的,但我怀疑这种规则能否在这样的网站上发挥良好作用。当我开始访问SO时,从未注意到没有这个规则会有问题。现在SO被过度监管,已经没什么帮助,只是令人沮丧。现在它成为了一个归档网站。这里有很多聪明的人。让我们讨论技术,直到我们的脑袋发热,而不是互相阻拦。 - user573215
6
我投票关闭了这个问题(所以去找一些我回答过的问题并踩它们吧:) )。 这个问题可以很容易地通过Google来解决。 Java EE以及它存在的原因是非常热门的话题,就像询问为什么存在Emacs、Silverlight、Flash或任何软件库/应用程序/框架一样。 这个问题不是一个好问题,因为它像40个问题一样,而且它并不是真正的编程问题。 - Adam Gent
显示剩余20条评论
5个回答

42

为什么库不能在应用服务器环境之外使用?

实际上,它们可以。大多数库可以直接在Java SE中独立使用,或者包含在.war(实际上几乎总是Tomcat)中。Java EE的一些部分,如JPA,在其各自的规范中有明确的章节说明它们应该如何在Java SE中工作和使用。

如果说有什么问题,那么问题不在于应用服务器环境本身,而是其他所有库和集成代码的存在。

正因为如此,注释将只扫描一次,而不是每个库(EJB、JPA等)都单独进行扫描。也因此,CDI注释可以应用于EJB bean,并且JPA实体管理器可以注入到它们中。

为什么我需要像JBoss这样庞大的东西来编译发送电子邮件的简单代码?

这个问题有几个问题:

  1. 对于编译,您只需要API jar,Web Profile版本小于1MB,完整版本略大于1MB。
  2. 对于运行,您显然需要一个实现,但“庞大”有些言过其实。例如,OpenJDK大约为75MB,TomEE(包含邮件支持的Web Profile实现)只有25MB。即使GlassFish(Full Profile实现)也只有53MB。
  3. 使用独立的mail.jar和activation.jar,甚至可以在Java SE中(因此使用Tomcat)完全正常地工作。

为什么Java EE库不是“标准”的,并包含在常规JVM下载和/或SDK中?

Java EE可以说是将已经庞大的JDK分成易于管理和下载的块之一。人们已经抱怨图形类(AWT、Swing)和Applets在JRE中,而它们所做的只是在无头服务器上运行一些命令。然后你还想在标准JDK中包含所有Java EE库吗?

随着模块化支持的最终发布,我们将只有一个小型基本JRE,许多东西都可以单独安装为软件包。也许有一天,现在组成Java EE的许多甚至所有类都将是这样的软件包。时间会告诉我们。

为什么有这么多Java EE版本,当标准Java只有两种主要版本(Oracle JVM/SDK | OpenJDK JVM/JDK)?

Java SE不仅有两个版本。至少有IBM JDK、以前的BEA JDK(JRocket,由于收购正在合并到Oracle/Sun),各种其他开源实现以及用于嵌入式使用的许多实现。

Java SE和EE成为规范的原因是许多供应商和组织可以实现它,从而鼓励竞争并减轻供应商锁定的风险。

这与C和C++编译器没有什么不同,其中也有许多竞争性的产品,都遵循C++标准。

为什么Java EE库版本与标准Java库版本不同步(Java EE 6与Java 7)?

Java EE基于Java SE,因此滞后。版本确实相对应。Java EE 5需要Java SE 5。Java EE 6需要Java SE 6等等。只是大多数情况下,Java SE X是当前版本时,Java EE X-1是当前版本。


4
这是对上面问题的一个非常好的简明回答。它将概念分解,以便即使是非Java EE开发人员也能理解。谢谢。 - SnakeDoc

13
当开发人员需要使用JavaEE提供的服务时,例如容器管理的事务、依赖注入和定时器服务等,就需要安装并使用JavaEE。这个问题完全是主观的……但如果您需要JavaEE提供的任何服务,您就会开始考虑它。如果您不知道什么是JavaEE……您可能不需要它。

  • 开发人员何时决定不需要JavaEE?参见前面的答案。

  • 为什么JavaEE库版本与JavaSE版本不同步?好问题。我不会假装知道如何回答这个问题……但我猜想答案是:“因为它们不同步”。


  • 没关系,没有伤害...我只是建议你说JavaEE功能主要适用于服务器/容器,而不是需要它们。 - entonio

    9
    从宏观角度来看,Java EE是一个平台,即我们可以在其之上构建应用程序。
    从技术层面来看,Java Enterprise Edition标准定义了一组常用于构建企业应用程序的API。这些API由应用服务器实现 - 是的,不同的应用服务器可以自由地使用不同的Java EE API实现。
    然而,除非您的代码在Java EE应用服务器(如JBoss、GlassFish、Tomcat等)上运行或具有对其的访问权限,否则Java EE库将无法工作或编译。
    您只需要在编译时针对Java EE API进行编译,因此只需要这些API。在运行时,您还需要这些API的实现,即应用服务器。
    如果您想使用Java EE API发送邮件,那么您需要在运行时提供该API的实现。这可以通过应用服务器或通过添加到类路径的独立库来提供。
    Java EE库不被“标准化”并包含在常规JVM下载和/或SDK中,因为只有API被标准化,而不是实现。
    Java EE有很多不同的选择,因为人们在实现某些功能的正确方式上存在分歧,并且不同的供应商竞争市场份额。
    由于Java EE实现是使用“标准Java”构建的,因此不能做任何事情。但是,如果您正在解决典型的企业问题,则利用现有库可以节省大量精力,并且使用标准化API可以防止供应商锁定。
    通常来说,Java EE API解决了企业计算中典型的重复性问题。如果您有这些问题,通常使用标准解决方案是有意义的 - 但是如果您有不同的问题,则需要其他解决方案。例如,如果您需要与关系数据库通信,则应考虑使用JPA。但是如果您不需要关系数据库,则JPA将无法帮助您。

    8

    什么是Java EE?

    让我们从维基百科上的标准定义开始:

    Java Platform, Enterprise Edition 或 Java EE 是 Oracle 的企业级 Java 计算平台。该平台提供了一个 API 和运行时环境,用于开发和运行企业软件,包括网络和 Web 服务,以及其他大型、多层次、可扩展、可靠和安全的网络应用程序。

    这里的主要观点是 Java EE 是提供 API 的平台,而不是某个具体的库。

    为什么需要Java EE?

    Java EE 的主要范围是基于网络的应用程序,与面向桌面应用程序开发带有简单网络支持的 Java SE 不同。这是它们之间的主要区别。随着网络的发展,对可伸缩性、消息传递、事务处理、每个应用程序的数据库支持等需求也增加了。当然,Java SE 提供的许多现成解决方案对于网络开发很有用,因此 Java EE 扩展了 Java SE。

    为什么需要应用服务器来运行我们的代码?

    为什么需要操作系统?因为我们需要做很多痛苦的硬件工作,即使是最简单的应用程序也是如此。而且没有操作系统,你需要一遍又一遍地做这些工作。简化的操作系统只是一个程序容器,它为我们提供了运行应用程序的全局上下文。

    这就是应用服务器的功能。它们允许我们在其上下文中运行应用程序,并为企业高负载网络应用程序提供许多高级功能。我们不想编写自己的轮子来解决这些问题,我们想编写能够满足业务需求的代码。

    Java 的另一个例子就是 JVM。

    为什么 Java EE 没有内置应用服务器?

    对我来说很难说。我认为这样做是为了更灵活。Java EE 说明要做什么,它们决定如何做。

    JVM 为什么不包含 Java EE?

    因为它们面向不同的市场部门。Java EE 具有许多常规桌面不需要的功能。

    为什么会有这么多 Java EE 提供商?

    因为 Java EE 只描述了行为。任何人都可以实现它。

    使用 Java EE 可以做什么,而使用 Java SE 无法做到?

    征服互联网。用 Java SE 的小程序和套接字很难做到这一点 :)

    使用 Java SE 可以做什么,而使用 Java EE 无法做到?

    如上所述,Java EE 扩展了 Java SE,因此使用 Java EE 应该能够做到 Java SE 可用的一切。

    开发人员何时决定他们“需要” Java EE?

    当他们需要 Java EE 的强大功能时。上面提到的所有内容。

    开发人员何时决定他们不需要 Java EE?

    当他们编写一个普通的控制台或桌面应用程序时。

    为什么 Java SE 和 Java EE 的版本不同步?

    Java一直以来都在技术命名和版本控制方面存在困难,这种情况并非例外。


    6
    Java EE是关于容器概念的。容器是一个执行上下文,其中将运行您的应用程序并为其提供一组服务。每种类型的服务都由名为JSR的规范定义。例如,JSR 907,JTA(Java事务API)提供了一种标准方法来管理针对不同资源的分布式事务。
    通常对于给定的JSR会有许多不同的实现,你将使用哪个实现取决于容器提供者,但你并不真正在意这一点,因为你确认行为遵守预定义的合同:JSR API。
    因此,要利用Java EE,您需要在容器内运行应用程序。两个主要的容器是EJB和Servlet容器,它们都存在于任何Java EE认证的应用服务器上。

    所有这些的目的是定义一个标准的执行环境,使您能够只打包必需的业务模块。这避免了依赖于未知和各种第三方库的情况,否则您将不得不打包并提供这些库,这可能与服务器上的其他应用程序产生冲突。在Java EE中,您知道所有标准的非功能要求(如安全性、事务处理、可伸缩性、远程调用等)都将由容器提供(对于在其中运行的所有应用程序进行因式分解),您只需要基于容器的工作。


    2
    你可以将容器看作是一个大框架,但是Sun(Oracle:())只提供规范,许多人对其进行实现。而经典的框架通常只由一个参与者提供/实现(例如springsource和spring)。 - Gab
    如果有人真正了解 Java EE,他们应该能够用一个 6 岁孩子都能理解的方式来解释它。越是复杂的“解释”,就越说明他们对它的了解程度越少。 - user2914191
    @user2914191 有些概念需要一个普通6岁孩子还没有接触到的背景知识,比如物理学中的熵。也许您是误打误撞来到这里的,如果是这样,您可以稍后再回来。 - Gab
    “向6岁小孩子解释”这句话并不是字面意思,它实际上是爱因斯坦说的一句话,如果你真正理解了它,你应该能够用非常简单的术语和解释来向一个6岁的小孩子解释它,而不会使用复杂的模糊术语和解释。 - user2914191
    你听说过Docker吗?一个容器就是一个执行上下文 :)。 - Gab
    显示剩余3条评论

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接