为什么库不能在应用服务器环境之外运行?
其实他们可以。大多数库可以直接独立使用(在 Java SE 中)或包含在 .war 中(实际上几乎总是 Tomcat)。Java EE 的某些部分,如 JPA,在其各自的规范中有明确的部分,说明它们应该如何工作和在 Java SE 中使用。
如果有的话,这里所涉及的不是应用服务器环境本身,而是所有其他库的存在以及将它们联合起来的集成代码。
正因为如此,所有类的注释只会被扫描一次,而不是每个库(EJB、JPA 等)都会一遍又一遍地扫描。也正因为如此,CDI 注释可以应用于 EJB bean,并且可以将 JPA 实体管理器注入其中。
为什么我需要像 JBoss 这样庞大的东西来编译简单的代码来发送电子邮件?
这个问题有几个问题:
- 对于编译,您只需要 API jar,Web Profile 小于 1MB,完整配置文件则略多于 1MB。
- 对于运行,您显然需要一个实现,但“大量”是夸大其词。例如,OpenJDK 大约 75MB,而 TomEE(一个包含邮件支持的 Web Profile 实现)只有 25MB。甚至 GlassFish(一个 Full Profile 实现)也只有 53MB。
- Mail 在 Java SE(以及因此 Tomcat)以及使用独立的mail.jar 和 activation.jar时都可以正常工作。
为什么 Java EE 库不是“标准的”并且包含在常规 JVM 下载和/或 SDK 中?
Java EE 在某种程度上是第一次尝试将已经很庞大的 JDK 拆分成更易于管理和下载的块。人们已经在抱怨图形类(AWT、Swing)和小程序在 JRE 中,而他们所做的只是在无头服务器上运行一些命令。然后您还想在标准 JDK 中包含所有 Java EE 库吗?
随着模块化支持的最终发布,我们将拥有一个小型基础 JRE,其中包含许多可作为包单独安装的东西。也许有一天,现在构成 Java EE 的许多甚至所有类也将是这样的包。时间会证明一切。
当标准 Java 真的只有两种主要风格(Oracle JVM/SDK | OpenJDK JVM/JDK)时,为什么会有这么多 Java EE 产品?
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 是最新的。