#java #spring #spring-boot #maven
#java #весна #spring-boot #maven
Вопрос:
У меня есть проект maven с модулями. Родительским для моего корневого проекта является spring-boot-starter-parent
, который обеспечивает большое управление зависимостями.
В моем модуле я использую spring-boot-configuration-processor
, которая является одной из зависимостей, управляемых spring-boot-starter-parent
(ну, фактически управляемых его родителем spring-boot-dependencies
).
Если я не укажу версию в разделе плагинов, моя сборка завершится с ошибкой:
Resolution of annotationProcessorPath dependencies failed: For artifact {org.springframework.boot:spring-boot-configuration-processor:null:jar}: The version cannot be empty. -> [Help 1]
Итак, я вынужден, чтобы раздел плагинов выглядел следующим образом:
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.6.0</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
Однако я бы предпочел ссылаться на унаследованную версию. Хотя spring-boot-dependencies
имеет множество свойств для версий различных зависимостей, у него нет свойства для версии spring-boot-configuration-processor
. Она также не включена spring-boot-configuration-processor
в управление плагинами.
Как мне использовать унаследованную версию этого плагина вместо того, чтобы явно указывать версию самостоятельно?
Комментарии:
1. Я не думаю, что вы можете. Maven позволяет наследовать версию для зависимостей и плагинов, но это особый случай, потому что это конфигурация плагина. Вы можете, по крайней мере, воспользоваться тем фактом, что версия spring-boot-configuration-processor будет соответствовать spring-boot-starter-parent , поэтому вы можете объявить свое собственное свойство
spring.version
равным 2.6.0, а затем использовать его для них обоих.2. @Michael Я пробовал это, но это дало другую ошибку:
Non-resolvable parent POM: Could not find artifact org.springframework.boot:spring-boot-starter-parent:pom:${spring.version} in central (https://repo.maven.apache.org/maven2) and 'parent.relativePath' points at no local POM
Ответ №1:
Я действительно считаю, что вместо настройки maven-compiler-plugin
вам просто нужно объявить spring-boot-configuration-processor
как зависимость вашего проекта с scope=provided
помощью — цель annotationProcessorPaths
и annotationProcessors
параметры maven-compiler-plugin
не в том, чтобы добавить процессор аннотаций, а в том, чтобы заставить компилятор использовать только определенные процессоры аннотаций.
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
...
</plugins>
<dependencies>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<scope>provided</scope>
</dependency>
...
</dependencies>
Комментарии:
1. Я посмотрел «предоставленную» область, но я до сих пор не совсем понимаю, почему это заставило ее работать. Зачем ему нужна эта область, и что на самом деле делает «предоставление» зависимости в этом случае?
2. в вашем случае
scope=provided
плагин компилятора maven добавляет зависимость к пути к классу при компиляции, поэтому javac сможет обнаруживать процессоры аннотаций, предоставляемые такими зависимостями, но результирующий артефакт не будет зависеть от них. Другой вариант использованияscope=provided
— запретить нежелательные зависимости с помощью dependencyManagement вместо добавления множества исключений3. @FractalLotus Для работы он не должен быть транзитивным. Предоставленная область действия в основном просто означает, что зависимость не должна быть транзитивной. Если никакие проекты не зависят от вашего проекта, тогда область действия не имеет значения. Название происходит со времен Jboss и т. Д. где сервер приложений будет предоставлять некоторые зависимости, и вы только что объявили их в своем POM, чтобы вы могли компилировать с API. Учитывая, что вы используете Spring Boot, вы почти наверняка не используете сервер приложений, поэтому бесполезно думать об этом в этих терминах.
4. «заставляет плагин компилятора maven добавлять зависимость к пути к классу при компиляции» Неявная область / область по умолчанию (компиляция) также будет делать это. Единственное, что предусмотрено дополнительно, — это предотвращение транзитивности.
5. @AndreyB. Панфилов Если вы собираетесь попытаться исправить меня, убедитесь, что вы действительно правы: github.com/spring-projects/spring-boot/issues/413 В прошлом у меня была именно такая проблема, когда, к моему удивлению, Ломбокская банка оказалась в моем последнем артефакте, несмотря на то, что ей был предоставлен предусмотренный объем.
Ответ №2:
Вам необходимо наследовать от родительского POM:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>{YOUR_VERSION}</version>
</parent>
Комментарии:
1. Как я писал в исходном вопросе,
spring-boot-starter-parent
он уже является родительским для моего корневого проекта.