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