Spring Boot运行抛MojoExecutionException,实体继承复用问题求助
Spring Boot启动报错MojoExecutionException排查与解决
错误信息
运行Spring Boot应用时触发org.apache.maven.plugin.MojoExecutionException,具体日志如下:
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:3.0.2:run (default-cli) on project demo: Process terminated with exit code: 1 -> [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:3.0.2:run (default-cli) on project demo: Process terminated with exit code: 1 at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:215) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148) 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:957) at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289) at org.apache.maven.cli.MavenCli.main (MavenCli.java:193) at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:77) at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke (Method.java:568) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282) at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406) at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347) Caused by: org.apache.maven.plugin.MojoExecutionException: Process terminated with exit code: 1 at org.springframework.boot.maven.JavaProcessExecutor.run (JavaProcessExecutor.java:74) at org.springframework.boot.maven.RunMojo.run (RunMojo.java:68) at org.springframework.boot.maven.AbstractRunMojo.run (AbstractRunMojo.java:218) at org.springframework.boot.maven.AbstractRunMojo.execute (AbstractRunMojo.java:205) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148) 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:957) at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289) at org.apache.maven.cli.MavenCli.main (MavenCli.java:193) at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:77) at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke (Method.java:568) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282) at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406) at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347) [ERROR] [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
相关实体类代码
Student.java
package com.example.demo.entity; import java.time.LocalDate; import java.util.HashSet; import java.util.Set; import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.Entity; import jakarta.persistence.Table; import jakarta.persistence.JoinColumn; import jakarta.persistence.JoinTable; import jakarta.persistence.ManyToMany; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; @Entity @Table(name = "Student") @ToString @NoArgsConstructor public class Student extends User { public Student(String name, String email, LocalDate dob) { setName(name); setEmail(email); setDob(dob); } @ManyToMany @JoinTable( name = "enrolled", joinColumns = @JoinColumn(name = "student_id"), inverseJoinColumns = @JoinColumn(name = "course_id") ) @Getter @Setter @JsonIgnore private Set<Course> enrolledCourses = new HashSet<>(); }
User.java
package com.example.demo.entity; import java.time.LocalDate; import java.time.Period; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Transient; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.Setter; @Getter @Setter @RequiredArgsConstructor @NoArgsConstructor public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private String id; @NonNull private String name; @NonNull private String email; @NonNull private LocalDate dob; @Transient @NonNull private Integer age; public Integer getAge() { return Period.between(this.dob, LocalDate.now()).getYears(); } }
问题原因分析
- JPA继承注解缺失:User类作为实体父类,未标注
@MappedSuperclass注解,JPA无法识别该类的映射元数据,导致子类Student的实体映射配置失效。 - age字段注解冲突:age字段是通过计算得到的瞬态字段,标注
@NonNull会要求实例化时必须赋值,但该字段实际是动态计算的,会导致对象初始化异常。 - Student构造方法不规范:使用set方法初始化父类属性,而非调用父类构造方法,可能导致父类属性初始化不完整。
解决方案
修复User类
添加@MappedSuperclass注解,移除age字段的@NonNull:
package com.example.demo.entity; import java.time.LocalDate; import java.time.Period; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.MappedSuperclass; import jakarta.persistence.Transient; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.Setter; @MappedSuperclass // 添加该注解,标识为JPA映射父类 @Getter @Setter @RequiredArgsConstructor @NoArgsConstructor public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private String id; @NonNull private String name; @NonNull private String email; @NonNull private LocalDate dob; @Transient private Integer age; // 移除@NonNull public Integer getAge() { return Period.between(this.dob, LocalDate.now()).getYears(); } }
修复Student构造方法
调用父类构造方法初始化属性:
public Student(String name, String email, LocalDate dob) { super(name, email, dob); // 直接调用父类带参构造 }
额外检查
- 确保Teacher类后续修改时也遵循相同的继承规范,添加
@Entity、@Table注解并继承User类。 - 清理Maven缓存(执行
mvn clean)后重新启动应用,避免缓存导致的异常。
内容的提问来源于stack exchange,提问作者Serdar
相关产品推荐
相关产品推荐

