25

我正在尝试使用Lombok Maven 插件来确保在使用Lombok时正确创建 Javadocs 。

Lombok Maven 在编译之前引入了一个新的代码生成目标。在我的配置中,我的sourceDirectory(带有 Lombok 注释的 Java src/main/java)被处理以在target/generated-sources/delombok.

但是,sourceDirectory现在 in 中的每个文件都有一个对应的(名称相同的)文件 in target/generated-sources/delombok,导致由于类重复而导致编译失败。

如何告诉 Java 编译器忽略 中的源sourceDirectory

请注意,默认的 Lombok Maven 配置会让开发人员将 Java(带有 Lombok 注释)放在src/main/lombok文件夹中,而不是src/main/java. 但是,我不希望这样做,因为它会混淆 IDE 并且我的代码编译得很好(如果我删除了 Maven 插件)。

另请注意,简单地重新定义sourceDirectory也会让 IDE 感到不安(它们不再知道在哪里可以找到 Java 源代码!)。

4

5 回答 5

31

我最近从使用 flakey maven-exec-plugin 方法为 javadoc 工具生成原始源代码切换到使用 lombok-maven-plugin

我的设置

  • 所有来源src/main/java
  • 生成的源进入target/generated-sources/delombok

我最初遇到了这个问题,但它似乎很容易解决:不要让 lombok-maven-plugin 将 delombok 路径添加到编译器源路径中addOutputDirectoy。IE

<plugin>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok-maven-plugin</artifactId>
    <version>0.11.2.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>

这似乎暂时解决了这个问题

编辑:奖金,如何使用此设置生成正确的 javadocs

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.8.1</version>
    <configuration>
        <defaultVersion>${project.version}</defaultVersion>
        <sourcepath>target/generated-sources/delombok</sourcepath>
    </configuration>
</plugin>
于 2012-08-13T08:53:38.187 回答
3

创建一个新的Maven 配置文件,并在新的配置文件中,重新定义源:

<sourceDirectory>target/generated-sources/delombok</sourceDirectory>

或者

  1. 构建助手:有一个构建助手似乎提供了这个功能,但我之前没有使用过这个。
  2. Hack:这里描述了一个 hack ,但作者建议不要这样做,此外:如果你打算花时间修改你的 POM 并创建这个 hack,你最好做正确的事情并实现一个配置文件。
于 2012-07-04T14:07:50.473 回答
2

delombok目标旨在将 java代码src/main/lomboktarget/generated-source/delombok. 然后,将在其中找到的其他 java 代码src/main/java组合起来target/generated-source/delombok以生成组合的 java 类。

将 delombok 视为源代码生成器会有所帮助。

那么如何才能得到你真正想要的呢? (请注意,Maven 有一个addCompileSourceRoot方法,但没有相应的removeCompileSourceRoot。)想象一下以下hack

  1. 覆盖默认值<build><sourceDirectory>fromsrc/main/java${project.build.directory}/generated-sources/delombok
  2. 覆盖默认的 delomboksourceDirectorysrc/main/lombokto src/main/java,并禁用addOutputDirectory

基本上,您将使用src/main/java,但 Maven 会忽略它而使用target/generated-sources/delombok. Lombok 插件将转换src/main/javatarget/generated-sources/delombok.

<build>
  <sourceDirectory>${project.build.directory}/generated-sources/delombok</sourceDirectory>
  <plugins>
    <plugin>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok-maven-plugin</artifactId>
      <version>1.16.6.1</version>
      <executions>
        <execution>
          <id>delombok</id>
          <phase>generate-sources</phase>
          <goals>
            <goal>delombok</goal>
          </goals>
          <configuration>
            <addOutputDirectory>false</addOutputDirectory>
            <sourceDirectory>src/main/java</sourceDirectory>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

请注意,您不需要破解其他插件,例如maven-jar-pluginor maven-javadoc-plugin,因为它们应该尊重sourceDirectory.

使用此 hack 需要您自担风险。 (我的猜测是这可能会使您的 IDE 和其他一些开发人员感到困惑。)

于 2015-09-01T07:19:30.650 回答
2

我尝试使用其他答案中的解决方案,但 IntelliJ 仍会将我的源文件标记src/main/java为重复。delombok所以我只是决定在编译后摆脱's 的内容。最后,该文件夹仅用作编译的中间阶段(在我的情况下,它需要将 lombok 与 AspectJ 编译器一起使用)并且没有真正需要保留它。我通过配置专门针对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>
于 2019-12-24T12:52:38.883 回答
0

似乎没有设置 Lombok Maven 的好方法。@opyate 建议的“配置文件”方法不起作用,因为

http://jira.codehaus.org/browse/MNG-5310

但是,一个非常丑陋的解决方法是简单地拥有另一个pom.xml,除了重新定义之外,在所有方面都相同sourceDirectory,使用命令行参数来使用文件,如下所示:

Maven 备用 pom

于 2012-07-12T14:04:07.773 回答