【问题标题】:Javadoc "cannot find symbol" error when using Lombok's @Builder annotation使用 Lombok 的 @Builder 注释时出现 Javadoc“找不到符号”错误
【发布时间】:2019-01-27 14:09:02
【问题描述】:

我有一个如下所示的课程:

@Data
@Builder
public class Foo {
    private String param;

    /** My custom builder.*/
    public static FooBuilder builder(String _param){
        return builder().param(_param);
    }
}

我收到以下错误:

[错误] 无法在项目 foo 上执行目标 org.apache.maven.plugins:maven-javadoc-plugin:2.10.4:javadoc (default-cli):JavaDocs 报告生成时出错:
[错误] 退出代码:1 - /home/workspace/foo/src/main/java/com/foo/Foo.java:34:错误:找不到符号
[错误] public static FooBuilder builder(String _param)
[错误] ^
[错误] 符号:类 FooBuilder
[错误] 位置:Foo 类

【问题讨论】:

    标签: java maven javadoc lombok maven-javadoc-plugin


    【解决方案1】:

    更新

    如果你使用 maven-javadoc-plugin 3.2.0+,你可以这样配置:

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>3.2.0</version>
        <configuration>
          <doclint>none</doclint>
        </configuration>
      </plugin>
    

    doclint 配置将使 javadoc 插件不再抛出错误。它也会禁用 lint,但如果你觉得这可能是最好的方法,而不是 delombok。

    如果您使用任何 CI 工具来构建和编译您的项目,您可以创建一个单独的作业来检查 javadoc lint。

    对我来说,在构建中禁用 lint 并不是一件坏事。 Javadoc 很重要,但不应仅仅因为我使用 Lombok 就阻止我构建我的应用程序。

    【讨论】:

      【解决方案2】:

      Lombok 实际上能够填充部分定义的构建器类,因此您可以声明足够多的构建器以使 Javadoc 满意,然后将其保留。无需delombok。

      在这种情况下,以下内容对我有用:

      @Data
      @Builder
      public class Foo {
          private String param;
      
          /** My custom builder.*/
          public static FooBuilder builder(String _param){
              return builder().param(_param);
          }
      
          public static class FooBuilder {}
      
      }
      

      旁注:您实际上可以使用这种技术来添加一些客户构建器方法,因此它有好处。当我有集合时,我喜欢重载构建器方法,这样我就可以一次一个项目。可能已经有一些技术可以做到这一点,但很高兴知道您可以手动改进构建器。

      【讨论】:

      • 谢谢!工作正常(JDK 8,Lombok 1.8.12,Mapstruct 1.3.1)并将我们从 Delombok 中拯救出来 :-)
      • 我刚碰到这个问题,发现只需要声明空的FooBuilder。可以删除较大的 builder(..) 函数。 (JDK17,龙目岛 1.18.22)。
      • @ChrisK 正确。我添加了附加构建器方法作为边注中提到的自定义示例。我会澄清一下,以便清楚最低限度是多少。
      【解决方案3】:

      为了解决这个问题,我必须使用 Lombok 的 delombok 功能(参见:https://projectlombok.org/features/delombok)。

      lombok 并未涵盖所有工具。例如,lombok 不能插入在 java 源上运行的 javadoc ...。 Delombok 仍然允许您通过这些工具使用 lombok,方法是将您的 java 代码预处理为已应用 lombok 的所有转换的 java 代码。

      我使用 Maven 通过添加以下插件来做到这一点:

      <plugin>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok-maven-plugin</artifactId>
          <version>1.18.0.0</version>
          <configuration>
              <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
              <outputDirectory>${delombok.output}</outputDirectory>
              <addOutputDirectory>false</addOutputDirectory>
          </configuration>
          <executions>
              <execution>
                  <phase>generate-sources</phase>
                  <goals>
                      <goal>delombok</goal>
                  </goals>
              </execution>
          </executions>
      </plugin>
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-javadoc-plugin</artifactId>
          <version>2.9</version>
          <configuration>
              <sourcepath>${delombok.output}</sourcepath>
          </configuration>
      </plugin>
      

      【讨论】:

      • 没有其他方法可以处理@Builderjavadoc-plugin 之类的注解吗?与编译器插件相同&lt;annotationProcessorPaths&gt;?使用 delombok 听起来像是一种反模式。
      • 是的,听起来不错,但我认为没有其他方法,甚至 lombok 文档也断言它(参见我的回答),
      • 默认的delombok.outputDirectory${project.build.directory}/generated-sources/delombok所以你只需要在maven-javadoc-plugin中指定
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      相关资源
      最近更新 更多