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

idea启动spring boot无法加载或找不到主类

Spring Boot gradle“找不到或加载主类”

Gradle 构建没有主类的 Spring Boot 库