代码之家  ›  专栏  ›  技术社区  ›  wishihadabettername

Maven:如何重写库添加的依赖项

  •  93
  • wishihadabettername  · 技术社区  · 15 年前

    这是我的常见问题:

    D的1.0.1版有问题,我想强制使用另一个模块。我不知道如何在项目的POMs中声明这一点,因为我没有直接添加对D的依赖。是C声明了对D的依赖。

    重要提示:在这种情况下,不仅版本发生了更改,而且组工件也发生了更改。因此,这不仅仅是重写依赖项的版本,而是排除一个模块并包含另一个模块。

    在具体情况下,D是StAX,其1.0.1具有 bug . 根据bug中的注释,“问题是通过将stax-api-1.0.1(maven GroupId=stax)替换为stax-api-1.0-2(maven GroupId=javax.xml.stream)来解决的”,所以我正在尝试。

    因此,D=stax:stax api:jar:1.0.1和C=org.apache.xmlbeans:xmlbeans:jar:2.3.0

    mvn依赖项的输出:树“

    mvn dependency:tree
    [..snip..]
    [INFO] +- org.apache.poi:poi-ooxml:jar:3.6:compile
    [INFO] |  +- org.apache.poi:poi-ooxml-schemas:jar:3.6:compile
    [INFO] |  |  +- org.apache.xmlbeans:xmlbeans:jar:2.3.0:compile
    [INFO] |  |  |  \- stax:stax-api:jar:1.0.1:compile
    

    在我的项目的POM中,我对“A”有以下依赖性:

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.6</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.6</version>
    </dependency>
    

    提前谢谢。

    4 回复  |  直到 15 年前
        1
  •  97
  •   Thunderforge    8 年前

    只需在当前pom中指定版本。此处指定的版本将覆盖其他版本。

    强制版本
    如果一个版本是在当前POM中用特定的版本声明的,那么它将始终被接受,但是,应该注意的是,如果它本身依赖于使用可传递依赖项,那么这也会影响下游的其他POM。


        2
  •  25
  •   scot    14 年前

    或者,您可以只排除不需要的依赖项。STAX包含在JDK 1.6中,因此如果您使用的是1.6,您可以完全排除它。

    我下面的例子对你来说有点错误——你只需要两个排除项中的一个,但我不太确定是哪一个。还有其他版本的Stax浮动,在我下面的例子中,我导入的是A,它导入的是B,它导入的是C&D,每个C&D(通过更可传递的依赖关系)导入的是不同版本的Stax。所以在我对“A”的依赖中,我排除了两个版本的Stax。

    <dependency>
      <groupId>a.group</groupId>
      <artifactId>a.artifact</artifactId>
      <version>a.version</version>
      <exclusions>
        <!--  STAX comes with Java 1.6 -->
        <exclusion>
          <artifactId>stax-api</artifactId>
          <groupId>javax.xml.stream</groupId>
        </exclusion>
        <exclusion>
          <artifactId>stax-api</artifactId>
          <groupId>stax</groupId>
        </exclusion>
      </exclusions>
    <dependency>
    
        3
  •  8
  •   Patrick Koorevaar    10 年前

    我也很难推翻对第三方库的依赖。我使用scot的排除方法,但我也在pom中添加了与新版本的依赖关系。(我使用了Maven 3.3.3)

    因此,对于stAX示例,它将如下所示:

    <dependency>
      <groupId>a.group</groupId>
      <artifactId>a.artifact</artifactId>
      <version>a.version</version>
      <exclusions>
        <!--  STAX comes with Java 1.6 -->
        <exclusion>
          <artifactId>stax-api</artifactId>
          <groupId>javax.xml.stream</groupId>
        </exclusion>
        <exclusion>
          <artifactId>stax-api</artifactId>
          <groupId>stax</groupId>
        </exclusion>
      </exclusions>
    <dependency>
    
    <dependency>
        <groupId>javax.xml.stream</groupId>
        <artifactId>stax-api</artifactId>
        <version>1.0-2</version>
    </dependency>
    
        4
  •  8
  •   Kent Munthe Caspersen    9 年前

    </dependencies> 根pom的标签将包含在根pom的所有子模块中。如果您的所有模块都使用该依赖项,那么就这样做。

    但是,如果10个子模块中只有3个子模块使用某些依赖项,则不希望此依赖项包含在所有子模块中。在这种情况下,您可以将依赖项放在 </dependencyManagement> . 这将确保需要依赖项的任何子模块都必须在它们自己的pom文件中声明它,但是它们将使用在 </依赖管理>

    您也可以使用 </依赖管理> 修改传递依赖项中使用的版本,因为在最上面的pom文件中声明的版本将被使用。如果您的项目A包含外部项目B v1.0,其中包含另一个外部项目cv1.0,那么这将非常有用。有时会在项目C v1.0中发现安全漏洞,并在v1.1中进行了更正,但B的开发人员很慢才将其项目更新为使用v1.1的C,一切都会好的(假设B v1.0仍然能够用cv1.1编译)。

        5
  •  1
  •   Fernando Maia    6 年前

    接受的答案是正确的,但我想加上我的两分钱。我遇到了一个问题,我有一个项目a,有一个项目B作为依赖项。两个项目都使用slf4j,但项目B使用log4j,而项目A使用logback。

    问题是:

    我通过改变对project A pom的依赖顺序解决了这个问题,当我将project B条目移到logback条目下面时,maven开始使用slf4j 1.7.5构建这个项目。

    编辑: