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

时间:2017-03-16 17:09:53

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

我使用Spring Initializer,嵌入式Tomcat,Thymeleaf模板引擎生成了Spring Boot Web应用程序。使用的技术: 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]

12 个答案:

答案 0 :(得分:24)

如果您有多个主要课程,则需要在每个配置文件中明确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

答案 1 :(得分:8)

或者简单地对插件配置中的主类进行硬编码。

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:3)

有时您在未安装mvn的情况下进行mvn安装时会出现此错误。

答案 4 :(得分:3)

如果您有一个Spring Boot应用程序,则通常只有一个具有@SpringBootApplication的主类;如果您在应用程序中的某个位置添加了另一个main方法,则gradle构建过程会很混乱。因此,在您的build.gradle文件的根级别

添加以下内容
apply plugin: 'application'
mainClassName = 'packageNameAfter.srcMainJavaFolder.YourClassName'

答案 5 :(得分: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引导只允许同一个项目中所有类的一个主方法。

答案 6 :(得分:2)

通过start-class属性定义单个主类

String url = "http://www.google.com";
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(browserIntent);

或者,在spring-boot-maven-plugin中定义主类

<properties>
      <start-class>com.may.Application</start-class>
</properties>

答案 7 :(得分:1)

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

Element configuration 必须在 plugin 里面!

答案 8 :(得分:0)

如果您的public static void main(String[] args)有多个类,请检查您的应用程序。删除不需要的那一个。特别是,如果您使用https://start.spring.io/生成项目,则它带有一个带有main方法的类。

如果确实需要使用main方法的所有类,则只需在pom中提及它,就明确地指出在应用程序启动时要进行boos捕获的类。

答案 9 :(得分:0)

我有同样的错误。我已经将包含main的Application类从foo.java重命名为bar.java,进行了清理和更新。所以我只有一个主线。

当我删除目标文件夹下的旧生成类foo.class时,错误消失了。

答案 10 :(得分:0)

您可以在命令行中使用

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

答案 11 :(得分:0)

我正在构建一个Spring Boot库项目,因此不需要主入门类, 因此在使用maven构建项目时遇到了相同的问题,因此我删除了maven插件以成功编译

#will be used in an apply statement for a column in dataframe
def parser(x):
    x_list = x.split()
    if " recurring payment authorized on " in x and x_list[-1]!= "on":
         return x_list[x_list.index("on")+1]
     elif " recurring payment" in x:
         return ' '.join(x_list[:x_list.index("recurring")])
     else:
         return None

有关更详细的示例。在这里找到 https://spring.io/guides/gs/multi-module/