使用多个主类运行 Spring Boot

问题描述 投票:0回答:3

目前在我们的应用程序中,我们有多个主类,并分别使用以下命令单独执行它们。

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
3个回答
14
投票

Spring Boot给出了几种方式:

  • 指定主类作为系统属性:
java -cp app.jar -Dloader.main=com.company.MyAppMain1 org.springframework.boot.loader.PropertiesLauncher
  • 在 Maven 中配置主类
    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 配置文件中执行,因此通过激活不同的配置文件,您将运行具有不同主类的应用程序。


3
投票

以下是运行 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>

注:

  1. 当我们在
    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>

注:

  1. 自定义属性

    custom-mainClass
    可以硬编码在属性文件内,如上所述1.B

  2. 使用构建传递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

注:

  1. 使用
    -Dloader.main
    作为Java VM参数在应用程序启动期间传递动态主类,如
    step 2
  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>

注:

  1. 使用构建传递maven属性,如下所述:

    mvn -U clean install -Dcustom-mainClass=com.company.MyAppMain1

这也是一个动态的

main-class
,但它只在 Maven 构建期间有效。不适用于应用程序启动期间,如第
step 2
 部分的 
2.A

所示

0
投票

使用 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
© www.soinside.com 2019 - 2024. All rights reserved.