Как избавиться от повторяющихся ошибок класса в Intellij для проекта Mavenized с использованием Lombok

У меня есть проект Lombok, управляемый Maven, и я использую Intellij. После сборки я всегда получаю много ошибок в Intellij о повторяющихся классах из-за сгенерированных источников в target/generated-sources/delombok. Есть ли что-то, что я могу сделать, чтобы избавиться от этих ошибок? Прямо сейчас я просто удаляю целевую папку, но это действительно раздражает.

У меня стандартная конфигурация в Maven, а исходный код Lombok находится в src/main/lombok:

       <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok-maven-plugin</artifactId>
            <version>1.16.8.0</version>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>delombok</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

  <profiles>
    <profile>
        <id>lombok-needs-tools-jar</id>
        <activation>
            <file>
                <exists>${java.home}/../lib/tools.jar</exists>
            </file>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok-maven-plugin</artifactId>
                    <version>1.16.8.0</version>
                    <dependencies>
                        <dependency>
                            <groupId>sun.jdk</groupId>
                            <artifactId>tools</artifactId>
                            <version>1.8</version>
                            <scope>system</scope>
                            <systemPath>${java.home}/../lib/tools.jar</systemPath>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

person Selena    schedule 14.06.2016    source источник
comment
Есть ли смысл использовать деломбок? Чтобы просто использовать Lombok, вам нужна только (при условии) зависимость от lombok.   -  person Roel Spilker    schedule 14.06.2016
comment
Я хочу сгенерировать Javadoc, который включает методы Lombokified. Для этого мне нужно сгенерировать источники, чтобы я мог запускать javadoc для них.   -  person Selena    schedule 14.06.2016
comment
Я не гуру mvn, но я уверен, что вы можете настроить делобок в другой каталог (настроить lombok.outputDirectory) и указать javadoc использовать этот каталог.   -  person Roel Spilker    schedule 15.06.2016


Ответы (4)


Согласно документации цели delombok: вывод по умолчанию каталог:

${project.build.directory}/generated-sources/delombok

Я нашел комментарий заявив, что:

IDEA автоматически исключает «целевую» папку сборки при условии, что в ней нет сгенерированных источников, в противном случае она исключает все подпапки, кроме сгенерированных.

Если у вас есть сгенерированный код или артефакты сборки, которые вы хотите исключить, вы можете поместить их в целевую папку.

Это означает, что каталог /generated-sources по умолчанию не исключен, и если вы собираетесь исключить некоторые файлы, вы должны поместить их в родительский каталог /target, а НЕ в /generated-sources.

Для этого вы должны настроить плагин и предоставить <outputDirectory> не по умолчанию:

<plugin>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok-maven-plugin</artifactId>
    <version>1.16.18.0</version>
    <executions>
        <execution>
            <phase>generate-sources</phase>
            <goals>
                <goal>delombok</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <sourceDirectory>src/main/java</sourceDirectory>
        <outputDirectory>${project.build.directory}/delombok</outputDirectory>
        <addOutputDirectory>false</addOutputDirectory>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>

Это предотвратит выдачу IDEA Duplicate class found in (...) предупреждений.

person Krzysiek    schedule 28.07.2017
comment
Я постараюсь проверить это где-нибудь в следующем месяце. Я собираюсь в отпуск на какое-то время, работа сумасшедшая, и я фактически провел рефакторинг проекта, над которым работал, чтобы не использовать деломбок некоторое время назад, потому что эти ошибки сбивали с толку людей, которые работали с моей кодовой базой. - person Selena; 30.07.2017

Я пробовал решение Krzusiek, но IntelliJ по-прежнему помечал мои исходные файлы из src/main/java как дублированные.

После многих неудачных попыток настроить lombok-maven-plugin я в конце концов решил избавиться от папки delombok после компиляции. Эта папка служит только сервером в качестве промежуточного этапа для компиляции (в моем случае она нужна мне для использования ломбока с компилятором AspectJ через aspectj-maven-plugin), и нет необходимости хранить ее после компиляции исходных файлов.

Вручную удалять папку delombok после каждой компиляции — настоящий облом, поэтому я просто настроил дополнительное выполнение maven-clean-plugin, специально нацеленное на папку delombok.

Ваш POM должен содержать:

<build>

    <sourceDirectory>${project.build.directory}/generated-sources/delombok</sourceDirectory>

    <plugins>
        <!-- will delombok source files into /target/generated-sources/delombok -->
        <plugin>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok-maven-plugin</artifactId>
            <version>1.16.16.0</version>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>delombok</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <addOutputDirectory>false</addOutputDirectory>
                <sourceDirectory>src/main/java</sourceDirectory>
            </configuration>
        </plugin>

        <!-- other plugins bound to compile phase should go here -->

        <plugin>
            <artifactId>maven-clean-plugin</artifactId>
            <executions>
                <execution>
                    <id>delombok-removal</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>clean</goal>
                    </goals>
                    <configuration>
                        <excludeDefaultDirectories>true</excludeDefaultDirectories>
                        <filesets>
                            <fileset>
                                <directory>${project.build.sourceDirectory}/com</directory> <!-- assuming your root package is something like com.mycompany -->
                            </fileset>
                        </filesets>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
person Bruno 82    schedule 24.12.2019

Идея состоит в том, чтобы удалить сгенерированный источник из источников. Я мог бы сделать это из структуры проекта -> выбрать из списка пакетов и справа найти папки, которые используются для получения источников для этого пакета. Если вы найдете сгенерированный источник в этом списке, удалите его.

person Siba Prasad Tripathy    schedule 10.03.2020

вам просто нужно снять отметку с папки с сгенерированными исходниками в Intellij и все будет в порядке.

person Kostya Callmetofindout    schedule 27.04.2020