目前在我们的应用程序中,我们有多个主类,并分别使用以下命令单独执行它们。
java -Xmx1024M -cp /path/to/jar/MyApp.jar com.....MyAppMain1
java -Xmx1024M -cp /path/to/jar/MyApp.jar com.....MyAppMain2
java -Xmx1024M -cp /path/to/jar/MyApp.jar com.....MyAppMain3
现在尝试使用 Spring Boot。我们要做什么才能实现同样的目标?
在pom.xml中有
…….
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
</parent>
……..
使用 Spring Boot 并执行命令
java -Xmx1024M -cp /path/to/jar/MyApp.jar com.....MyAppMain1
出现错误 [错误] 无法在项目 MyApp 上执行目标 org.codehaus.mojo:exec-maven-plugin:1.6.0:java (default-cli):目标 org.codehaus.mojo 的参数“mainClass”:exec-maven-插件:1.6.0:java丢失或无效
Spring Boot给出了几种方式:
java -cp app.jar -Dloader.main=com.company.MyAppMain1 org.springframework.boot.loader.PropertiesLauncher
pom.xml
<properties>
部分:<properties>
<start-class>com.company.MyAppMain1</start-class>
</properties>
请注意,仅当您在
spring-boot-starter-parent
中使用 <parent>
作为 pom.xml
时,才会评估此属性。
spring-boot-maven-plugin
配置主类:<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>${start-class}</mainClass>
</configuration>
</plugin>
</plugins>
</build>
注意:插件配置可以在 Maven 配置文件中执行,因此通过激活不同的配置文件,您将运行具有不同主类的应用程序。
以下是运行 Spring Boot 主类的不同方式:
1。 Spring Boot 应用程序中的单个主类
A.通过
<properties>
部分
<properties>
<start-class>com.company.MyAppMain1</start-class>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
注:
start-class
的 properties
部分使用 pom.xml
属性时,我们不需要将显式值传递给插件 spring-boot-maven-plugin
B.通过自定义属性
<custom-mainClass>
<properties>
<custom-mainClass>com.company.MyAppMain1</custom-mainClass>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>${custom-mainClass}</mainClass>
</configuration>
</plugin>
</plugins>
</build>
注:
自定义属性
custom-mainClass
可以硬编码在属性文件内,如上所述1.B
使用构建传递maven属性,如下所述:
mvn -U clean install -Dcustom-mainClass=com.company.MyAppMain1
C.通过插件
spring-boot-maven-plugin
部分中的硬编码值
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.company.MyAppMain1</mainClass>
</configuration>
</plugin>
</plugins>
</build>
2。 Spring Boot应用程序中的多个主类
A.通过
org.springframework.boot.loader.PropertiesLauncher
第1步:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>
org.springframework.boot.loader.PropertiesLauncher
</mainClass>
</configuration>
</plugin>
</plugins>
</build>
第2步:使用以下命令启动应用程序
java -Dloader.main=com.company.MyAppMain1 -jar myapp.jar
或
java -cp myapp.jar -Dloader.main=com.company.MyAppMain1 org.springframework.boot.loader.PropertiesLauncher
注:
-Dloader.main
作为Java VM参数在应用程序启动期间传递动态主类,如step 2
B.通过自定义属性
<custom-mainClass>
<properties>
<custom-mainClass>com.company.MyAppMain1</custom-mainClass>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>${custom-mainClass}</mainClass>
</configuration>
</plugin>
</plugins>
</build>
注:
使用构建传递maven属性,如下所述:
mvn -U clean install -Dcustom-mainClass=com.company.MyAppMain1
这也是一个动态的
main-class
,但它只在 Maven 构建期间有效。不适用于应用程序启动期间,如第 step 2
部分的
2.A
所示
使用 Spring boot 3.2.x(发行说明)
<properties>
<start-class>org.springframework.boot.loader.launch.PropertiesLauncher</start-class>
</properties>
...
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>${start-class}</mainClass>
</configuration>
</plugin>
使用动态主类名称运行 jar
java -jar -Dloader.main=com.myapp.Main1 -jar myapp.jar
java -jar -Dloader.main=com.myapp.Main2 -jar myapp.jar