【问题标题】:Maven build cannot find symbol when accessing project lombok annotated methods,访问项目 lombok 注释方法时,Maven 构建找不到符号,
【发布时间】:2023-04-05 15:47:01
【问题描述】:

我第一次使用项目 lombok,当我运行构建时通过 maven 编译项目时遇到问题,我收到错误,其中调用了带有项目 lombok 注释的方法。

这是带注释的参数:

    private @Getter @Setter String paymentNonce = null;

例如,在这一行中,maven 破坏了构建:

if (!StringUtilities.isNullOrEmpty(getPaymentNonce())) {

这是我的maven依赖

<dependency> 
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.4</version> 
</dependency>

maven 错误:

[INFO] Compiling 158 source files to C:\java\repos\luna\cloudflow\cloudflow-ejb\target\classes
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] \java\repos\luna\cloudflow\cloudflow-ejb\src\main\java\si\arctur\controller\PaymentProcessor.java:[94,38] error: cannot find symbol
[ERROR] \java\repos\luna\cloudflow\cloudflow-ejb\src\main\java\si\arctur\controller\PaymentProcessor.java:[97,106] error: cannot find symbol
[ERROR] \java\repos\luna\cloudflow\cloudflow-ejb\src\main\java\si\arctur\controller\PaymentProcessor.java:[142,2] error: cannot find symbol
[ERROR] \java\repos\luna\cloudflow\cloudflow-ejb\src\main\java\si\arctur\controller\ShoppingCart.java:[27,6] error: cannot find symbol
[ERROR] \java\repos\luna\cloudflow\cloudflow-ejb\src\main\java\si\arctur\controller\ShoppingCart.java:[32,75] error: cannot find symbol
.....

我正在使用 java 8

【问题讨论】:

    标签: java maven lombok


    【解决方案1】:

    我实际上可以通过遵循此处发布的答案来解决这个问题:

    MapStruct and Lombok not working together

    基本上我必须将lombok 添加到maven-compiler-plugin &lt;annotationProcessorPaths&gt;

    【讨论】:

      【解决方案2】:

      对于其他使用 JDK9 及以上版本的用户,您应该将 annotationProcessorPaths 添加到 maven 编译器插件

      <annotationProcessorPaths>
          <path>
              <groupId>org.projectlombok</groupId>
              <artifactId>lombok</artifactId>
              <version>1.18.16</version>
          </path>
      </annotationProcessorPaths>
      

      【讨论】:

        【解决方案3】:

        我不知道,但由于某种原因它解决了我的问题。

        我有两个使用@Builder 生成构建方法的类。但一个是正常的,另一个是不正常的。我检查了一切,似乎没问题。 但是当我运行mvn编译我的项目时,报错如下:

        找不到符号 方法构建器()

        import lombok.*;
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        @Builder
        class A {
        
        }
        
        
        import lombok.*;
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        @Builder
        class B {
        
        }
        

        A 类编译正确,但 B 类报告上述问题。

        我尝试替换 Lombok JAR 的版本,但即使我将版本设置为最新,也无法正常工作。

        所以,我尝试为我引用的每个类导入 Lombok。

        import lombok.AllArgsConstructor;
        import lombok.Builder;
        import lombok.Data;
        import lombok.NoArgsConstructor;
        
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        @Builder
        class B {
        
        }
        

        有效!这似乎是一个错误。

        【讨论】:

          【解决方案4】:

          尝试在依赖项中为“lombok”模块指定参数。我遇到了同样的问题并通过这个解决方法解决了这个问题。

          【讨论】:

            【解决方案5】:

            我的解决方案是在注解前加上 lombok 包名。

            @lombok.Builder
            @lombok.experimental.Accessors(prefix = "m", chain = true)
            

            而不是

            @Builder
            @Accessors(prefix = "m", chain = true)
            

            【讨论】:

            • 在我的例子中,这个解决方案适用于嵌套类的 lombok 注释。
            【解决方案6】:

            如果您将 Lombok 相关的静态方法(主要是 @Builder)与静态导入一起使用,您可能会遇到类似的问题(甚至在代码的其他部分!)。

            有一个未解决的问题:https://github.com/rzwitserloot/lombok/issues/979

            当前的解决方法是不使用静态导入,例如改变

            import static my.org.Foo.FooBuilder
             ...
            FooBuilder builder = Foo.builder();
            

            到:

            Foo.FooBuilder builder = Foo.builder(); // note >>Foo.<<FooBuilder; without static import
            

            【讨论】:

            • +1 这解决了我的问题。我现在使用的 cmets 中提到了另一种解决方法:“一种解决方法是创建一个静态方法,该方法返回类中的构建器并使用该方法而不是 lombok 生成的方法。”
            【解决方案7】:

            如果您在静态类中使用 lombok 注释,那么您将不得不提及该类的全名,即。而不是 @Data@lombok.Data 。这对我有用。

            【讨论】:

              【解决方案8】:

              简而言之,将maven-compiler-plugin 升级到2.4,或者将lombok 降级到1.14.* 以下。

              似乎2.4下面的maven-compiler-plugin不支持名称为$javax.annotation.processing.Processor

              更新:您可以将maven-compiler-plugin配置为fork,或将plexus-compiler-javac更新为1.8.6。 (maven-compiler-plugin2.3.2 需要1.8.12.4 需要1.8.6

              由于1.16,lombok 使用ShadowClassLoader,这阻止了lombok 内部类的IDE 升级。但是,如果类加载器是org.codehaus.plexus.compiler.javac.IsolatedClassLoader,它不会使用ShadowClassLoader。 (我不知道为什么 lombok 家伙使用硬代码来解决与 plexus-compiler-javac 相关的其他问题可能。)

              maven-compiler-plugin2.4,或者更确切地说,plexus-compiler-javac1.8.6,不使用org.codehaus.plexus.compiler.javac.IsolatedClassLoader,所以它又可以工作了。

              【讨论】:

              【解决方案9】:

              在我的情况下,它是通过升级 JDK 解决的(以前是 1.8.0_66,现在是 1.8.0_92)

              【讨论】:

              • 不是jdk的问题。
              • 我看到在 lombok's changelog 上提到了特定的 JDK 版本。如果有人知道为什么这个特定问题与 jdk 无关,请分享。
              【解决方案10】:

              使用 maven-compiler-plugin v.2.3.2 时遇到同样的问题 更新到3.5版本后问题消失了

              <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-compiler-plugin</artifactId>
                  <version>3.5</version>
                  <configuration>
                      ...
                  </configuration>
              </plugin>
              

              希望对你有帮助

              【讨论】:

              • 此解决方案对maven-compiler-plugin:3.5.1仍然有效。
              • 我已经尝试过maven-compiler-plugin:3.5.1maven-compiler-plugin:3.7.0 版本,但只有maven-compiler-plugin:3.5 可以与Lombok 一起使用
              【解决方案11】:

              我已经将 lombok 降级到 1.14.8 这个版本适用于 maven 构建,我还没有找到为什么 1.16 版本不起作用:(

              【讨论】:

              • 在 maven 3.0.5、Netbeans 8.0.2、java 1.8.0_72-internal 上也有同样的经历; OpenJDK 64 位服务器 VM 25.72-b05 和降级到 1.14.8 使 maven 编译正确。我已经设法用 1.16 正确编译了几次,但过了一段时间它开始抛出 error: cannot find symbol
              • 看我的回答,lombok下个版本会修复的。
              • 这解决了我的问题!在我的情况下,Android Studio 中没有生成 Getter 和 Setter。
              【解决方案12】:

              可能是您在 java 编译 (javac) 中指定了 -proc:none 或使用 -processor &lt;processorclass&gt; 显式指定注释处理器?

              【讨论】:

              • 实际上,如果我将日志版本降级到 1.14.8 它可以工作,只有从 1.16 开始的新版本不起作用
              • 与proc无关。
              猜你喜欢
              • 2016-08-11
              • 1970-01-01
              • 2020-08-12
              • 1970-01-01
              • 2019-01-27
              • 1970-01-01
              • 1970-01-01
              • 2018-01-13
              • 2015-05-28
              相关资源
              最近更新 更多