2016-08-10 4 views
17

Я новичок в использовании maven и jenkins. Я пытаюсь наследовать зависимости от родительского П ребенка П он показывает следующие ошибки:Как наследовать зависимость от родительского pom до ребенка pom

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

Вот как я пытался наследовать зависимость в дочернем ПОМ от родительского ПОМ:

<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, он отлично работает. Я делаю clean install для установки и deploy для развертывания в nexus с помощью jenkins. Я использую maven-3.3.9. В jenkins я прочитал родительские и детские помпы в двух разных проектах maven от git. Я хочу наследовать все зависимости и плагины от родительского POM. Является ли это возможным?

ответ

19

Чтобы достичь этого, вы должны объявить зависимости, которые вы хотите наследовать, в разделе <dependencies>. <dependencyManagement> используется для определений, которые должны быть указаны позже, когда это необходимо, в пределах <dependencies> определенного ребенка для вступления в силу.

ОБНОВЛЕНИЕ: Будьте осторожны при объявлении зависимостей, которые наследует каждый дочерний pom. Очень быстро вы можете получить зависимости, которые вам действительно не нужны, только потому, что они объявлены в родительском. Как упоминалось другими комментаторами, <dependencyManagement> может быть лучшим выбором, хотя это не то, что вы хотели первоначально.

+0

Вы имеете в виду, что в родительском pom я должен объявлять все зависимости в теге , а не в или в дочернем помпе? Я положил все зависимости в тегах в родительском pom. Это проблема? – Cherry

+0

Если вы намерены наследовать определенные зависимости для всех детей-попов, без необходимости их сокращения у каждого из детей - тогда да, вы должны объявить их в '', а не ''. С другой стороны, зависимость, объявленная в '', может использоваться только тогда, когда она вам нужна в дочернем помпе - вы просто пишете ее группу и артефакт внутри ' этого ребенка>. Преимущество состоит в том, что другие свойства (версия) объявляются только один раз в родительском. – vempo

+0

Спасибо. да, моя цель - наследовать особые зависимости от детей-попов. Просто чтобы убедиться, что в соответствии с вашим ответом я помещу эти конкретные зависимости в <зависимости> (не в теге ) в родительском помпе, правильно? – Cherry

8

На самом деле у вас есть два способа решения проблемы.

  1. Либо вы фактор зависимости в родительском ПОМ под <dependencyManagement /> узла и каждого ребенка, который требует его, добавить зависимость в <dependencies /> узле. Вы можете не устанавливать версию зависимости.
  2. Или вы объявляете зависимости в родительском pom в узле <dependencies />, и каждый ребенок получит выгоду от зависимости.

Так, например, если вы объявите это в родительском ПОМ:

<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 будет зависимость для всех детей. Тем не менее, вам придется добавить зависимость от slf4j-simple в ПОМ ребенка, она должна требовать его:

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

Для плагинов, он работает так же, но с <pluginManagement /> и <plugins /> узлов. Вся конфигурация может идти в определении родительского pom плагина, и вы просто объявляете плагин в разделе <build /> вашего дочернего пом.

+0

Спасибо. Но я не могу унаследовать зависимости от родительского pom без добавления зависимости в дочернем pom в узле , не устанавливая версию зависимости, правильно? – Cherry

+0

Я обновил свой ответ, поскольку он не был точным. Оказывается, вам не нужно будет добавлять зависимости в дочернем помпе, если вы добавите их в узел '' родительского пом. Это твой выбор. –

+1

Хотя вы, безусловно, можете это сделать, редко рекомендуется помещать '' в родительский pom вне ''. Все ваши дочерние модули будут наследовать все эти зависимости все время. Любые другие проекты, которые могут потреблять один из ваших модулей, также будут временно получать все эти отпечатки и, возможно, конфликтуют или хуже, особенно если этот дочерний модуль не использует всех из них. Оригинальное решение от @ArthurNoseda - это лучше всего. –

3

Ниже приведен пример использования родительского и детского помпей.

Родитель П выглядит следующим образом:

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

<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, это просто означает, что вы делаете это баночка для ребенка П. Это будет NOT Фактически загрузите банку в этот момент. Детский pom должен будет предоставить groupId и artifactId явно, чтобы загрузить и использовать банку для компиляции своих классов.

Ребенок ПОМ будет выглядеть следующим образом:

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

....... 
Смежные вопросы