【问题标题】:How to exclude the parent pom dependency inside inherited child dependency for Maven?如何在 Maven 的继承子依赖项中排除父 pom 依赖项?
【发布时间】:2018-07-23 09:54:47
【问题描述】:

我在父 pom 中有一个版本为 2.3 的 Jackson,在我的子 pom 中我需要版本 2.9,有什么方法可以排除父 pom 依赖项?

【问题讨论】:

    标签: maven maven-2 maven-3 maven-plugin maven-assembly-plugin


    【解决方案1】:

    您可以使用 dependencyManagement 部分覆盖依赖项的版本:

     <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.fasterxml.jackson</groupId>
                <artifactId>jackson-bom</artifactId>
                <version>2.8.8</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson</groupId>
            <artifactId>jackson-bom</artifactId>
        </dependency>
    </dependencies> 
    

    这是一个父母的例子:

    <?xml version="1.0" encoding="UTF-8"?>
     <project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0      http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>test</groupId>
    <artifactId>test-parent</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>test-child</module>
    </modules>
    
    <dependencies>
    
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.14</version>
        </dependency>
    </dependencies>
    

    这是覆盖依赖版本的子示例:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>test-parent</artifactId>
        <groupId>test</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    
    <artifactId>test-child</artifactId>
    
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.25</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>
    </dependencies>
    

    这是为孩子解析的依赖项

    mvn dependency:tree
    [INFO] Scanning for projects...
    [INFO] 
    [INFO] --------------------------< test:test-child >---------------------------
    [INFO] Building test-child 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO] 
    [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ test-child ---
    [INFO] test:test-child:jar:1.0-SNAPSHOT
    [INFO] \- org.slf4j:slf4j-api:jar:1.7.25:compile
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 0.703 s
    [INFO] Finished at: 2018-07-23T18:08:48+02:00
    [INFO] ------------------------------------------------------------------------
    

    【讨论】:

    • 嗨,我试过了,但没用 :( 加载时仍然解析父 pom 版本。
    • 也许你应该发布你的 poms。通过一个简单的测试,它可以按预期工作:
    • 谢谢,@gdegani 这东西工作正常,我试图通过反射在父模块内实例化子模块类,因此类加载器正在加载依赖类的父模块版本。我想除了编写自定义类加载器之外,我们无法避免这种情况,对吧?
    • Classloader...反射...你是如何在你的项目中使用maven的?当您寻求帮助时,您应该提供有关问题及其背景的更多详细信息。
    • 抱歉,没有显示示例 pom,但是您的示例与我的示例几乎相同,并且一旦我通过 maven shade 插件重新定位类,您的解决方案就适用于我的用例。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 2021-12-18
    • 2021-02-12
    • 2022-12-06
    • 2018-04-12
    • 1970-01-01
    • 2012-02-25
    相关资源
    最近更新 更多