Подтвердить что ты не робот

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

У меня есть проект с несколькими модулями maven.

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

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

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

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

Теперь, из A, когда я запустил: 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>
....
4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 3

У меня есть решение: используя зависимость с scope = 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>

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

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

Ответ 4

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

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