我有一个名为“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”继承它?
答案 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>