1. ホーム
  2. java

[解決済み] 親POMから継承された成果物を除外する方法はありますか?

2022-05-15 15:34:33

質問

依存関係からのアーティファクトは <exclusions> 要素の中で <dependency> しかし、この場合は親プロジェクトから継承した成果物を除外する必要があります。以下に、議論中の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 は同じライブラリの別のバージョンに依存しています。という事実のために mail.jar から ALL-DEPS は実行環境上に存在し、エクスポートはされませんが、衝突して mail.jar としてスコープされている親に存在する compile .

解決策は、親POMからmail.jarを取り除くことかもしれませんが、ベースを継承するプロジェクトのほとんどは、それを必要とします(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>
...

どのように解決するのですか?

いくつかのアイデアがあります。

  1. その場合、単純に親を継承しないようにすればいいかもしれません(そして、依存関係を宣言して base への依存を除外して宣言します)。親Pomに多くのものがある場合は便利ではありません。

  2. もう一つテストすべきは mail で必要とされるバージョンでアーティファクトを宣言します。 ALL-DEPS の下にある dependencyManagement の下にある を使って強制的に収束させます (これでスコープ問題が解決するかどうかは分かりませんが)。

<dependencyManagement>
  <dependencies>
    <dependency>    
      <groupId>javax.mail</groupId>
      <artifactId>mail</artifactId>
      <version>???</version><!-- put the "right" version here -->
    </dependency>
  </dependencies>
</dependencyManagement>

  1. を除外することもできます。 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. あるいは、異端の1.2.15バージョンではなく、log4jの1.2.14バージョンに戻すこともできます(なぜ彼らは上記の依存関係に印をつけなかったのでしょうか? オプション ?!).