我有一堂课,如下所示:
@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类
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 创建。
为了解决这个问题,我必须使用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>
更新
如果你使用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 就阻止我构建我的应用程序。
另一个解决方案是不在导入中包含 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();
}
}
这很可能不是您的情况。但我遇到过这种情况的唯一情况是,如果我的构建中存在其他问题。一个常见的问题是需要生成类的映射结构,但它失败了。在 lombok 设法生成它生成的任何内容之前,构建停止了。
然后在引用构建器时会出现构建错误,因为它从未被构建。但这不是 lombok 问题,而是构建问题。
再说一次,可能不是你的情况。但我从来没有见过这个问题。