web-dev-qa-db-ja.com

親ポンから子ポンに依存関係を継承する方法

私はmavenとjenkinsを使用するのが初めてです。私は親ポンから子ポンに依存関係を継承しようとしていますが、次のエラーが表示されます:

[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/XMLConverters.Java:[10,26] package com.rpmtec.current does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/XMLConverters.Java:[11,26] package com.rpmtec.current does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/XMLConverters.Java:[15,38] cannot find symbol
  symbol:   class AbstractRequestMessageData_Type
  location: class com.td.inv.wss.util.XMLConverters
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/XMLConverters.Java:[26,23] cannot find symbol
  symbol:   class AbstractResponseMessageData_Type
  location: class com.td.inv.wss.util.XMLConverters
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/UsTermRateItemComparator.Java:[5,42] package com.rpmtec.current.UsTermRate_Type does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/UsTermRateItemComparator.Java:[7,61] cannot find symbol
  symbol: class UsTermRateItems
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/UsTermRateItemComparator.Java:[9,28] cannot find symbol
  symbol:   class UsTermRateItems
  location: class com.td.inv.wss.util.UsTermRateItemComparator
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/UsTermRateItemComparator.Java:[9,48] cannot find symbol
  symbol:   class UsTermRateItems
  location: class com.td.inv.wss.util.UsTermRateItemComparator
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/model/COIRQ.Java:[9,40] package com.fasterxml.jackson.annotation does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/model/COIRQ.Java:[10,26] package com.rpmtec.current does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/model/COIRQ.Java:[11,26] package com.rpmtec.current does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/model/COIRQ.Java:[12,26] package com.rpmtec.current does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/model/COIRQ.Java:[13,26] package com.rpmtec.current does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/model/COIRQ.Java:[14,42] package com.rpmtec.current.UsTermRate_Type does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/model/COIRQ.Java:[19,2] cannot find symbol
  symbol: class JsonIgnoreProperties
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/model/COIRQ.Java:[69,22] cannot find symbol
  symbol:   class ORCA_GETTERMHOLDINGRS_Type
  location: class com.td.inv.model.COIRQ
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/model/COIRQ.Java:[69,66] cannot find symbol
  symbol:   class RPM_GETPLANACCOUNTOVERVIEWRS_Type
  location: class com.td.inv.model.COIRQ
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/model/COIRQ.Java:[70,25] cannot find symbol
  symbol:   class ORCA_GETTERMINSTRUCTIONRS_Type
  location: class com.td.inv.model.COIRQ
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/RPMInvoker.Java:[5,26] package javax.ws.rs.client does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/RPMInvoker.Java:[6,26] package javax.ws.rs.client does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/RPMInvoker.Java:[7,26] package javax.ws.rs.client does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/RPMInvoker.Java:[8,26] package javax.ws.rs.client does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/RPMInvoker.Java:[9,24] package javax.ws.rs.core does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/RPMInvoker.Java:[15,26] package com.rpmtec.current does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/RPMInvoker.Java:[16,26] package com.rpmtec.current does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/RPMInvoker.Java:[23,57] cannot find symbol
  symbol:   class AbstractRequestMessageData_Type
  location: class com.td.inv.wss.util.RPMInvoker
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/RPMInvoker.Java:[24,41] cannot find symbol
  symbol:   class AbstractResponseMessageData_Type
  location: class com.td.inv.wss.util.RPMInvoker
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/application/InvestmentAPI.Java:[4,19] package javax.ws.rs does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/application/InvestmentAPI.Java:[5,24] package javax.ws.rs.core does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/application/InvestmentAPI.Java:[9,36] cannot find symbol
  symbol: class Application

これが私の親POMです。

.....
<modelVersion>4.0.0</modelVersion>
<groupId>group1</groupId>
<artifactId>group1-artifact</artifactId>
<version>1.0.1</version>
<packaging>pom</packaging>

<modules>
     <module>child1</module>
</modules>
.......

これが私の子POMです。

.....
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>group1</groupId>
    <artifactId>group1-artifact</artifactId>
    <version>1.0.1</version>
    <relativePath>(full url.....)/jenkins-parent-pom//pom.xml</relativePath>
</parent>
<groupId>group1</groupId>
<artifactId>child1</artifactId>
<version>0.0.1</version>
<packaging>war</packaging>
......

以下は、親POMから子POMの依存関係を継承しようとした方法です。

<dependencyManagement>  
  <dependencies>
    <dependency>
      <groupId>group1</groupId>
      <artifactId>group1-artifact</artifactId>
      <version>1.0.1</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

これらの同じ依存関係を子POMに配置すると、完全に機能します。 jenkinsを使用してclean installをインストールし、deployをnexusにデプロイします。私はmaven-3.3.9を使用しています。ジェンキンスでは、Gitから2つの異なるMavenプロジェクトの親と子のpomsを読みました。親POMからすべての依存関係とプラグインを継承したい。出来ますか?

35
Cherry

これを実現するには、<dependencies>セクションで継承する依存関係を宣言する必要があります。 <dependencyManagement>は、有効になるために特定の子の<dependencies>内で必要に応じて後で参照する必要がある定義に使用されます。

UPDATE:すべての子pomが継承する依存関係を宣言するときは注意してください。非常に迅速に、親で宣言されているという理由だけで、本当に必要のない依存関係を持つことになります。他のコメンターが言ったように、<dependencyManagement>はより良い選択かもしれませんが、それはあなたが当初望んでいたものではありません。

51
vempo

実際、この問題に対処するには2つの方法があります。

  1. <dependencyManagement />ノードの下の親pomで依存関係をファクタリングし、それを必要とする各子で、<dependencies />ノードに依存関係を追加します。依存関係のバージョンを設定しないことを選択できます。
  2. または、<dependencies />ノードの親pomで依存関係を宣言すると、各子は依存関係の恩恵を受けます。

したがって、たとえば、親pomでこれを宣言した場合:

<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.21</version>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.21</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

そうすると、slf4j-apiはすべての子の依存関係になります。ただし、必要に応じて、子のPOMにslf4j-simpleへの依存関係を追加する必要があります。

<dependencies>
    <dependency>
        <group>org.slf4j</group>
        <artifactId>slf4j-simple</artifactId>
    </dependency>
</dependencies>

プラグインの場合、同じ動作をしますが、<pluginManagement />および<plugins />ノードを使用します。すべての設定は、プラグインの親pomの定義に入れることができ、子pomの<build />セクションでプラグインを宣言するだけです。

32
Arthur Noseda

以下は、親と子のpomの使用方法の例です。

親POMは次のとおりです。

.....
<modelVersion>4.0.0</modelVersion>
<groupId>group1</groupId>
<artifactId>group1-artifact</artifactId>
<version>1.0.1</version>
<packaging>pom</packaging>

<modules>
     <module>child1</module>
     // add more childs here
</modules>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>org.abc</groupId>
            <artifactId>xyz</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
</dependencyManagement>
.......

dependencyManagementタグで依存関係を指定すると、それはこのjarを子pomで使用可能にすることを意味するになります。 ではなくこの時点で実際にjarをダウンロードします。子pomは、groupIdartifactIdを提供する必要があります。明示的にをダウンロードして、jarを使用してクラスをコンパイルします。 注:子pomsに依存関係のバージョンを含める必要はありません

子ポンムは次のようになります。

.....
<modelVersion>4.0.0</modelVersion>

<parent>            // this is how you will inherit from parent pom
    <groupId>group1</groupId>
    <artifactId>group1-artifact</artifactId>
    <version>1.0.1</version>
</parent>

<groupId>child1</groupId>

    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <scope>runtime</scope>
            // no version needed as it would inherit from the parent pom
        </dependency>
        <dependency>
            <groupId>org.abc</groupId>
            <artifactId>xyz</artifactId>
            // no version needed as it would inherit from the parent pom
        </dependency>
    </dependencies>

.......

すべての子に共通の依存関係を親pomのdependencyManagementタグに配置することをお勧めします。これにより、これらの依存関係のバージョンを1か所から管理できます。

18
RITZ XAVI