Java 17 记录类上的 UnknownElementException

way*_*yne 5 java maven java-17

今天我兴奋地下载了 Java 17 并得到了一个简单的记录类

\n
public record TestCls(Party producer, Party client, Party server) {}\n
Run Code Online (Sandbox Code Playgroud)\n

但是,在执行时mvn compile,它会抛出错误\nFatal error compiling: javax.lang.model.element.UnknownElementException: Unknown element: "com.xxx.TestCls"

\n

我仔细检查了一下java -version,它看起来对我来说是正确的:

\n
openjdk version "17" 2021-09-14\nOpenJDK Runtime Environment (build 17+35-2724)\nOpenJDK 64-Bit Server VM (build 17+35-2724, mixed mode, sharing)\n
Run Code Online (Sandbox Code Playgroud)\n

有人知道吗?提前致谢!

\n
\n

补充:\n我的maven版本是3.5.4.
pom 文件中的 maven 设置:

\n
openjdk version "17" 2021-09-14\nOpenJDK Runtime Environment (build 17+35-2724)\nOpenJDK 64-Bit Server VM (build 17+35-2724, mixed mode, sharing)\n
Run Code Online (Sandbox Code Playgroud)\n

2021.1.2在 M1 芯片上使用 Intellij。但我尝试在终端中进行 mvn 编译,它给了我同样的错误。
\nParty该类是在同一项目中定义的。

\n

整个pom文件:

\n
    <properties>\n        <maven.compiler.source>17</maven.compiler.source>\n        <maven.compiler.target>17</maven.compiler.target>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    </properties>\n
Run Code Online (Sandbox Code Playgroud)\n

和堆栈跟踪mvn compile -e

\n
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project reporting-event-spring-boot-starter: Fatal error compiling: javax.lang.model.element.UnknownElementException: Unknown element: "com.xxx.TestCls" -> [Help 1]\norg.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project reporting-event-spring-boot-starter: Fatal error compiling\n    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:213)\n    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:154)\n    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:146)\n    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)\n    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)\n    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)\n    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)\n    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)\n    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)\n    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)\n    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:954)\n    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)\n    at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)\n    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)\n    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:77)\n    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)\n    at java.lang.reflect.Method.invoke (Method.java:568)\n    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:289)\n    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:229)\n    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:415)\n    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:356)\nCaused by: org.apache.maven.plugin.MojoExecutionException: Fatal error compiling\n    at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute (AbstractCompilerMojo.java:796)\n    at org.apache.maven.plugin.compiler.CompilerMojo.execute (CompilerMojo.java:129)\n    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)\n    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:208)\n    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:154)\n    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:146)\n    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)\n    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)\n    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)\n    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)\n    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)\n    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)\n    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)\n    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:954)\n    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)\n    at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)\n    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)\n    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:77)\n    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)\n    at java.lang.reflect.Method.invoke (Method.java:568)\n    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:289)\n    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:229)\n    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:415)\n    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:356)\nCaused by: org.codehaus.plexus.compiler.CompilerException: javax.lang.model.element.UnknownElementException: Unknown element: "com.xxx.TestCls"\n    at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess (JavaxToolsCompiler.java:191)\n    at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile (JavacCompiler.java:169)\n    at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute (AbstractCompilerMojo.java:785)\n    at org.apache.maven.plugin.compiler.CompilerMojo.execute (CompilerMojo.java:129)\n    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)\n    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:208)\n    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:154)\n    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:146)\n    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)\n    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)\n    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)\n    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)\n    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)\n    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)\n    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)\n    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:954)\n    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)\n    at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)\n    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)\n    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:77)\n    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)\n    at java.lang.reflect.Method.invoke (Method.java:568)\n    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:289)\n    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:229)\n    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:415)\n    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:356)\nCaused by: java.lang.RuntimeException: javax.lang.model.element.UnknownElementException: Unknown element: "com.xxx.TestCls"\n    at com.sun.tools.javac.api.JavacTaskImpl.invocationHelper (JavacTaskImpl.java:168)\n    at com.sun.tools.javac.api.JavacTaskImpl.doCall (JavacTaskImpl.java:100)\n    at com.sun.tools.javac.api.JavacTaskImpl.call (JavacTaskImpl.java:94)\n    at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess (JavaxToolsCompiler.java:126)\n    at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile (JavacCompiler.java:169)\n    at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute (AbstractCompilerMojo.java:785)\n    at org.apache.maven.plugin.compiler.CompilerMojo.execute (CompilerMojo.java:129)\n    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)\n    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:208)\n    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:154)\n    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:146)\n    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)\n    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)\n    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)\n    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)\n    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)\n    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)\n    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)\n    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:954)\n    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)\n    at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)\n    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)\n    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:77)\n    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)\n    at java.lang.reflect.Method.invoke (Method.java:568)\n    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:289)\n    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:229)\n    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:415)\n    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:356)\nCaused by: javax.lang.model.element.UnknownElementException: Unknown element: "com.xxx.TestCls"\n    at javax.lang.model.util.AbstractElementVisitor6.visitUnknown (AbstractElementVisitor6.java:129)\n    at javax.lang.model.util.ElementKindVisitor6.visitTypeAsRecord (ElementKindVisitor6.java:231)\n    at javax.lang.model.util.ElementKindVisitor6.visitType (ElementKindVisitor6.java:160)\n    at com.sun.tools.javac.code.Symbol$ClassSymbol.accept (Symbol.java:1561)\n    at org.hibernate.validator.ap.ConstraintValidationProcessor.process (ConstraintValidationProcessor.java:119)\n    at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor (JavacProcessingEnvironment.java:1023)\n    at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs (JavacProcessingEnvironment.java:939)\n    at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run (JavacProcessingEnvironment.java:1267)\n    at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing (JavacProcessingEnvironment.java:1382)\n    at com.sun.tools.javac.main.JavaCompiler.processAnnotations (JavaCompiler.java:1234)\n    at com.sun.tools.javac.main.JavaCompiler.compile (JavaCompiler.java:916)\n    at com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0 (JavacTaskImpl.java:104)\n    at com.sun.tools.javac.api.JavacTaskImpl.invocationHelper (JavacTaskImpl.java:152)\n    at com.sun.tools.javac.api.JavacTaskImpl.doCall (JavacTaskImpl.java:100)\n    at com.sun.tools.javac.api.JavacTaskImpl.call (JavacTaskImpl.java:94)\n    at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess (JavaxToolsCompiler.java:126)\n    at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile (JavacCompiler.java:169)\n    at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute (AbstractCompilerMojo.java:785)\n    at org.apache.maven.plugin.compiler.CompilerMojo.execute (CompilerMojo.java:129)\n    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)\n    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:208)\n    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:154)\n    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:146)\n    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)\n    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)\n    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)\n    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)\n    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)\n    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)\n    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)\n    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:954)\n    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)\n    at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)\n    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)\n    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:77)\n    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)\n    at java.lang.reflect.Method.invoke (Method.java:568)\n    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:289)\n    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:229)\n    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:415)\n    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:356)\n[ERROR]\n[ERROR] Re-run Maven using the -X switch to enable full debug logging.\n[ERROR]\n[ERROR] For more information about the errors and possible solutions, please read the following articles:\n[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException\n
Run Code Online (Sandbox Code Playgroud)\n
\n

在此处发布 ChatGPT\xe2\x80\x99s 答案:\n看起来您正在使用旧版本的 Maven (3.5.4),该版本不支持 Java 17 中引入的新功能,例如记录。为了将 Java 17 功能与 Maven 结合使用,您需要使用包含对 Java 17 支持的更新版本的 Maven。

\n

您可以在 Maven 文档 [1] 中检查 Maven 版本与 Java 版本的兼容性。根据文档,Maven 3.6.3及更高版本支持Java 17。

\n

因此,要将 Java 17 功能与 Maven 结合使用,您需要升级到更新版本的 Maven,例如版本 3.6.3 或更高版本。一旦升级到 Maven 的兼容版本,您应该能够编译和使用您的记录类,而不会遇到未知元素错误。

\n

[1] https://maven.apache.org/docs/history.html#Java_Versions

\n

man*_*uti 7

显然,按照评论中的建议升级 Maven 和 maven-compiler-plugin 的版本会更安全。然而,编译器错误堆栈跟踪中有趣的部分是:

Caused by: javax.lang.model.element.UnknownElementException: Unknown element: "com.xxx.TestCls"
    at javax.lang.model.util.AbstractElementVisitor6.visitUnknown (AbstractElementVisitor6.java:129)
    at javax.lang.model.util.ElementKindVisitor6.visitTypeAsRecord (ElementKindVisitor6.java:231)
    at javax.lang.model.util.ElementKindVisitor6.visitType (ElementKindVisitor6.java:160)
    at com.sun.tools.javac.code.Symbol$ClassSymbol.accept (Symbol.java:1561)
    at org.hibernate.validator.ap.ConstraintValidationProcessor.process (ConstraintValidationProcessor.java:119)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor (JavacProcessingEnvironment.java:1023)
Run Code Online (Sandbox Code Playgroud)

在我看来,org.hibernate.validator.ap.ConstraintValidationProcessor正在调用一个访问者,该访问者的类型ConstraintAnnotationVisitor本身是扩展的AbstractElementVisitor,而扩展又是扩展的ElementKindVisitor8。后者来自 JDK,似乎针对 Java 8 源,而记录似乎受AbstractElementVisitor14.

这让我怀疑这可能是休眠验证器ConstraintAnnotationVisitor不支持记录的问题?也许他们的 GitHub 存储库上的一个问题有更完整的复制会有所帮助。