2014-10-20 5 views
7

Я ищу способ включить все модули в проект из другого pom.xml. Поэтому в моем случае у меня есть родительский pom с упаковкой, установленной в pom. Он содержит 3 дочерних модуля, которые реализуют мои интерфейсы в другом модуле api. Я хочу динамически включать все дочерние модули в свой проект в maven.Как включить все модули из проекта pom

В этом случае я хочу включить соединитель1, разъем2, разъем3 в другой модуль, не указывая явно на разъем1,2,3.

connectors - packaging: pom 
    connector1 - packaging: jar 
    connector2 - packaging: jar 
    connector3 - packaging: jar 

Я попытался включить коннектор pom в свой проект, но это не сработало. Я надеялся, что указание родительского пакета с pom будет включать дочерние модули, но это не сработало. Есть ли какие-либо обходные пути для того, как это сделать?

Update

Это было больше мозоль мой, потому что я хотел просто добавить один разъем и имеют все банки зависимость модуля ребенка для проекта должны быть включены. Это сделало бы pom немного проще читать.

Вместо того, чтобы зарегистрировать всю дочернюю зависимость, как так

<dependencies> 
     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector1</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector1-api</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector1-etl</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector1-persistence</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector2</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector2-api</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector2-etl</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector2-persistence</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector2-other</artifactId> 
      <version>0.0.1</version> 
     </dependency> 
     ... 
</dependencies> 

Это просто пример, чтобы прояснить первоначальный вопрос. Это не существует и, вероятно, будет иметь проблемы с репродукцией, если это сработает.

<dependencies> 
     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector1</artifactId> 
      <version>0.0.1</version> 
      <type>pom</type> 
      <include>submodules</include> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector2</artifactId> 
      <version>0.0.1</version> 
      <type>pom</type> 
      <include>submodules</include> 
     </dependency> 

</dependencies> 

Если я правильно помню, я создавал модульный проект для системы упорядочения, где у меня был общий апи, что наша внутренняя система будет использовать (REST). Я создавал систему маршрутизации, где я мог направить заказ в единый центр выполнения на основе критериев заказа (страна, приоритетные налоги и т. Д.). У каждого из центров выполнения были свои собственные api (соединители).

Пример очень упрощен в первоначальном вопросе, чтобы сделать его более проблематичным более кратким. В реальном проекте каждый соединитель (1,2,3) был бы отдельным портом с множеством банок зависимости. Один для своего клиента api, затем некоторый код etl, соответствующий моему первоначальному api.

Я не помню, как я это решил. Я думаю, что мне просто нужно было включить все дочерние зависимости.

+0

У вас есть пример проекта где-нибудь (github?), Где мы можем получить лучшее впечатление о том, что именно вы пытаетесь сделать? – khmarbaise

+1

@RobinJonsson Вопрос не ясен. Что именно означает * include * означает здесь? Какой конечный результат вы хотите? Вы хотите, чтобы вы автоматически заполнили раздел '' в разделе 'connector' POM? Или где-то еще? Не могли бы вы немного расширить? – Tunaki

+1

@Tunaki В результате я хочу добавить новые пакеты «connectorX», не указывая их в качестве зависимостей где-то еще. Скажем, например, у меня есть еще один модуль, который упакован как WAR. Я хотел бы добавить зависимость от WAR к «коннекторам», и всякий раз, когда я добавляю новый «дочерний модуль» (возможно, разъем4) к коннекторам, он автоматически упаковывается в файл WAR. У меня нет желаемого формата упаковки для моих разъемов. Не имеет значения, упаковываются ли разъемы в виде отдельных JAR или uber-jar. Пока они включены в мою ВОЙНУ. –

ответ

10

Один из способов - создать четвертый модуль, который «обертывает» 3 модуля в качестве зависимостей. Таким образом, вы можете зависеть от этого модуля-оболочки, который будет.

connectors - packaging: pom 
    connector1 - packaging: jar 
    connector2 - packaging: jar 
    connector3 - packaging: jar 
    connectorWrapper - packaging: pom (depends on the above three) 

Хотя было бы больше смысла явно объявить зависимость для каждого разъема, особенно, что они являются только три.

Альтернативное решение:

Более динамичный подход (хотя очень излишество ИМО), чтобы иметь этот четвертый пакет модулей модули реализации в сборке с использованием пользовательских assembly descriptor.Например, внутри connectorWrapper, вы могли бы написать assembly.xml:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd"> 

    <id>impl-modules</id> 
    <formats> 
     <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <fileSets> 
     <fileSet> 
      <directory>${project.basedir}</directory> 
      <includes> 
       <include>pom.xml</include> 
      </includes> 
      <useDefaultExcludes>true</useDefaultExcludes> 
     </fileSet> 
    </fileSets> 
    <moduleSets> 
     <moduleSet> 
      <useAllReactorProjects>true</useAllReactorProjects> 
      <includes> 
       <include>*:connector*</include> 
      </includes> 
      <binaries> 
       <includeDependencies>false</includeDependencies> 
      </binaries> 
     </moduleSet> 
    </moduleSets> 
</assembly> 

Обратите внимание, что дескриптор говорит плагин сборки для:

  1. включают все модули в текущем реакторе проекта, поэтому при запуске mvn clean package в корневом проекте будут включены все модули

  2. включает только модули реализации (connector modu les), как указано в элементе include, имеющем *:connector*.

Конечно, вы должны настроить плагин сборки, чтобы использовать этот дескриптор в connectorWrapper (или что-то другое имя вы выбрали для этой обертки):

<plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 
      <descriptors> 
       <descriptor>assembly.xml</descriptor> 
      </descriptors> 
     </configuration> 
     <executions> 
      <execution> 
       <id>make-assembly</id> 
       <phase>package</phase> 
       <goals> 
        <goal>single</goal> 
       </goals> 
      </execution> 
     </executions> 
    </plugin> 
</plugins> 

Затем вы можете запустить mvn install на корень проекта для установки сборки артефакт, после которого вы можете положиться на него из другого проекта:

<dependencies> 
    <dependency> 
     <groupId>groupId</groupId> 
     <artifactId>connectorWrapper</artifactId> 
     <version>...</version> 
     <classifier>impl-modules</classifier> <!-- note the classifier --> 
    </dependency> 
</dependencies> 
+2

Спасибо, но мои цели предназначены для других, чтобы иметь возможность создавать реализации без необходимости вручную добавлять их в качестве другой зависимости от проекта. Это хорошая идея, но это вроде бы эквивалентно добавлению ее в список зависимостей в другом проекте. Я думаю, что может быть способ сделать это с помощью плагина сборки, но сейчас я изучаю это. –

+0

Не принимать это как ответ, поскольку это включает в себя другой проект, который просто перемещает управление зависимостями к себе. Первоначальная проблема, когда было бы неплохо неактивно указывать зависимость от новых «коннекторов», по-прежнему открыта. –

+1

@RobinJonsson Фактически, как упоминалось в OP, это возможно с помощью плагина сборки. Обновлен мой ответ. – manouti

1

Не совсем уверен ли он exactl y делает то, что вам нужно, но в последних выпусках maven вы можете использовать область import для своих зависимостей.

Первый шаг должен был бы создать POM, содержащий все зависимости вы хотели бы включить в другие проекты:

<project> 

    <groupId>com.foo</groupId> 
    <artifactId>connectors</artifactId> 
    <version>0.0.1</version> 
    <packaging>pom</packaging> 

    <dependencies> 
     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector1</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector1-api</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector1-etl</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     ... 
    </dependencies>  
</project> 

В проектах вы хотели бы включить разъемы у вас есть:

<dependency> 
    <groupId>com.foo</groupId> 
    <artifactId>connectors</artifactId> 
    <version>0.0.1</version> 
    <type>pom</type> 
    <scope>import</scope> 
</dependency> 

Для получения дополнительной информации см. Importing Dependencies.

Альтернативный подход может заключаться в использовании плагина сборки maven и создании единого (огромного) баннера, содержащего все классы, которые вы хотели бы включить (упаковка с одним банком); (для этого вам также нужно создать один раз pom со всеми зависимостями и плагином сборки).

+0

Не означает ли это, что я должен явно указывать зависимость в 'connector' на всех дочерних модулях? –

+0

Да, в родительском помпе вам все равно нужно определить модули/зависимости, которые должны быть частью. Я думал, что ваша цель состояла в том, чтобы иметь зависимость коннекторов, которую вы могли бы включить в другие проекты, вместо того, чтобы включать каждый дополнительный соединитель отдельно. Возможно, вы неправильно поняли вас. – uniknow

+0

Это нормально, взгляните на комментарий, который я сделал по оригинальному вопросу. Привет –

0

Я бы write my own maven plugin для этого. Судя по вашей репутации и вопросу, вы могли бы, вероятно, подготовить что-то в течение часа. Скорее всего, раньше, чем исследовать и тестировать решения, чтобы делать то, что вы хотите.

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