簡體   English   中英

使用 Lombok 的 @Builder 注釋時出現 Javadoc“找不到符號”錯誤

[英]Javadoc "cannot find symbol" error when using Lombok's @Builder annotation

我有一個 class,如下所示:

@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)
[錯誤] ^
[錯誤] 符號:class FooBuilder
[錯誤] 位置:class Foo

為了解決這個問題,我必須使用 Lombok 的delombok功能(參見: https : delombok )。

lombok 並未涵蓋所有工具。 例如,lombok 無法插入在 java 源代碼上運行的 javadoc ...。 Delombok 仍然允許您將 lombok 與這些工具一起使用,方法是將您的 java 代碼預處理為 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>

Lombok 實際上能夠填充一個部分定義的構建器類,因此您可以聲明足夠的構建器以使 Javadoc 滿意,然后將其保留。 無需德龍博克。

在這種情況下,以下對我有用:

@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 {}

}

旁注:您實際上可以使用這種技術來添加一些客戶構建器方法,因此它有好處。 當我有集合時,我喜歡重載構建器方法,這樣我就可以一次一個項目。 可能已經有一些技術可以做到這一點,但很高興知道您可以手動改進構建器。

更新

如果你使用 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。 相反,只需導入父級 class 並將構建器類型的聲明更改為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();
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM