无论如何排除从父POM继承的工件?

可以通过在<dependency>声明一个<exclusions>元素来排除依赖项中的工件。但是在这种情况下,需要排除从父项目继承的工件。 正在讨论的POM摘录如下:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>test</groupId>
  <artifactId>jruby</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <parent>
        <artifactId>base</artifactId>
        <groupId>es.uniovi.innova</groupId>
        <version>1.0.0</version>
    </parent>

    <dependencies>      
        <dependency>
            <groupId>com.liferay.portal</groupId>
            <artifactId>ALL-DEPS</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
            <type>pom</type>
        </dependency>
    </dependencies>
</project>

base工件,取决于javax.mail:mail-1.4.jar ,而ALL-DEPS依赖于同一个库的另一个版本。 由于在执行环境中存在来自ALL-DEPS mail.jar ,尽管未导出,但与母版上存在的mail.jar发生冲突,该范围为compile范围。

一个解决方案可能是从父POM中删除mail.jar,但大多数继承base的项目都需要它(因为它是log4j的一个跨型依赖项)。 所以我想要做的就是简单地将父库从子项目中排除 ,因为如果base是一个依赖关系而不是父项目 ,可以这样做:

...
    <dependency>
        <artifactId>base</artifactId>
        <groupId>es.uniovi.innova</groupId>
        <version>1.0.0</version>
        <type>pom<type>
        <exclusions>
          <exclusion>
             <groupId>javax.mail</groupId>
             <artifactId>mail</artifactId>
          </exclusion>
        </exclusions>
    </dependency>
...

一些想法:

  • 也许你可以简单地从没有在这种情况下,继承父(和声明的依赖关系base与排除)。 如果你在父pom中有很多东西,那就不方便。

  • 另一件要测试的东西是在父pom的dependencyManagement下用ALL-DEPS所需的版本声明mail工件以强制收敛(尽管我不确定这将解决范围问题)。

  • <dependencyManagement>
      <dependencies>
        <dependency>    
          <groupId>javax.mail</groupId>
          <artifactId>mail</artifactId>
          <version>???</version><!-- put the "right" version here -->
        </dependency>
      </dependencies>
    </dependencyManagement>
    
  • 或者,如果你不使用依赖它的功能(这是我将要做的),你可以从log4j中排除mail依赖关系:
  • <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.15</version>
      <scope>provided</scope>
      <exclusions>
        <exclusion>
          <groupId>javax.mail</groupId>
          <artifactId>mail</artifactId>
        </exclusion>
        <exclusion>
          <groupId>javax.jms</groupId>
          <artifactId>jms</artifactId>
        </exclusion>
        <exclusion>
          <groupId>com.sun.jdmk</groupId>
          <artifactId>jmxtools</artifactId>
        </exclusion>
        <exclusion>
          <groupId>com.sun.jmx</groupId>
          <artifactId>jmxri</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    
  • 或者你可以恢复到log4j的版本1.2.14,而不是1.2.4的异端版本(为什么他们不把上面的依赖关系标记为可选?!)。

  • 按照Sonatypes最佳实践的描述,您可以将包含pom的不同项目中的依赖关系分组:

    <project>
        <modelVersion>4.0.0</modelVersion>
        <artifactId>base-dependencies</artifactId>
        <groupId>es.uniovi.innova</groupId>
        <version>1.0.0</version>
        <packaging>pom</packaging>
        <dependencies>
            <dependency>
                <groupId>javax.mail</groupId>
                <artifactId>mail</artifactId>
                <version>1.4</version>
            </dependency>
        </dependencies>
    </project>
    

    并从你的parent-pom中引用它们(看依赖关系<type>pom</type> ):

    <project>
        <modelVersion>4.0.0</modelVersion>
        <artifactId>base</artifactId>
        <groupId>es.uniovi.innova</groupId>
        <version>1.0.0</version>
        <packaging>pom</packaging>
        <dependencies>
            <dependency>
                <artifactId>base-dependencies</artifactId>
                <groupId>es.uniovi.innova</groupId>
                <version>1.0.0</version>
                <type>pom</type>
            </dependency>
        </dependencies>
    </project>
    

    您的子项目像以前一样继承此父项目。 但是现在,依赖dependencyManagement块中的子项目中可以排除邮件依赖dependencyManagement

    <project>
        <modelVersion>4.0.0</modelVersion>
        <groupId>test</groupId>
        <artifactId>jruby</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <parent>
            <artifactId>base</artifactId>
            <groupId>es.uniovi.innova</groupId>
            <version>1.0.0</version>
        </parent>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <artifactId>base-dependencies</artifactId>
                    <groupId>es.uniovi.innova</groupId>
                    <version>1.0.0</version>
                    <exclusions>
                        <exclusion>
                            <groupId>javax.mail</groupId>
                            <artifactId>mail</artifactId>
                        </exclusion>
                    </exclusions>
                </dependency>
            </dependencies>
        </dependencyManagement>
    </project>
    

    你有没有试过明确声明你想要的mail.jar的版本? Maven的依赖关系解决方案应该使用它来解决所有其他版本的依赖关系解决方案。

    <project>
      <modelVersion>4.0.0</modelVersion>
      <groupId>test</groupId>
      <artifactId>jruby</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <parent>
            <artifactId>base</artifactId>
            <groupId>es.uniovi.innova</groupId>
            <version>1.0.0</version>
        </parent>
        <dependencies>          
            <dependency>
                <groupId>javax.mail</groupId>
                <artifactId>mail</artifactId>
                <version>VERSION-#</version>
                <scope>provided</scope>
            </dependency> 
            <dependency>
                <groupId>com.liferay.portal</groupId>
                <artifactId>ALL-DEPS</artifactId>
                <version>1.0</version>
                <scope>provided</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </project>
    
    链接地址: http://www.djcxy.com/p/29699.html

    上一篇: Is there anyway to exclude artifacts inherited from a parent POM?

    下一篇: Maven parent pom vs modules pom