很抱歉,这个问题是针对一个常见问题,但是我发现这个问题很抽象,并且不能真正为它组成一个很好的Google搜索词。
我试图理解并找到maven中提供的依赖项的用例。我的想法是这样的:
比方说,我有3个Maven项目:A,B,C
如果我在同一Weblogic域/服务器上部署A和C。 A将类路径上的C视为B的实现吗?
如果没有,那么提供的范围依赖项的一个好用例是什么?
预先感谢
答案 0 :(得分:2)
根据提供的范围的maven documentation状态:
这很像编译,但是表明您期望使用JDK或 容器以在运行时提供依赖关系。例如,当 为Java Enterprise Edition构建一个Web应用程序,您将 将对Servlet API和相关Java EE API的依赖关系设置为 提供范围,因为Web容器提供了这些类。这个 作用域仅在编译和测试类路径上可用,并且是 不及物。
其中已经提到了一个用例:构建稍后要在JavaEE Application Server上部署的JavaEE应用程序时,Application Server提供了javaEE实现。
因此,要告诉Maven在编译期间需要此依赖关系,但以后不打包到项目中,则可以使用提供的范围,如下所示:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
另一个用例是在构建使用不同容器类型的JavaEE应用程序时。有一个JavaEE EJB and a Web Container,您需要确保您的类不会被打包/装入错误的容器中,甚至不会装入两个容器中,因为这可能会给您的应用程序和类装入器带来各种问题。
假设您正在构建一个既包含EJB模块又包含Web模块的应用程序,并且希望EJB在EJB容器中运行。您还希望在Web模块中使用EJB。由于EJB在EJB容器中运行,而Web模块在web容器中运行,因此您不能简单地在Web项目中添加带有范围编译的EJB-Dependency。因为如果这样做,那么maven会将ejb打包在war文件中,并且EJB最终将出现在Web容器中。
因此,在您的Web应用程序中,您应将依赖项添加为
<artifactId>my-web</artifactId>
<packaging>war</packaging>
<dependency>
<groupId>your.group</groupId>
<artifactId>my-ejb</artifactId>
<type>ejb</type>
<scope>provided</scope>
</dependency>
通过这种方式,您告诉maven您想使用EJB模块,但是不应将其打包到war文件中,并且您将确保自己在运行时可以使用该模块。