Как сделать один модуль зависимым от другого модуля? - PullRequest
35 голосов
/ 11 ноября 2010

У меня есть многокомпонентный проект Maven.

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

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

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

Ответы [ 5 ]

22 голосов
/ 11 ноября 2010

Похоже, это должно работать для меня. Но вы можете попробовать mvn install вместо mvn package.

13 голосов
/ 11 апреля 2018

Попробуйте $ {project.version}

например.

<dependency>
   <groupId>AAA</groupId>
   <artifactId>B</artifactId>
   <version>${project.version}</version>
  </dependency>
9 голосов
/ 12 ноября 2010

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

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

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

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

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

2 голосов
/ 12 ноября 2010

У меня есть решение: используя зависимость с областью действия = system

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

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

<modules>
       <module>B</module>       
       <module>C</module>
 </modules>
1 голос
/ 12 ноября 2010

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

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

...