【问题标题】:SpringBoot: Unable to find a single main class from the following candidatesSpring Boot:无法从以下候选中找到单个主类
【发布时间】: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 个主要方法

标签: spring maven spring-mvc spring-boot spring-profiles


【解决方案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里面一个!

                【讨论】:

                  猜你喜欢
                  • 2018-11-26
                  • 2018-01-30
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-12-18
                  • 2020-10-10
                  • 2019-01-23
                  • 1970-01-01
                  • 2017-08-13
                  相关资源
                  最近更新 更多