使用Lombok的@Builder注释时出现Javadoc“找不到符号”错误

问题描述 投票:0回答:5

我有一堂课,如下所示:

@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:错误:找不到符号
[错误]公共静态 FooBuilder 构建器(字符串_param)
[错误]^
[错误]符号:类 FooBuilder
[错误]位置:Foo类

java maven javadoc lombok maven-javadoc-plugin
5个回答
34
投票

Lombok 实际上能够填写部分定义的构建器类,因此您可以声明足够的构建器以使 Javadoc 满意并保留它。无需 delombok。

在这种情况下,以下方法对我有用:

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

    // Add this line and all is good
    public static class FooBuilder {}

}

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

这是我喜欢做的一件常见的事情:

@Builder
public class Foo {
    private final String command;
    private final List<String> params;
    private final boolean background;
    
    public static class FooBuilder {
        public FooBuilder params(final String... params) {
            this.params = Arrays.asList(params);
            return this;
        }
    }
}

在上面的

params
构建器方法已被定制为采用 var args。其他构建器方法仍将由 Lombok 创建。


24
投票

为了解决这个问题,我必须使用Lombok的

delombok
功能(参见:https://projectlombok.org/features/delombok)。

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

我使用 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>

4
投票

更新

如果你使用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 就阻止我构建我的应用程序。


0
投票

另一个解决方案是不在导入中包含 BuilderClass。相反,只需导入父类并将构建器类型的声明更改为 parentClass.builderClass

@Getter
@RequiredArgsConstructor
@Builder
public class Foo {
    private final String param;
}
import com.Foo;
//import com.Foo.FooBuilder;

public class Bar {

    public Foo newFoo(String paramValue) {
        Foo.FooBuilder builder = Foo.builder();
        return builder.param(paramValue)
                  .build();
    }

}

0
投票

这很可能不是您的情况。但我遇到过这种情况的唯一情况是,如果我的构建中存在其他问题。一个常见的问题是需要生成类的映射结构,但它失败了。在 lombok 设法生成它生成的任何内容之前,构建停止了。

然后在引用构建器时会出现构建错误,因为它从未被构建。但这不是 lombok 问题,而是构建问题。

再说一次,可能不是你的情况。但我从来没有见过这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.