Maven - 将代码移动到新工件;传递依赖问题

时间:2011-12-07 19:43:41

标签: java maven maven-3

以下是我的情况:

  • 我在一个名为'web-ng-framework'的库中创建了一个新工件,并将代码从库中的旧工件中移入其中,'web'
  • 我删除了'网络'工件

问题在于:

  • ProjectA使用旧版本的库,因此它对'web'
  • 具有编译依赖性
  • ProjectB依赖于ProjectA
  • ProjectB使用最新版本的库,因此在构建ProjectB时,它包含“web”和“web-ng-framework”库,从而导致可能的冲突

有谁知道如何解决这个问题?谢谢!


修改

将'web''重新定位'到'web-ng-framework'可能会更好吗?在ProjectA中,我可以包含对'web'的依赖,以便Maven看到它真正需要的是'web-ng-framework'。那会有用吗?

3 个答案:

答案 0 :(得分:9)

在Project中包含ProjectS排除Web时。喜欢这个

<dependency>
  <groupId>your.group</groupId>
  <artifactId>projectA</artifactId>
   <exclusions>
     <exclusion>
       <groupId>your.group</groupId>
       <artifactId>web</artifactId>
     </exclusion>
   </exclusions>
</dependency>

答案 1 :(得分:1)

这个问题的经典解决方案是'版本99'黑客。

为此,请在根pom中使用以下内容:

<dependencyManagement>
  <dependency>
     <groupId>your.group</groupId>
     <artifactId>web</artifactId>
     <version>99.0-does-not-exist</version>
  </dependency>
</dependencyManagement>

然后在您的存储库中放入一个空的web-99.0-does-not-exists.pom和web-99.0-does-not-exist.jar。 这可以确保从此根pom继承的每个项目都不再获取旧版本的web.jar。

答案 2 :(得分:0)

我建议您使用optional dependencies

这可以通过web中的projectA依赖性可选来实现。

<project>
  <groupId>some.group</groupId>
  <artifactId>projectA</artifactId>
  ...
  <dependencies>
    <!-- declare the dependency to be set as optional -->
    <dependency>
      <groupId>some.group</groupId>
      <artifactId>web</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
  </dependencies>
</project>

当声明某些依赖于projectA的其他项目时,不会包含web依赖项。

<project>
  <groupId>some.group</groupId>
  <artifactId>projectB</artifactId>
  ...
  <dependencies>
    <dependency>
      <groupId>some.group</groupId>
      <artifactId>projectA</artifactId>
      <version>1.0</version>
    </dependency>
    <dependency>
      <groupId>some.group</groupId>
      <artifactId>web-ng-framework</artifactId>
      <version>1.0</version>
    </dependency>
  </dependencies>
</project>

现在projectB只会依赖projectAweb-ng-framework,而不是web