Spring boot打包时报错(spring boot Unable to find a single main class from the following candidates)

博客讲述定位问题花费较长时间,最终发现是在另一个类中也写了一个main函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定位了老半点天,最后发现是在另外一个类中也写了一个main函数:(
### Spring Boot WAR 打包无法找到单一主类的原因分析 当在构建 Spring Boot 项目并将其打包为 WAR 文件,如果遇到错误提示 `Unable to find a single main class`,这通常表明 Maven 或 Gradle 构建工具未能识别到项目的启动类。以下是可能原因及其解决方案: #### 原因一:缺少明确指定的 Main-Class 属性 Maven 的 Spring Boot 插件会尝试自动检测应用程序中的主类(即带有 `@SpringBootApplication` 注解的类)。然而,在某些情况下,可能存在多个候选主类,导致插件无法决定哪个是唯一的入口点。 **解决方法** 可以通过显式配置 `spring-boot-maven-plugin` 来指定主类的位置[^1]。例如,在 `pom.xml` 中添加如下配置: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.example.MyApplication</mainClass> </configuration> </plugin> </plugins> </build> ``` 上述代码片段通过 `<mainClass>` 显式指定了主类路径,从而解决了多候选主类的问题[^2]。 --- #### 原因二:项目结构不符合约定 Spring Boot 默认遵循一定的目录结构来定位主类文件。如果项目未按照标准布局创建,则可能导致插件找不到合适的主类。 **解决方法** 确保主类位于根包下或者其子包中。例如,假设应用名为 `myapp`,那么主类应放置于类似于 `com.myapp.MainApp` 这样的位置。此外,确认 `src/main/java` 下存在有效的 Java 源码树,并且该源码树包含至少一个带 `public static void main(String[] args)` 方法的类[^3]。 --- #### 原因三:POM 配置不正确 有 POM 文件中关于打包类型的定义可能出现偏差。默认情况下,Spring Boot 应用程序被打包成 JAR 格式;而为了支持部署至外部 Servlet 容器(如 Tomcat),需要调整为 WAR 类型。 **解决方法** 修改 `pom.xml` 文件中的 `<packaging>` 节点值为 `war` 并设置父依赖版本号。同继承正确的 Spring Boot Starter Parent 版本以及引入 Web 支持模块。具体实现方式如下所示: ```xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.0</version> </parent> <dependencies> <!-- 添加 web starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 如果要作为 war 包运行, 则需排除内置 tomcat --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> </dependencies> <packaging>war</packaging> ``` 以上更改明确了项目是以 WAR 形式交付给容器使用的事实[^4]。 --- #### 示例代码展示完整的 Application 启动类 下面是一个典型的 Spring Boot War 应用程序启动类示例: ```java package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication public class MyApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(MyApplication.class); } public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` 此段代码实现了扩展自 `SpringBootServletInitializer` 接口的功能,使得能够兼容传统 servlet 容器环境下的初始化逻辑[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值