Ответ 1
Похоже, он должен работать на меня. Но вы можете попробовать mvn install
вместо mvn package
.
У меня есть проект с несколькими модулями 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>
....
Похоже, он должен работать на меня. Но вы можете попробовать mvn install
вместо mvn package
.
Мой вопрос в том, как я могу решить эту проблему?
Разрешение зависимостей выполняется через локальный репозиторий, поэтому канонический способ "решить" проблему состоит в том, чтобы запустить install
из A, чтобы модули были установлены в локальном репозитории.
Теперь, в отношении следующего комментария
Но если я пойду с установкой, будет также установлен файл war war. Это не принято в моем текущем проекте ".
Конечно, я не в вашем проекте, я не знаю всех ограничений и правил. Но если вы решили использовать Maven, это совершенно смехотворная политика (серьезно, WTF?) И использование зависимой от system
зависимостей, конечно же, не является хорошим решением (более поздние проблемы были гарантированы). Если эта политика реальна, лучше не использовать Maven в этом случае.
У меня есть решение: используя зависимость с 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>
Выполнение mvn install только помещает артефакт в локальный репозиторий .m2 машины, на которой вы запускаете команду. Как это может быть неприемлемо? Я согласен с Паскалем. Если вы строите А, не должно быть причин, по которым там будет размещена война.
С другой стороны, если вы используете Maven 2.2.x, посмотрите плагин для maven-реактора? Это должно помочь сумасшедшему неприемлемому не может установить C.war в вашу локальную политику репозитория .m2 для текущего проекта.