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个回答

0

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

如果您确实需要所有具有主方法的类,请明确指出哪个类将在应用程序启动时引导,并在pom中提及它。


0

你不需要使用配置文件来避免错误。你可以像这样配置 spring-boot-maven-plugin:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.6.3</version> <!-- use the corresponding version of your spring boot -->
        <executions>
            <execution>
                <id>repackage-application1</id>
                <phase>package</phase>
                <goals>
                    <goal>repackage</goal>
                </goals>
                <configuration>
                    <mainClass>com.yourpackage1.Application1</mainClass>
                    <finalName>app1</finalName>
                    <outputDirectory>target/apps</outputDirectory>
                </configuration>
            </execution>
            <execution>
                <id>repackage-application2</id>
                <phase>package</phase>
                <goals>
                    <goal>repackage</goal>
                </goals>
                <configuration>
                    <mainClass>com.yourpackage2.Application2</mainClass>
                    <finalName>app2</finalName>
                    <outputDirectory>target/apps</outputDirectory>
                </configuration>
            </execution>
        </executions>
    </plugin>

这将在您的目标文件夹中创建app1.jar和app2.jar。

重要提示:如果您继承了spring-boot-starter-parent,它会默认执行 spring-boot-maven-plugin,并期望只有一个Spring应用程序。如果您在一个模块中有两个应用程序,则该默认配置将因错误“无法找到单个主类”而失败。为修复构建问题,您需要在父POM中注销默认插件执行。一种方法是在父POM中排除插件,您可以查看maven exclude plugin defined in parent pom(我自己没有尝试)


0

我故意定义了两个@SpringBootApplication。为了避免在Gradle中出现冲突,我定义了额外的任务,并使用替代的mainClass

tasks.named("bootRun", BootRun.class).configure {
    mainClass = "com.evil.App"
}
tasks.named("bootJar", BootJar.class).configure {
    mainClass = "com.evil.App"
}

tasks.register("bootRunH2", BootRun.class) {
    group = bootRun.group
    description = bootJar.description
    mainClass = "com.evil.H2App"
}
tasks.register("bootJarH2", BootJar.class) {
    group = bootJar.group
    description = bootJar.description
    targetJavaVersion = bootJar.targetJavaVersion
    classpath = bootJar.classpath
    mainClass = "com.evil.H2App"
}

这样,您可以拥有尽可能多的不同的bootRun/bootJar任务。


0
我正在构建一个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/


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