У меня есть многомодульный проект, в котором один из двух подмодулей зависит от другого. Этот вопрос подразумевает, что mvn install
должен позаботьтесь об этих зависимостях.
На моей машине все работает нормально на локальном уровне (как внутри Eclipse, так и в командной строке). Однако, когда я обновляю модуль, который изменяет код, необходимый второму модулю, и фиксирую его в моем репозитории github, второй модуль не удается выполнить сборку Travis CI. Я проследил проблему до того факта, что он загружает свою зависимость из репозитория, а не использует только что скомпилированный.
Проблема очень похожа на тот, о котором сообщается в этом вопросе, за исключением того, что вместо моего локального репозитория я имею дело с автоматической сборкой Travis CI. Комментарии и ответ на этот вопрос показывают, что:
Зависимость имеет версию моментального снимка. Для моментальных снимков Maven проверит локальный репозиторий и, если артефакт, найденный в локальном репозитории, слишком старый, попытается найти обновленный в удаленных репозиториях.
Однако в этом случае «слишком старый» не должен применяться. Местный артефакт был буквально только что построен. Ему должно быть несколько секунд.
Вот соответствующие разделы pom.xml модуля oshi-json
, отметив его зависимость от oshi-core
(оба имеют общий номер версии с родителем):
<parent>
<groupId>com.github.dblock</groupId>
<artifactId>oshi-parent</artifactId>
<version>3.0-SNAPSHOT</version>
</parent>
<artifactId>oshi-json</artifactId>
<packaging>jar</packaging>
<name>oshi-json</name>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>oshi-core</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
И выдержка из родительского pom.xml:
<groupId>com.github.dblock</groupId>
<artifactId>oshi-parent</artifactId>
<version>3.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>oshi-parent</name>
<modules>
<module>oshi-core</module>
<module>oshi-json</module>
</modules>
Полные файлы доступны здесь:
Соответствующие выдержки из файлов журнала показаны ниже. Полный пример неудачной сборки Travis CI можно найти здесь. Обратите внимание, что симптом (ошибка компиляции) является результатом того, что Трэвис использует последний снимок для oshi-core, который не включает класс, указанный в oshi-json; однако класс находится в отправленном запросе на вытягивание и компилируется (и собирается с помощью mvn install) локально.
Когда я делаю новый коммит, Трэвис выполняет сборку следующим образом:
$ mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V
Реактор правильно расставляет сборки по порядку:
[INFO] Reactor Build Order:
[INFO]
[INFO] oshi-parent
[INFO] oshi-core
[INFO] oshi-json
Родитель строит, а затем oshi-core
строит, локально сохраняя скомпилированный код:
[INFO] Строительная банка: /home/travis/build/dblock/oshi/oshi-core/target/oshi-core-3.0-SNAPSHOT.jar
Это банка, от которой я хочу, чтобы следующий модуль зависел. Однако, когда запускается сборка oshi-json
, вместо этого он загружает артефакт из maven:
[ИНФО] Загрузка: https://oss.sonatype.org/content/repositories/snapshots/com/github/dblock/oshi-core/3.0-SNAPSHOT/oshi-core-3.0-20160624.032041-9.jar
[ИНФО] Загружено: https://oss.sonatype.org/content/repositories/snapshots/com/github/dblock/oshi-core/3.0-SNAPSHOT/oshi-core-3.0-20160624.032041-9.jar (199 КБ при 708,5 КБ/с)
РЕДАКТИРОВАТЬ: Только что заметил следующее предупреждение, которое появляется непосредственно перед загрузкой, которое может иметь или не иметь отношения (ошибка в настройках Travis), однако исправление этого предупреждения по-прежнему не решает мою проблему, вот неудачная сборка без предупреждения:
[ВНИМАНИЕ] Не удалось передать com.github.dblock:oshi-core:3.0-SNAPSHOT/maven-metadata.xml из https://nexus.codehaus.org/snapshots/ был закэширован в локальном репозитории, повторная попытка разрешения не будет предприниматься до тех пор, пока не истечет интервал обновления моментальных снимков codehaus или обновление не будет принудительным. Исходная ошибка: не удалось передать метаданные com.github.dblock:oshi-core:3.0-SNAPSHOT/maven-metadata.xml из/в codehaus-snapshots (https://nexus.codehaus.org/snapshots/): nexus.codehaus.org
Это временная проблема, связанная только с Travis-CI; установка pom будет работать нормально, как только я действительно выпущу все модули, и я могу обойти это, локально выполнив mvn clean deploy
, чтобы отправить новый oshi-core
в репозиторий OSS, чтобы Трэвис был счастлив. Однако это кажется плохим обходным путем.
Есть ли способ, которым я могу сказать Travis CI использовать только что скомпилированную банку, а не загружать новую, и сделать это таким образом, чтобы не прерывать предполагаемую загрузку зависимости из репозитория после ее публикации?