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

Java 如何告诉Spring Boot可执行jar使用哪个主类?,java,spring,maven,executable-jar,spring-boot,Java,Spring,Maven,Executable Jar,Spring Boot,我的项目有多个类使用main方法。我如何告诉Spring Boot Maven插件它应该使用哪些类作为主类?在pom中添加start类: 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 com

我的项目有多个类使用
main
方法。我如何告诉Spring Boot Maven插件它应该使用哪些类作为主类?

在pom中添加start类:

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

com.mycorp.starter.HelloWorldApplication


org.springframework.boot
springbootmaven插件
com.mycorp.starter.HelloWorldApplication

如果不使用spring boot starter父pom,则从:


org.springframework.boot
springbootmaven插件
1.1.3.1发布
my.package.MyStartClass
拉链
重新包装
对于使用Gradle(而不是Maven)的用户:


如果在pom中使用spring boot starter父级,只需将以下内容添加到pom中:

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

org.springframework.boot


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

我已经重命名了我的项目,它仍然在构建路径上找到旧的
应用程序
类。我在“build”文件夹中删除了它,一切都很好。

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

springBoot {
    mainClass = "com.example.Main"
}

org.springframework.boot
springbootmaven插件
myPackage.HelloWorld
maven编译器插件
真的
D:\jdk1.8\bin\javaw.exe

自Spring Boot 1.5以来,您可以完全忽略pom或build.gradle中容易出错的字符串文字。重新打包工具(通过maven或gradle插件)将为您选择带有
@SpringBootApplication
注释的工具。(有关详细信息,请参阅本期:)

对于使用Gradle(而不是Maven)的用户,请参考:

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

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


我们已经在Java1.9和SpringBoot 1.5.x中看到了这个问题,当时并没有显式指定main类


使用Java 1.8,它可以在没有显式属性的情况下查找主类,“mvn包”工作正常。

如果您使用的是Grade,则可以应用而不是“Java”插件。这允许在不使用任何Spring Boot Gradle插件任务的情况下指定如下主类

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

一个很好的好处是,可以使用gradle自动配置的类路径运行应用程序。该插件还将应用程序打包为TAR和/或ZIP,包括特定于操作系统的启动脚本。

java-cp myjar.jarMyClass@Evgeni:这是一个运行时标志。没那么远。它无法生成。无需禁用任何内容。或者我遗漏了什么?请注意,如果您使用spring boot starter父pom,这个答案是正确的。在这种情况下,“start class”属性应用于spring boot maven插件的“mainClass”配置参数(如果不使用starter,您可以直接执行)。感谢@ludo_rj,我发现这也有效:
mvn clean package-Dstart class=com.foo.Application
,如果想要动态地指定使用哪个主类,那么@zhugouwei提到的参数对于Spring Boot Maven插件也是有效的:
mvn Spring Boot:run-Dstart class=com.foo.Application
。只有当您没有在pom的pluginBoth中指定main类时,这才有效,因为它对我不起作用。我还认为这是一个“和”而不是一个or?我在MANIFEST.MF中正确地看到了Start类,但是spring启动了一个不同的带注释的@SpringBootApplication主类。实际上,我需要这个类来引导一些东西,所以我不太喜欢更改注释。简单地删除它无论如何都不起作用。Spring似乎启动了它找到的第一个main()。我使用的是spring boot starter父级2.2.0.M3。我发现,在复制了.java类的包要求后,这个解决方案可以在不修改pom.xml的情况下工作。我尝试使用您在我的Multimultiules maven项目中提到的spring boot maven插件配置,由几个SpringBoot项目组成,包括SpringBoot作为BOM依赖项,它的工作非常出色。关于maven编译器插件,我没有指定任何内容,因为我不希望POM依赖于平台。Maven自动分叉,所以我认为您可以忽略此配置。Spring Boot 2.x给出了一个错误
无法为org.springframework.Boot.gradle.dsl.SpringBootExtension类型的对象设置未知属性“mainClass”
。答案如下:main class config可以omitted@zhaozhi你能解释一下原因/方式吗?
springBoot {
    mainClass = "com.example.Main"
}
<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>
bootJar {
    mainClass = 'com.example.ExampleApplication'
}
springBoot {
    mainClass = 'com.example.ExampleApplication'
}
plugins {
  id 'org.springframework.boot' version '2.3.3.RELEASE'
  id 'io.spring.dependency-management' version '1.0.10.RELEASE'
  id 'application'
}
application {
  mainClassName = 'com.example.ExampleApplication'
}