使用提供的依赖与继承

时间:2017-03-17 03:29:18

标签: maven

我有一个名为“A”的JAR项目,它有一些将由wildfly 10提供的库:

 <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate.core.version}</version>
            <scope>provided</scope>
        </dependency>

我有另一个名为“B”的项目,它是一个WAR项目。第二个项目不应该再次插入hibernate依赖项,但如果我不这样做,我就不能使用@Entity和其他类。我应该再次提供项目“B”中的“重新导入”hibernate-core。有没有办法从项目“A”继承它?

2 个答案:

答案 0 :(得分:1)

  

但如果我不这样做,我就无法使用@Entity和其他课程

我建议您阅读Dependency Scope in Maven附近可以找到的文档 -

  

提供:这很像编译,但表示您期望JDK   或者在运行时提供依赖性的容器。例如,何时   您可以为Java Enterprise Edition构建Web应用程序   设置对Servlet API和相关Java EE API的依赖   提供范围是因为Web容器提供了这些类。这个   scope仅在编译和测试类路径上可用,和是   不可传递。

进一步回答你的问题

  

我应该&#34;重新导入&#34;项目中的hibernate-core&#34; B&#34;如所提供的   再次。有任何方法可以从项目中继承它&#34; A&#34; ?

如果您在项目B中使用相同的依赖项,我建议将其包含在项目B中的依赖项列表中。

此外,如果项目紧密耦合(从某种意义上说它们将始终使用相同版本的hibernate-core),您可以通过将范围修改为compile来使用现有依赖项默认情况下,如果你不提。

选择仍然是你想要实现的设计,请阅读 -

Maven : Should I keep or remove declared dependencies that are also transitives dependencies?

虽然恕我直言,但我更喜欢@ i000174的答案,特别是在更安全的一面和更好的控制。

答案 1 :(得分:0)

我在Maven社区中学到的一条黄金法则是明确声明项目需要的依赖关系,这是一个好习惯。

不必担心多次声明依赖关系,Maven在管理依赖关系方面做得很好,但是您正在做的一件好事就是将版本管理放在一个地方。

Maven documentation-表示与<scope>provided</scope>的依赖项是不可传递的,这意味着它们的可用性范围是有限的,并且仅可用于声明依赖项本身及其直接子项的项目,但不会。不能用于导入依赖项的下游项目。

但是,文档在Importing Dependencies部分中说,可以使用范围import从另一个项目继承托管依赖项。

这样,您并不能完全继承依赖项本身,但可以声明不带版本的依赖项,从而可以轻松地在多个项目中保持其版本同步。

完成这项工作的关键是在导入另一个项目<type>pom</type><scope>import</scope>时同时使用这两个标记。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>maven</groupId>
            <artifactId>A</artifactId>
            <version>1.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>managed-dependecy-group-id</groupId>
        <artifactId>managed-dependecy-itself</artifactId>
    </dependency>
</dependencies>
相关问题