无论如何要排除从父 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.jarALL-DEPS 取决于同一库的另一个版本。由于 mail.jar 来自 ALL-DEPS 存在于执行环境中,尽管未导出,但与 mail.jar 冲突,后者作为父作用域存在- compile

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

 ...
    <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>
...

原文由 Miguel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

一些想法:

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

  2. 要测试的另一件事是声明 mail 具有 --- 所需版本的工件 --- 在 ALL-DEPSdependencyManagement 在父 pom 中强制收敛我不确定这是否会解决范围问题)。

 <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 版本(他们为什么不将上述依赖项标记为 _可选_?!)。

原文由 Pascal Thivent 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用打包方式将依赖项分组到不同的项目中 pom 如 Sonatypes Best Practices 所述:

 <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>

原文由 timomeinen 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题