如何使用Lombok消除Intellij中用于Mavenized项目的重复类错误

时间:2016-06-14 02:04:07

标签: maven intellij-idea lombok intellij-lombok-plugin

我有一个Maven管理的Lombok项目,我使用Intellij。在构建之后,由于target / generated-sources / delombok中生成的源,我总是在Intellij中遇到关于重复类的大量错误。我有什么办法可以摆脱这些错误吗?现在我只删除目标文件夹,但这真的很烦人。

我在Maven中有标准配置,而lombok源代码在main / src / 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>

4 个答案:

答案 0 :(得分:6)

根据delombok goal documentation:默认输出目录是:

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

我找到了JetBrains团队成员comment,说明:

  

IDEA会自动排除构建目标&#39;文件夹,前提是它下面没有生成的源,否则它会排除所有子文件夹,但会生成。

     

如果你有一些你希望被排除的生成代码或构建工件,你可以把它放在&#39; target&#39;文件夹中。

这意味着默认情况下不会排除/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 (...)警告。

答案 1 :(得分:0)

我尝试了Krzusiek的解决方案,但是IntelliJ仍会将来自src / main / java的源文件标记为重复。

在多次尝试调整lombok-maven-plugin失败之后,我最终决定在编译后摆脱delombok文件夹。该文件夹仅作为编译的中间阶段的服务器(在我的情况下,我需要它通过aspectj-maven-plugin将lombok与AspectJ编译器一起使用),并且真正没有必要在编译完源文件之后就保留它。

在每次编译后手动删除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>

答案 2 :(得分:0)

该想法是从源中删除生成的源。我可以从项目结构->从软件包列表中选择,然后在右侧找到用于导出该软件包源的文件夹。如果您在该列表中找到了生成源,则将其删除。

答案 3 :(得分:0)

您只需要在Intellij中取消标记带有生成源的文件夹,就可以了。