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

4
我有一个完整的Java EE项目在GlassFish 4.1 / Java EE 7(NetBeans 8.0.2)上运行,没有使用Apache Maven。根据项目功能,需要将CDI依赖项添加到两个项目/模块,即EE模块和Web模块(如果有类库,则为其添加)。 我很困惑很长一段时间,看到人们建议将“Java EE 7 API Library”或“Java EE Web 7 API Library”添加到编译时类路径作为CDI依赖项(这些库在使用NetBeans时已经捆绑在一起,并且随时可用)。由于这些库包含可能自Servlet API开始的整个Java EE堆栈的API集合,因此将其中一个库添加到编译时类路径(特别是在EE项目中)在Java EE应用程序中需要CDI功能时是没有意义的。为什么在NetBeans项目中多次建议添加这些库之一,当只需要作为CDI依赖关系的cdi-api.jar就足够呢?我在这个网站上找不到一个权威的答案,也找不到其他地方可以说明在Java EE应用程序中需要CDI功能时在NetBeans项目中确切添加哪个库。不过,仅添加cdi-api.jar就可以了。

我的想法是,目前在企业Java中处理依赖项和注入的方法不止一种。这就是为什么你看到这些建议的原因。 - Tim Biegeleisen
2个回答

5
< p >所有的 javaee-api javaee-web-api cdi-api 都只是API定义。它们并不包含功能,只包含必要的接口以使您的代码编译。结果是,既有 javaee-api 也没有 javaee-web-api 应该包括在您的应用程序中,因为它们已经包括在应用服务器中。实现也由应用服务器提供,它本身就相当大,有时包含100MB以上的库。

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


@Tiny,你说得对,Tomcat是一个Servlet容器,只提供servlet-api,这只是Java EE的一小部分。虽然你可以在Tomcat上构建自定义应用服务器(通过手动选择实现),但我实际上想说的是像TomEE这样的东西,它支持Java EE 6 Web Profile,但完整配置文件仅部分支持。可能还有其他不太知名的应用服务器也只支持部分功能。我通过提到TomEE来纠正我的答案。 - OndroMih

-1
据我所知,Java EE 7 API库提供完整的规范配置文件,而Java EE Web 7 API库仅提供Web规范API。如果您要部署到像Tomcat这样的服务器,则只需要Web规范(Jax-RS、JSF、JPA)。如果您计划使用Jax-WS(基于SOAP的Web服务)、EJBs、JMS等进行更多的企业级开发,请使用完整的规范配置文件。搜索Java EE配置文件。最后我检查到的规范只定义了两个:FULL和WEB。

在任一情况下,您都应该将这些标记为提供在您的pom文件中。


1
Tomcat不是一个Java EE Web Profile容器。它只是一个简单的JSP/Servlet容器。如果你把Tomcat当作Java EE Web Profile容器来使用,会导致严重的问题。 - BalusC
感谢澄清。我从未使用过Tomcat,但我认为它支持Web配置文件。 - John Manko

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