是否无论如何都可以排除从父 POM 继承的工件?

2022-08-31 07:46:53

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

<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工件依赖于 ,并且依赖于同一库的另一个版本。由于 from 存在于执行环境中,尽管未导出,但与父级上存在的 冲突,其作用域为 。javax.mail:mail-1.4.jarALL-DEPSmail.jarALL-DEPSmail.jarcompile

一个解决方案可能是从父POM中清除邮件.jar,但大多数继承base的项目都需要它(就像log4j的transtive依赖项一样)。因此,我想做的是简单地从子项目中排除父库,因为如果它是依赖项而不是父 pom,则可以这样做: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>
...

答案 1

一些想法:

  1. 在这种情况下,也许您根本无法从父级继承(并声明对排除的依赖关系)。如果你在父母pom中有很多东西,就不方便了。base

  2. 要测试的另一件事是使用父 pom 中所需的版本声明工件,以强制收敛(尽管我不确定这是否会解决范围问题)。mailALL-DEPSdependencyManagement

<dependencyManagement>
  <dependencies>
    <dependency>    
      <groupId>javax.mail</groupId>
      <artifactId>mail</artifactId>
      <version>???</version><!-- put the "right" version here -->
    </dependency>
  </dependencies>
</dependencyManagement>
  1. 或者,如果您没有使用依赖于它的功能,则可以从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>
  1. 或者你可以恢复到log4j的1.2.14版本,而不是异端的1.2.15版本(为什么他们没有将上述依赖项标记为可选?!

答案 2

您可以在其他项目中对依赖项进行分组,并按照 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>

并从您的父 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>

您的子项目像以前一样继承此父 pom。但是现在,可以在块内的子项目中排除邮件依赖项: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>

推荐