为什么库不能在应用服务器环境之外使用?
实际上,它们可以。大多数库可以直接在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.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是当前版本。