21

我有一个 Maven 管理的 Lombok 项目,我使用 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>
4

5 回答 5

18

根据delombok 目标文档:默认输出目录是:

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

我发现 JetBrains 团队成员的评论指出:

IDEA 会自动排除 build 'target' 文件夹,前提是它下面没有生成的源,否则它会排除除生成的所有子文件夹之外的所有子文件夹。

如果您有一些想要排除的生成代码或构建工件,您可以将其放在“目标”文件夹下。

这意味着/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 (...)警告。

于 2017-07-28T21:19:30.740 回答
1

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

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

每次编译后手动删除文件夹真的很糟糕,所以我只是配置了一个专门针对文件夹delombok的额外执行。maven-clean-plugindelombok

您的 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>
于 2019-12-24T14:11:47.950 回答
0

这个想法是从源中删除生成的源。我可以从 Project Structure -> 从包列表中选择,然后在右侧找到用于派生该包源的文件夹。如果您在该列表中找到生成的源,请将其删除。

于 2020-03-10T05:05:21.273 回答
0

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

于 2020-04-27T13:25:00.440 回答
0

首先,您必须申请 Krzysiek 的答案 - 移动generated_sources目录,target这样它就会是/target/generated_sources. 下一步是将给定目录取消标记为生成的源根目录。然后你必须右键单击 Intellij 中的给定项目,选择Maven然后Reload project. 之后做同样的事情,但这次去Maven -> Generate Sources and Update Folders。如果您有多模块项目并且一个模块相互依赖,即模块A依赖,B那么您必须首先开始B

于 2022-01-06T08:28:02.693 回答