<scope>提供的</scope>依赖项和网络逻辑?

时间:2018-10-11 09:47:27

标签: java maven

很抱歉,这个问题是针对一个常见问题,但是我发现这个问题很抽象,并且不能真正为它组成一个很好的Google搜索词。

我试图理解并找到maven中提供的依赖项的用例。我的想法是这样的:

比方说,我有3个Maven项目:A,B,C

  • B是一个API,例如JPA
  • 为了争辩,
  • C可以说是Hibernate
  • A提供了对B的依赖

如果我在同一Weblogic域/服务器上部署A和C。 A将类路径上的C视为B的实现吗?

如果没有,那么提供的范围依赖项的一个好用例是什么?

预先感谢

1 个答案:

答案 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文件中,并且您将确保自己在运行时可以使用该模块。