如何告诉Spring Boot可执行jar使用哪个主类?


182
Execution default of goal 
org.springframework.boot:spring-boot-maven-plugin:1.0.1.RELEASE:repackage 
failed: 
Unable to find a single main class from the following candidates

我的项目有多个使用main方法的类。如何告诉Spring Boot Maven插件应将其用作主类?


1
java -cp myjar.jar MyClass
Evgeni Dimitrov

4
@Evgeni:那是一个运行时标志。它没有那么远。它无法建立。
Thilo

Answers:


268

在pom中添加您的入门班:

<properties>
    <!-- The main class to start by executing java -jar -->
    <start-class>com.mycorp.starter.HelloWorldApplication</start-class>
</properties>

要么

<build>
<plugins>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>             
        <configuration>    
            <mainClass>com.mycorp.starter.HelloWorldApplication</mainClass>
        </configuration>
    </plugin>
</plugins>
</build>

无需禁用任何功能。还是我错过了什么?
Dave Syer 2014年

29
请注意,如果您使用spring-boot-starter-parent pom,则此答案是正确的。在这种情况下,“ start-class”属性将应用于spring-boot-maven-plugin的“ mainClass”配置参数(如果您不使用启动器,则可以直接执行此操作)。
Dave Syer 2014年

18
感谢@ludo_rj,我发现这也可以:mvn clean package -Dstart-class=com.foo.Application如果要动态指定使用哪个主类
zhuguowei

2
要添加的另一件事是,@zhuguowei提到的参数对于Spring Boot Maven插件也有效mvn spring-boot:run -Dstart-class=com.foo.Application。仅当您尚未在pom的插件中指定mainClass时,此方法才有效
Gerardo Roza

两者都不适合我。我还认为这是“与”而不是或?我在MANIFEST.MF中正确看到了Start-Class :,但是spring启动了另一个带注释的@SpringBootApplication主类。我实际上需要该类来引导一些东西,因此我真的不喜欢更改注释。简单地删除它无论如何都行不通。Spring似乎开始了它找到的第一个main()。我正在使用spring-boot-starter-parent 2.2.0.M3。
Angel O'Sphere,


70

如果您不使用spring-boot-starter-parent pom,请从Spring文档中获取

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>1.1.3.RELEASE</version>
    <configuration>
        <mainClass>my.package.MyStartClass</mainClass>
        <layout>ZIP</layout>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

主类配置可以省略
zhaozhi19

@zhaozhi您能解释为什么/如何吗?
雷诺

19

对于那些使用Gradle(而不是Maven)的人,请参考这里

也可以使用任务的mainClassName属性显式配置主类:

bootJar {
    mainClassName = 'com.example.ExampleApplication'
}

另外,可以使用Spring Boot DSL的mainClassName属性在项目范围内配置主类名称:

springBoot {
    mainClassName = 'com.example.ExampleApplication'
}

15

如果您在pom中使用spring-boot-starter-parent,则只需将以下内容添加到pom中:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

然后做你的MVN包。

请参阅此Spring文档页面

这里要提到的一个非常重要的方面是目录结构必须是src / main / java / nameofyourpackage


复制.java类的软件包要求后,我发现该解决方案无需修改pom.xml就可以工作。

6

我在pom.xml中尝试了以下代码,它对我有用

<build>
<plugins>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
            <mainClass>myPackage.HelloWorld</mainClass> 
        </configuration>
    </plugin>
    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <fork>true</fork>
            <executable>D:\jdk1.8\bin\javaw.exe</executable>
        </configuration>
    </plugin>
</plugins>


我尝试使用您在多模块Maven项目中提到的spring-boot-maven-plugin配置,该配置由多个Spring引导项目组成,并且包括Spring Boot作为BOM依赖项,它的工作原理很吸引人。关于maven-compiler-plugin,我没有指定任何内容,因为我不希望依赖于POM平台。Maven自动分叉,因此我认为您可以忽略此配置。
Cheloute


3

我已经重命名了项目,但仍在Application构建路径中找到旧类。我将其删除在“生成”文件夹中,一切都很好。


1

在未明确指定main-class的情况下,Java 1.9和SpringBoot 1.5.x已经看到了此问题。

使用Java 1.8,它可以找到没有显式属性的主类,并且'mvn package'可以正常工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.