什么是 "Java EE 7 API Library" 和 "Java EE Web 7 API Library" 以及何时使用它们?

What are "Java EE 7 API Library" and "Java EE Web 7 API Library" and when to use them?

我在 GlassFish 4.1 / Java EE 7 (NetBeans 8.0.2) 上有一个成熟的 Java EE 项目 运行,不使用 Apache Maven。

根据项目功能,必须将 CDI 依赖项添加到 projects/modules 即 EE 模块和 Web 模块(以及 class 库,如果有的话)。

看到人们建议将 "Java EE 7 API Library" 或 "Java EE Web 7 API Library" 添加到编译时 class-path 作为 CDI 依赖项(这些库是捆绑在 NetBeans 中,使用 NetBeans 时开箱即用。

由于这些库包含 API 的集合,可能是从 Servlet API 开始的整个 Java EE 堆栈,因此将这些库之一添加到编译时 [=当 Java EE 应用程序需要 CDI 功能时,37=]-路径(尤其是在 EE 项目中)没有意义。

为什么多次建议添加这些库之一,尤其是在 NetBeans 项目中,而只有 cdi-api.jar 作为 CDI 依赖项就足够了?

当 Java EE 应用程序需要 CDI 功能时,我没有在本网站或其他地方找到关于在 NetBeans 项目中确切添加哪个库的规范答案.顺便说一下,仅添加 cdi-api.jar 就可以了。

据我所知,Java EE 7 API 库 提供了完整的规范配置文件,而 Java EE Web 7 API 库 仅提供网络配置文件API。如果您要部署到 Tomcat 之类的地方,那么您只需要 Web 配置文件(Jax-RS、JSF、JPA)。如果您计划使用 Jax-WS(基于 SOAP 的大量 Web 服务)、EJB、JMS 等做更多企业级的事情,那么请使用完整规范。请搜索 Java EE 配置文件。最后我检查了规范只定义了两个:FULL和WEB。

无论哪种情况,您都应该在 pom 中将它们标记为 provided

所有javaee-apijavaee-web-apicdi-api都只是API定义。它们不包含功能,它们只包含必要的接口而不是使您的代码编译。结果是 javaee-apijavaee-web-api 中的 none 或 javaee-web-api 不应包含在您的应用程序中,因为它们已包含在应用程序服务器中。实现也是由应用服务器提供的,它本身就很大,有时有超过100MB的库。

如果您的应用程序仅依赖于 CDI,您可以随意将 cdi-api 作为依赖项。如果你想从 javaee 获得更多,那么最好选择其中一个配置文件(full 或 web)。但是,请注意服务器始终至少提供 Web 配置文件中包含的所有 API,因此也值得考虑使用它。有选择地选择依赖关系只对不完全支持 Java EE(例如 Tom EE)的应用程序服务器有价值。在这种情况下,您有时甚至需要将实现包含在您的应用程序中或将其放在服务器中。