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