我有一个完整的Java EE项目,运行在GlassFish 4.1/Java EE 7 (NetBeans 8.0.2)上,不使用Apache Maven。
根据项目功能,必须将CDI依赖项添加到项目/模块中,即EE模块和Web模块(以及类库,如果有的话)。
很长一段时间以来,我一直很困惑,看到人们建议将"Java EE 7 API库"或"Java EE Web 7 API库"添加到编译时类路径中,作为CDI依赖项(这些库被捆绑在NetBeans中,当使用NetBeans时,它们随时可用)。
由于这些库包含了一组API,可能是从Servlet API开始的整个Java EE堆栈,当Java EE应用程序需要CDI功能时,将这些库中的一个添加到编译时类路径(特别是在EE项目中)是没有意义的。
为什么建议多次特别是在NetBeans项目中添加这些库之一,当只有cdi-api.jar
作为CDI依赖项就足够了?
当Java EE应用程序需要CDI功能时,我没有在本网站或其他地方找到关于在NetBeans项目中添加哪个库的规范答案。顺便说一下,只添加cdi-api.jar
就可以了。
所有javaee-api
, javaee-web-api
和cdi-api
只是API定义。它们不包含功能,它们只包含使代码编译所需的接口。结果是,应用程序中不应该包含javaee-api
和javaee-web-api
,因为它们已经包含在应用程序服务器中。该实现也由应用服务器提供,应用服务器本身非常大,有时具有超过100MB的库。
如果您的应用程序仅依赖于CDI,您可以自由地将cdi-api
作为依赖项。如果您希望从javaee获得更多信息,那么最好选择其中一个配置文件(full或web)。然而,请记住,服务器总是至少提供web配置文件中包含的所有API,因此也值得考虑使用它。只有对于不完全支持Java EE的应用服务器(例如Tom EE),才有必要选择性地选择依赖项。在这种情况下,有时甚至需要将实现包含在应用程序中,或者将其放在服务器中。
据我所知,Java EE 7 API库提供了完整的规范配置文件,而Java EE Web 7 API库只提供了Web配置文件API。如果要部署到Tomcat之类的东西,那么只需要web配置文件(Jax-RS、JSF、JPA)。如果您计划使用Jax-WS(基于soap的web服务)、ejb、JMS等做更多企业级的事情,那么请使用完整的规范。上次我检查了规范只定义了两个:FULL和WEB。
无论哪种情况,您都应该在您的表单中将它们标记为provided
。