Spring Boot:无法从以下候选中找到单个主类
Posted
技术标签:
【中文标题】Spring Boot:无法从以下候选中找到单个主类【英文标题】:SpringBoot: Unable to find a single main class from the following candidates 【发布时间】:2017-08-08 00:15:45 【问题描述】:我使用 Spring Initializer、嵌入式 Tomcat、Thymeleaf 模板引擎生成了一个 Spring Boot Web 应用程序。使用的技术: Spring Boot 1.4.2.RELEASE、Spring 4.3.4.RELEASE、Thymeleaf 2.1.5.RELEASE、Tomcat 嵌入 8.5.6、Maven 3、Java 8
我有一个 SpringBoot 应用程序。使用这两个类:
@Profile("!war")
@SpringBootApplication
@Import(SecurityConfig.class ,PersistenceConfig.class, ServiceConfig.class)
public class BookApplication
public static void main(String[] args)
SpringApplication.run(BookApplication.class, args);
@Profile("war")
@Import(SecurityConfig.class ,PersistenceConfig.class)
@SpringBootApplication
public class BookApplicationWar extends SpringBootServletInitializer
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
return application.sources(BookApplicationWar.class);
public static void main(String[] args) throws Exception
SpringApplication.run(BookApplicationWar.class, args);
我用这个命令生成战争
mvn clean package -DskipTests -Dspring.profiles.active=pebloc,war -DAPP-KEY=pebloc
但是我收到了这个错误:
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.5.2.RELEASE:repackage (default) on project book: Execution default of goal org.springframework.boot:spring-boot-maven-plugin:1.5.2.RELEASE:repackage failed: Unable to find a single main class from the following candidates [com.tdk.BookApplication, com.tdk.BookApplicationWar] -> [Help 1]
【问题讨论】:
发生这种情况是因为您可能有 2 个主要方法 【参考方案1】:如果您有多个主类,则需要在每个配置文件中明确configure the main class:
<profiles>
<profile>
<id>profile1</id>
<properties>
<spring.boot.mainclass>com.SomeClass</spring.boot.mainclass>
</properties>
</profile>
<profile>
<id>profile2</id>
<properties>
<spring.boot.mainclass>com.SomeOtherClass</spring.boot.mainclass>
</properties>
</profile>
</profiles>
...
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.5.2.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<mainClass>$spring.boot.mainclass</mainClass>
</configuration>
</execution>
</executions>
...
</plugin>
见spring-boot:repackage
【讨论】:
而我使用的标签@Profile 没用? Maven 配置文件和 Spring 配置文件是两个不同的概念。 @NuñitodelaCalzada 问题不在于 Spring,而在于 Jar 本身。一个 Jar 清单只能定义一个主类。 Spring Profiles 只能在主类中激活。 @SeanPatrickFloyd ,多年后,我仍然在这里找到你的智慧。雷 @RaymondChenon 总是乐于提供帮助 :-)【参考方案2】:[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.5.2.RELEASE:repackage (default) on project book: Execution default of goal org.springframework.boot:spring-boot-maven-plugin:1.5.2.RELEASE:repackage failed: Unable to find a single main class from the following candidates [com.tdk.BookApplication, com.tdk.BookApplicationWar]
出现以下错误的一个可能原因是您的代码中有多个主要方法,Spring boot 只允许同一项目中所有类的一个主要方法。
【讨论】:
【参考方案3】:有时当您执行 mvn install 而不执行 mvn clean 时会出现此错误。
【讨论】:
Diddo for Gradle。当项目已经构建一次时更改包名称时可能会发生这种情况。在这种情况下,清洁会产生奇迹。 工作就像一个魅力。包重构完成,但没有清理它。【参考方案4】:或者只是硬编码插件配置中的主类。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<mainClass>your.main.class.MainClass</mainClass>
</configuration>
</execution>
</executions>
</plugin>
【讨论】:
【参考方案5】:如果您有多个带有public static void main(String[] args)
的课程,请检查您的申请。删除不需要的那个。特别是如果您使用https://start.spring.io/
生成项目,它会附带一个带有 main 方法的类。
如果您确实需要所有具有 main 方法的类,只需通过在 pom.xml 中提及它来明确提及在应用程序启动时将被 boos 捕获的类。
【讨论】:
【参考方案6】:通过 start-class 属性定义单个主类
<properties>
<start-class>com.may.Application</start-class>
</properties>
或者,在 spring-boot-maven-plugin 中定义主类
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.may.Application</mainClass>
</configuration>
</plugin>
</plugins>
</build>
或通过个人资料
<profiles>
<profile>
<id>profile1</id>
<properties>
<spring.boot.mainclass>com.may.Application1</spring.boot.mainclass>
</properties>
</profile>
<profile>
<id>profile2</id>
<properties>
<spring.boot.mainclass>com.may.Application2</spring.boot.mainclass>
</properties>
</profile>
</profiles>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<mainClass>$spring.boot.mainclass</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
【讨论】:
一处房产!很好的解决方案!【参考方案7】:我有同样的错误。我已将包含 main 的应用程序类从 foo.java 重命名为 bar.java,进行了清理和更新。所以我只有一个主菜。
当我删除目标文件夹下的旧生成类 foo.class 时,错误消失了。
【讨论】:
一个类似的解决方案对我有用——我在 Mac 上使用 Grails,所以只需./gradlew clean
就可以了。【参考方案8】:
你可以从命令行使用
... -Dstart-class=com.your.package.application.BookApplication
【讨论】:
【参考方案9】:我正在构建一个 Spring Boot 库项目,所以我不需要主入门类, 所以我在使用maven构建项目时遇到了同样的问题,所以我删除了maven插件以成功编译
<!--
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
-->
查看更详细的示例。在这里找到 https://spring.io/guides/gs/multi-module/
【讨论】:
【参考方案10】:如果您有一个 Spring Boot 应用程序,通常只有一个主类具有 @SpringBootApplication
,如果您在应用程序的某个位置添加另一个 main
方法,则 gradle 构建过程会变得混乱。因此,在 build.gradle
文件的根级别添加以下内容
apply plugin: 'application'
mainClassName = 'packageNameAfter.srcMainJavaFolder.YourClassName'
【讨论】:
【参考方案11】:要消除 Spring Boot 应用程序的入口点,您可以将以下指令添加到 Gradle 构建文件中
springBoot
mainClassName = 'your.org.bla.TestKt'
【讨论】:
【参考方案12】:<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>your.main.class.MainClass</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
配置元素必须在plugin里面一个!
【讨论】:
以上是关于Spring Boot:无法从以下候选中找到单个主类的主要内容,如果未能解决你的问题,请参考以下文章
错误:无法找到或加载主类 Maven Spring Boot 应用程序 - 可执行 JAR
Spring Boot scanBasePackages无法从依赖项中找到bean
示例 keycloak spring-boot 应用程序无法找到 bean KeycloakSpringBootConfigResolver