Maven требует, чтобы версия плагина была указана для управляемой зависимости spring-boot-configuration-processor

#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 он уже является родительским для моего корневого проекта.