2010-11-10 3 views
21

У меня есть проект с несколькими модулями maven.Как сделать один модуль зависимым от другого артефакта модуля?

A: parent. 
    B: child1. 
    C: child2. 

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

В B, если я бегу mvn package, это создаст b.jar (пребывание в B/target/jars не в B/target -для другой цели).

В C мне нужно использовать этот код b.jar для компиляции кода.

Теперь, от А, когда я запускаю: mvn package. Во-первых, мне удалось создать файл b.jar для B.

Но когда дело доходит до этапа компиляции C, похоже, что C не распознает b.jar в пути к классам (компиляция получает ошибки, потому что код C не может импортировать класс файл из B).

Мой вопрос: Как я могу решить эту проблему?

---------- Below являются POM файлы

A: pom.xml 
    <groupId>AAA</groupId> 
    <artifactId>A</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <modules> 
    <module>C</module> 
    <module>B</module> 
    </modules> 

B: pom.xml 
     <groupId>AAA</groupId> 
<artifactId>B</artifactId> 
<packaging>jar</packaging> 
<version>0.0.1-SNAPSHOT</version> 
<parent> 
    <artifactId>A</artifactId> 
    <groupId>AAA</groupId> 
    <version>0.0.1-SNAPSHOT</version> 
</parent> 

C: pom.xml 
     <parent> 
    <artifactId>A</artifactId> 
    <groupId>AAA</groupId> 
    <version>0.0.1-SNAPSHOT</version> 
</parent> 

<groupId>AAA</groupId> 
<artifactId>C</artifactId> 
<packaging>war</packaging> 
<version>0.0.1-SNAPSHOT</version> 

<dependencies> 

    <dependency> 
    <groupId>AAA</groupId> 
    <artifactId>B</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    </dependency> 
.... 
+6

Как и в случае с лучшей практикой (не связанной с этим вопросом), модули B и C не должны объявлять свою собственную группуId и версию; они должны наследовать их от родительского (модуля A) POM. Тем не менее, им все равно нужно декларировать собственную упаковку и артефакт. –

ответ

14

выглядит, как он должен работать со мной. Но вы можете попробовать mvn install вместо mvn package.

+0

Спасибо. Хорошая идея. Но если я пойду с установкой, будет также установлен файл c war. Это не принято в моем текущем проекте. Разрешается устанавливать только файл jar. – David

+0

Вы прямо Matt. Я поеду с установкой. – David

3

я есть решение: используя зависимость со сферой = системы

в C pom.xml

  <dependency> 
      <groupId>AAA</groupId> 
      <artifactId>B</artifactId> 
      <version>0.0.1-SNAPSHOT</version> 
      <scope>system</scope> 
      <systemPath>${basedir}\..\B\target\jars\b.jar</systemPath> 
     </dependency> 

а в pom.xml, поместить модуль B на вершине, как этот

<modules> 
     <module>B</module>  
     <module>C</module> 
</modules> 
+2

Дэвид, я понятия не имею, что вы делаете, и почему «война не принимается в вашем текущем проекте», но, не обижайтесь, это определенно не так. –

5

Мой вопрос в том, как я могу решить эту проблему?

Разрешения зависимостей осуществляются через локальное хранилище, так что канонический способ «решение» проблема заключается в запуске install из А так, что модули будут установлены в локальном хранилище.

Теперь о следующем комментарии

Но если я пойду с установки, то с войной файла также будет установлен. Это один не принят в моем текущем проекте».

Конечно, я не на вашем проекте, я не знаю, все ограничения и правила. Но если вы решите использовать Maven, это совершенно смешно политика (серьезно, WTF?) и использование зависимой от system зависимой области, конечно, не является хорошим решением (более поздние гарантии гарантированы). Если эта политика реальна, лучше не использовать Maven в этом случае.

+0

О, вы правы. Если установить только копию артефакта в локальный репозиторий, это нормально для меня. Я, хотя install, скопирует артефакт в удаленный репозиторий (я запутался между установкой и развертыванием). Благодарю. – David

1

Выполнение установки mvn артефакт в локальный репозиторий .m2 машины, на которой вы запускаете команду. Как это может быть неприемлемо? Я согласен с Паскалем. Если вы строите А, не должно быть причин, по которой там идет война.

С другой стороны, если вы используете Maven 2.2.x, взгляните на maven reactor plugin? Это должно помочь сумасшедшему неприемлемому, не может установить C.war в вашу локальную политику репозитория .m2 для текущего проекта.

+0

О, ты прав. Если установить только копию артефакта в локальный репозиторий, это нормально для меня. Я, хотя install, скопирует артефакт в удаленный репозиторий (я запутался между установкой и развертыванием). Благодарю. – David

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