SpringBoot:无法从以下候选项中找到单个主类

66

我使用Spring Initializer生成了一个Spring Boot Web应用程序,其中包含嵌入式Tomcat和Thymeleaf模板引擎。所使用的技术如下:

Spring Boot 1.4.2.RELEASE、Spring 4.3.4.RELEASE、Thymeleaf 2.1.5.RELEASE、Tomcat Embed 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
这是因为你可能有两个主要方法。 - Java Main
14个回答

56

通过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>
                <configuration>
                    <mainClass>${spring.boot.mainclass}</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

2
一个属性!伟大的解决方案! - Artur Łysik
将mainClass标签添加到配置中没有任何效果,但设置属性确实起作用了。 - user515655
@user515655,这是Spring Boot Maven插件配置的官方文档,仍然说明mainClass标签应该可以工作https://docs.spring.io/spring-boot/docs/3.0.x-SNAPSHOT/maven-plugin/reference/htmlsingle/#packaging。不知道为什么你无法使用它。 - Eugene Maysyuk
1
第二个解决方案(mainClass)完全有效!谢谢你!! - paultamalunas

56

如果您有多个主类,则需要在每个配置文件中明确配置主类:

<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标签是无用的吗? - Nunyet de Can Calçada
Maven配置文件和Spring配置文件是两个不同的概念。 - Nunyet de Can Calçada
@NuñitodelaCalzada 我知道,但Maven正在引起问题,所以您必须在Maven中解决它。 - Sean Patrick Floyd
1
@NuñitodelaCalzada,问题不在Spring上,而在于Jar本身。 Jar清单只能定义一个主类。 Spring配置文件只在主类内部激活。 - Sean Patrick Floyd
1
仍然是同样的错误,这个解决方案不起作用。 - fsalazar_sch
我正在尝试所描述的方法,但它不起作用:https://stackoverflow.com/q/76807834/283837。也许有人可以告诉我是否做错了什么? - Simeon Leyzerzon

19
为了消除Spring Boot应用的入口点歧义,您可以将以下指令添加到Gradle构建文件中。

为了消除Spring Boot应用的入口点歧义,您可以将以下指令添加到Gradle构建文件中。

springBoot {
    mainClassName = 'your.org.bla.TestKt'
}

5
谢谢指引。看起来现在只需要使用mainClass。请查看文档:https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/#packaging-executable.configuring.main-class - Florian Waibel

14

有时在执行 mvn install 命令之前未执行 mvn clean 命令,就会出现此错误。


2
Diddo for Gradle。当项目已经构建一次并更改包名称时,可能会出现此情况。在这种情况下,清理操作可以奏效。 - Claus
1
运行得非常好。包重构已完成,但未进行清理。 - Francis Raj

12

或者在插件配置中直接硬编码主类。

        <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>

这对我来说不起作用,我认为<confguration>必须与<groupId>和<artifactId>处于同一级别。@EugeneMaysyuk的答案到目前为止是最简洁和完整的。 - Adel Ben Hamadi

10

从命令行可以使用以下命令:

... -Dstart-class=com.your.package.application.BookApplication

这正是我在寻找的。你在哪里找到的? - YogendraR

5
[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] 

出现以下错误的可能原因之一是代码中存在多个main方法,Spring Boot只允许在同一项目中的所有类中有一个main方法。

3
<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>

配置元素必须在插件元素内部!


3

如果你有一个Spring Boot应用程序,通常只有一个带有@SpringBootApplication注释的主类。如果在应用程序中添加另一个main方法,Gradle构建过程会变得混乱。因此,请在build.gradle文件的根级别添加以下内容

apply plugin: 'application'
mainClassName = 'packageNameAfter.srcMainJavaFolder.YourClassName'

1
我曾遇到同样的错误。我将包含main方法的应用程序类foo.java重命名为bar.java,然后进行了清理和更新。因此,我只有一个main方法。
当我删除目标文件夹下旧的生成类foo.class时,该错误消失了。

1
一个类似的解决方案对我也起作用了——我在Mac上使用Grails,所以只需要运行./gradlew clean就可以了。 - Tracy Logan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接