Вопрос или проблема
Я начал замечать очень странное поведение в spring-boot 2.5.3 после 29 сентября 2024 года.
У меня есть база кода, которая зависит от spring-boot 2.5.3, и ниже приведён список зависимостей, связанных со spring:
spring-cloud-starter-contract-stub-runner
spring-boot-starter-test
spring-cloud-starter-sleuth
spring-cloud-starter-contract-stub-runner
spring-boot-starter-web
springdoc-openapi-maven-plugin
spring-cloud-starter-openfeign
spring-boot-starter-validation
springdoc-openapi-webmvc-core
Начиная с указанной даты, я заметил, что все мои CI задания завершаются с ошибкой компиляции без изменений в коде, получая следующее:
[ERROR]package org.springframework.cloud.openfeign does not exist
[ERROR] <class-full-path> cannot find symbol
symbol: class FeignClient
Я проводил всевозможные отладочные работы для maven:
mvn dependency:tree -Dverbose > dep6.tree
mvn dependency:go-offline > dep.offline
#собрать код с пустым репозиторием m2 и с отладочным логированием
mvn clean package -Dmaven.repo.local=./empty-m2 -DskipTests -X
Я был абсолютно уверен, что это проблема зависимости или репозитория maven, но я не смог найти подсказку или указание.
Короче;
некоторые зависимости зависели от репозитория под названием -> https://maven.restlet.org/
, но этот репозиторий больше не действителен и указывает на веб-сайт https://restlet.talend.com/
.
Мне пришлось обновить мой settings.xml так, чтобы он выглядел примерно так, чтобы я мог переопределить все отчеты и вернуться к https://repo.maven.apache.org/maven2/
:
<settings>
<mirrors>
<mirror>
<id>central-only</id>
<mirrorOf>*</mirrorOf>
<url>https://repo.maven.apache.org/maven2/</url>
</mirror>
</mirrors>
</settings>
Детали и шаги воспроизведения:
- Сравнил логи CI из журнала действий github для успешной сборки 2 месяца назад с тем, что я получаю во время проблемы.
- После очень долгого сравнения и отладки, я нашел следующие строки логов, появляющиеся в последних сборках (с ошибками) и отсутствующие в старых (хороших).
[WARNING] Checksum validation failed, expected <!doctype but is a0023349b1f10ff1457077b4f4f49f7015c00b6a from maven-restlet for https://maven.restlet.org/org/springframework/security/spring-security-bom/<version>/spring-security-bom-<version>.pom
[WARNING] The POM for org.springframework.cloud:spring-cloud-starter-contract-stub-runner:jar:<version> is invalid, transitive dependencies (if any) will not be available: 17 problems were encountered while building the effective model for org.springframework.cloud:spring-cloud-starter-contract-stub-runner:<version>
[FATAL] Non-parseable POM /app/./empty-m2/com/datastax/oss/java-driver-bom/4.9.0/java-driver-bom-4.9.0.pom: unexpected markup <!d (position: START_DOCUMENT seen <!d... @1:3) @ /app/./empty-m2/com/datastax/oss/java-driver-bom/<version>/java-driver-bom-<version>.pom, line 1, column 3
[FATAL] Non-parseable POM /app/./empty-m2/org/codehaus/groovy/groovy-bom/<version></version>>/groovy-bom-<version></version>>.pom: unexpected markup <!d (position: START_DOCUMENT seen <!d... @1:3) @ /app/./empty-m2/org/codehaus/groovy/groovy-bom/<version></version>>/groovy-bom-<version></version>>.pom, line 1, column 3
[FATAL] Non-parseable POM /app/./empty-m2/org/infinispan/infinispan-bom/<version></version>>.Final/infinispan-bom-<version></version>>.Final.pom: unexpected markup <!d (position: START_DOCUMENT seen <!d... @1:3) @ /app/./empty-m2/org/infinispan/infinispan-bom/<version></version>>.Final/infinispan-bom-<version></version>>.Final.pom, line 1, column 3
На этом этапе было вполне логично, что код не компилируется из-за того, что много зависимостей maven не удалось разрешить, отсюда и ошибка компиляции.
Как видно из приведённых выше логов, множество файлов pom не разрешаются в действительный структурированный файл pom, а разрешаются в обычную HTML-страницу.
После применения зеркального отображения maven в settings.xml всё вернулось в норму, надеюсь, это сэкономит время другим.
Ответ или решение
Вопрос: Ошибка сборки Maven в приложении Spring Boot после 29 сентября 2024 года
С недавним ухудшением работы ваших CI-процессов и возникновением ошибок компиляции в проекте на Spring Boot 2.5.3, стоит обратить внимание на несколько ключевых моментов, которые могут вызвать подобные проблемы.
Причина проблемы
Начиная с 29 сентября 2024 года, возникли перебои в работе некоторых зависимостей, используемых в вашем проекте. В частности, вы упомянули зависимость, которая ссылается на репозиторий maven.restlet.org. К сожалению, этот репозиторий больше не работает должным образом и перенаправляет на веб-сайт, что вызвало сбой в разрешении зависимостей. Ваша команда столкнулась с следующими ошибками:
[ERROR]package org.springframework.cloud.openfeign does not exist
[ERROR] <class-full-path> cannot find symbol
symbol: class FeignClient
Эти ошибки указывают на то, что ключевые классы и зависимости, такие как FeignClient, не могут быть найдены, что приводит к сбоям на этапе сборки проекта из-за недоступных артефактов.
Устранение проблемы
-
Проверка зависимостей: Проведите детальный анализ зависимостей проекта, используя команды Maven:
mvn dependency:tree -Dverbose > dep6.tree mvn dependency:go-offline > dep.offline
-
Очистка локального репозитория: Убедитесь, что проблема не связана с поврежденными файлами в локальном репозитории Maven, создав новый пустой репозиторий и пытаясь выполнить сборку:
mvn clean package -Dmaven.repo.local=./empty-m2 -DskipTests -X
-
Настройка mirrors: Наилучшим решением для вашей ситуации является переопределение репозиториев в
settings.xml
для перенаправления всех запросов на центральный репозиторий Maven. Пример правильной конфигурации может выглядеть следующим образом:<settings> <mirrors> <mirror> <id>central-only</id> <mirrorOf>*</mirrorOf> <url>https://repo.maven.apache.org/maven2/</url> </mirror> </mirrors> </settings>
Устранение неполадок
При анализе журналов CI вам следует сравнить недавние ошибки со старыми успешными сборками, что поможет выявить изменения в поведении сборки. В вашем случае, вы успешно заметили предупреждения о ненадежных POM-файлах и проблемах с контрольными суммами.
Вот некоторые ключевые сообщения об ошибках:
[WARNING] Checksum validation failed...
[FATAL] Non-parseable POM...
Эти сообщения указывают на то, что Maven пытается получить файлы POM, но получает вместо них HTML-страницы вместо ожидаемого XML-формата.
Заключение
После внесения изменений в файл settings.xml
и перенаправления всех запросов на Maven Central, ваш проект должен восстановить правильное разрешение зависимостей, и ошибка компиляции будет устранена. Если проблемы продолжаются, рекомендуется проверить другие зависимости и репозитории, на которые могут ссылаться пакеты в вашем проекте.
Надеюсь, это поможет вам решать подобные проблемы в будущем. Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться.