Maven构建在访问项目lombok注释方法时找不到符号,
Maven build cannot find symbol when accessing project lombok annotated methods,
我是第一次使用项目 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 编译 (javac) 中使用 -processor <processorclass>
指定了 -proc:none
或明确指定了注释处理器?
我已经将 lombok 降级到 1.14.8 这个版本适用于 maven 构建,我还没有找到为什么 1.16 verson 不工作:(
使用 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
升级到 2.4
,或将 lombok
降级到 1.14.*
以下。
2.4
下面的maven-compiler-plugin
好像不支持javax.annotation.processing.Processor
名字带$
的javax.annotation.processing.Processor
.
更新:您可以将maven-compiler-plugin
配置为fork
,或将plexus-compiler-javac
更新为1.8.6
。 (maven-compiler-plugin
2.3.2
需要 1.8.1
,2.4
需要 1.8.6
)
因为 1.16
,lombok 使用 ShadowClassLoader
,这阻止了 lombok 内部 class 的 IDE 提升。但是,如果 classloader 是 org.codehaus.plexus.compiler.javac.IsolatedClassLoader
,它不会使用 ShadowClassLoader
。 (我不知道为什么 lombok 的家伙使用硬代码来解决其他 可能 与 plexus-compiler-javac
相关的问题。)
maven-compiler-plugin
2.4
,或者更确切地说,plexus-compiler-javac
1.8.6
,不使用 org.codehaus.plexus.compiler.javac.IsolatedClassLoader
,所以它再次起作用。
在我的例子中,它是通过升级 JDK 解决的(之前是 1.8.0_66,现在是 1.8.0_92)
如果您在静态 classes 中使用 lombok 注释,在这种情况下,您将不得不提及 class 即的全名。而不是 @Data
到 @lombok.Data
。这对我有用。
如果您将 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
我的解决方案是在注释前加上 lombok 包名称。
@lombok.Builder
@lombok.experimental.Accessors(prefix = "m", chain = true)
而不是
@Builder
@Accessors(prefix = "m", chain = true)
尝试为 dependencies.I 中的 "lombok" 模块指定参数遇到同样的问题并通过此解决方法解决了这个问题。
我实际上能够按照此处发布的答案解决此问题:
基本上我必须将 lombok
添加到 maven-compiler-plugin
<annotationProcessorPaths>
我不知道,但出于某种原因它解决了我的问题。
我有两个 classes 使用 @Builder 生成构建方法。但一个正常,一个不正常。我已经检查了一切,看起来没问题。
但是当我运行mvn
编译我的项目时,报错如下:
Can't not find the symbol
method builder()
import lombok.*;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
class A {
}
import lombok.*;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
class B {
}
ClassA编译正确,但是ClassB报上面的问题
我尝试更换了Lombok JAR的版本,但即使我将版本设置为最新,也不行。
因此,我尝试根据我引用的 class 导入 Lombok。
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
class B {
}
有效!这似乎是一个错误。
对于使用 JDK9 及更高版本的其他用户,您应该将 annotationProcessorPaths 添加到 maven 编译器插件
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</path>
</annotationProcessorPaths>
对我来说,解决方案是 不要在 lombok 构建器上使用 import static
。变化:
import static Foo.builder;
builder().id(1).build()
收件人:
Foo.builder().id(1).build()
在我的例子中,我遇到了这个错误,因为其他 class 中的编译错误,但 lombok 抑制了真正的问题。
我建议您查看 classes 以查找错误。
希望对你有帮助
就我而言,我修复了两个配置并且它有效。
有人在编译器参数中将编译器参数设置为 -proc:none
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven_compiler_version}</version>
<configuration>
<compilerArgs>
<!--remove below compiler arg fixed my problem-->
<compilerArg>-proc:none</compilerArg>
<compilerArg>-parameters</compilerArg>
</compilerArgs>
<fork>true</fork>
<source>${java_source_version}</source>
<target>${java_target_version}</target>
<encoding>${file_encoding}</encoding>
</configuration>
</plugin>
Build, Execution, Deployment
> Compiler
> Java Compiler
> Use compiler
是 Ajc
.
我使用 lombok 1.18.24 和 java 8.
删除-proc:none
编译器参数并将编译器更改为javac
后,项目可以在IDEA maven或standalone maven中编译。
我在maven-compiler-plugin
中设计了<annotationProcessor>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<annotationProcessors>
<annotationProcessor>lombok.launch.AnnotationProcessorHider$AnnotationProcessor</annotationProcessor>
</annotationProcessors>
</configuration>
</plugin>
</plugins>
</build>
我是第一次使用项目 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 编译 (javac) 中使用 -processor <processorclass>
指定了 -proc:none
或明确指定了注释处理器?
我已经将 lombok 降级到 1.14.8 这个版本适用于 maven 构建,我还没有找到为什么 1.16 verson 不工作:(
使用 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
升级到 2.4
,或将 lombok
降级到 1.14.*
以下。
2.4
下面的maven-compiler-plugin
好像不支持javax.annotation.processing.Processor
名字带$
的javax.annotation.processing.Processor
.
更新:您可以将maven-compiler-plugin
配置为fork
,或将plexus-compiler-javac
更新为1.8.6
。 (maven-compiler-plugin
2.3.2
需要 1.8.1
,2.4
需要 1.8.6
)
因为 1.16
,lombok 使用 ShadowClassLoader
,这阻止了 lombok 内部 class 的 IDE 提升。但是,如果 classloader 是 org.codehaus.plexus.compiler.javac.IsolatedClassLoader
,它不会使用 ShadowClassLoader
。 (我不知道为什么 lombok 的家伙使用硬代码来解决其他 可能 与 plexus-compiler-javac
相关的问题。)
maven-compiler-plugin
2.4
,或者更确切地说,plexus-compiler-javac
1.8.6
,不使用 org.codehaus.plexus.compiler.javac.IsolatedClassLoader
,所以它再次起作用。
在我的例子中,它是通过升级 JDK 解决的(之前是 1.8.0_66,现在是 1.8.0_92)
如果您在静态 classes 中使用 lombok 注释,在这种情况下,您将不得不提及 class 即的全名。而不是 @Data
到 @lombok.Data
。这对我有用。
如果您将 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
我的解决方案是在注释前加上 lombok 包名称。
@lombok.Builder
@lombok.experimental.Accessors(prefix = "m", chain = true)
而不是
@Builder
@Accessors(prefix = "m", chain = true)
尝试为 dependencies.I 中的 "lombok" 模块指定参数遇到同样的问题并通过此解决方法解决了这个问题。
我实际上能够按照此处发布的答案解决此问题:
基本上我必须将 lombok
添加到 maven-compiler-plugin
<annotationProcessorPaths>
我不知道,但出于某种原因它解决了我的问题。
我有两个 classes 使用 @Builder 生成构建方法。但一个正常,一个不正常。我已经检查了一切,看起来没问题。
但是当我运行mvn
编译我的项目时,报错如下:
Can't not find the symbol method builder()
import lombok.*;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
class A {
}
import lombok.*;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
class B {
}
ClassA编译正确,但是ClassB报上面的问题
我尝试更换了Lombok JAR的版本,但即使我将版本设置为最新,也不行。
因此,我尝试根据我引用的 class 导入 Lombok。
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
class B {
}
有效!这似乎是一个错误。
对于使用 JDK9 及更高版本的其他用户,您应该将 annotationProcessorPaths 添加到 maven 编译器插件
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</path>
</annotationProcessorPaths>
对我来说,解决方案是 不要在 lombok 构建器上使用 import static
。变化:
import static Foo.builder;
builder().id(1).build()
收件人:
Foo.builder().id(1).build()
在我的例子中,我遇到了这个错误,因为其他 class 中的编译错误,但 lombok 抑制了真正的问题。 我建议您查看 classes 以查找错误。 希望对你有帮助
就我而言,我修复了两个配置并且它有效。
有人在编译器参数中将编译器参数设置为
-proc:none
:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven_compiler_version}</version> <configuration> <compilerArgs> <!--remove below compiler arg fixed my problem--> <compilerArg>-proc:none</compilerArg> <compilerArg>-parameters</compilerArg> </compilerArgs> <fork>true</fork> <source>${java_source_version}</source> <target>${java_target_version}</target> <encoding>${file_encoding}</encoding> </configuration> </plugin>
Build, Execution, Deployment
>Compiler
>Java Compiler
>Use compiler
是Ajc
.
我使用 lombok 1.18.24 和 java 8.
删除-proc:none
编译器参数并将编译器更改为javac
后,项目可以在IDEA maven或standalone maven中编译。
我在maven-compiler-plugin
<annotationProcessor>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<annotationProcessors>
<annotationProcessor>lombok.launch.AnnotationProcessorHider$AnnotationProcessor</annotationProcessor>
</annotationProcessors>
</configuration>
</plugin>
</plugins>
</build>