构建Spring Boot 1.5项目时出现Hibernate Validator类找不到错误
问题现象
构建Spring Boot 1.5项目时触发编译错误,未直接引用org.hibernate.validator.group.DefaultGroupSequenceProvider类,但编译阶段抛出NoClassDefFoundError,错误并非业务代码编译错误,而是注解处理器引发的依赖缺失。
项目依赖配置
</dependency> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.3.6.Final</version> </dependency>
编译错误信息
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project priapp-mobileapi-proc: Fatal error compiling: java.lang.NoClassDefFoundError: org/hibernate/validator/group/DefaultGroupSequenceProvider: org.hibernate.validator.group.DefaultGroupSequenceProvider -> [Help 1]
[ERROR]
环境参数
- Apache Maven 3.5.3 (3383c37e1f9e9b3bc3df5050c29c8aff9f295297; 2018-02-24T14:49:05-05:00)
- Maven home: /Users/user/Documents/tools/apache-maven-3.5.3
- Java version: 1.8.0_301, vendor: Oracle Corporation
- Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre
- Default locale: en_US, platform encoding: UTF-8
- OS: macOS 10.15.7 (x86_64)
错误堆栈
Caused by: java.lang.ClassNotFoundException: org.hibernate.validator.group.DefaultGroupSequenceProvider at java.net.URLClassLoader.findClass (URLClassLoader.java:382) at java.lang.ClassLoader.loadClass (ClassLoader.java:418) at java.lang.ClassLoader.loadClass (ClassLoader.java:351) at org.hibernate.validator.ap.checks.GroupSequenceProviderCheck.<init>(GroupSequenceProviderCheck.java:63) at org.hibernate.validator.ap.checks.ConstraintCheckFactory.<init>(ConstraintCheckFactory.java:125) at org.hibernate.validator.ap.ConstraintAnnotationVisitor.<init>(ConstraintAnnotationVisitor.java:68) at org.hibernate.validator.ap.ConstraintValidationProcessor.process (ConstraintValidationProcessor.java:101) at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor (JavacProcessingEnvironment.java:794) at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs (JavacProcessingEnvironment.java:705) at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800 (JavacProcessingEnvironment.java:91) at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run (JavacProcessingEnvironment.java:1035) at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing (JavacProcessingEnvironment.java:1176) at com.sun.tools.javac.main.JavaCompiler.processAnnotations (JavaCompiler.java:1170) at com.sun.tools.javac.main.JavaCompiler.compile (JavaCompiler.java:856) at com.sun.tools.javac.main.Main.compile (Main.java:523) at com.sun.tools.javac.api.JavacTaskImpl.doCall (JavacTaskImpl.java:129) at com.sun.tools.javac.api.JavacTaskImpl.call (JavacTaskImpl.java:138) at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess (JavaxToolsCompiler.java:126) at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile (JavacCompiler.java:169) at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute (AbstractCompilerMojo.java:785) at org.apache.maven.plugin.compiler.CompilerMojo.execute (CompilerMojo.java:129) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:208) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:154) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:146) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192) at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105) at org.apache.maven.cli.MavenCli.execute (MavenCli.java:956) at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:290) at org.apache.maven.cli.MavenCli.main (MavenCli.java:194) at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke (Method.java:498) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:289) at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:229) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:415) at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:356)
问题原因与解决方法
原因分析
该错误是Hibernate Validator的注解处理器在编译阶段运行时找不到DefaultGroupSequenceProvider类导致的。该类属于Hibernate Validator核心模块,可能是注解处理器的classpath未包含完整依赖,或存在版本冲突。
解决步骤
确保编译阶段依赖完整
确认hibernate-validator依赖范围为默认的compile(无需显式声明),保证编译阶段注解处理器能访问所有必要类。显式添加注解处理器依赖
若上述操作无效,添加与hibernate-validator版本一致的注解处理器依赖:<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator-annotation-processor</artifactId> <version>5.3.6.Final</version> <scope>provided</scope> </dependency>禁用注解处理器(临时方案)
若不需要编译时校验,可在maven-compiler-plugin中禁用注解处理器:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <annotationProcessors> <!-- 空配置禁用所有注解处理器 --> </annotationProcessors> </configuration> </plugin>使用Spring Boot Starter统一管理依赖
推荐使用Spring Boot官方starter管理校验依赖,自动处理版本兼容:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>Spring Boot 1.5版本中该starter已适配对应Hibernate Validator版本,无需手动指定。
内容的提问来源于stack exchange,提问作者Berlin Brown

