如何使用 spring-boot-maven 插件配置不同 main 入口?

362 天前
 lchqfnu

chatgpt 告诉我使用<executions>指定多个<execution>配置不同的 mainClass 来实现配置多入口分别构建 jar 包。

以下是示例:

<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <id>default-cli</id> <configuration> <mainClass>com.example.MainClass1</mainClass> </configuration> </execution> <execution> <id>second-entry-point</id> <goals> <goal>repackage</goal> </goals> <configuration> <mainClass>com.example.MainClass2</mainClass> <classifier>second</classifier> </configuration> </execution> </executions> </plugin> </plugins> </build> --------------- 按照以上配置方式,运行报错“Unable to find a single main class from the following candidates”,原因是项目中有两个 main Class. 而无法实现单一项目分开打包,请教有何解决方法? 谢谢!
1007 次点击
所在节点    Java
7 条回复
gongshw
362 天前
方案一:使用多个子模块

方案二:在 pom.xml 中使用变量,并在执行 maven 命令时传递
lchqfnu
362 天前
@gongshw 感谢兄弟!第一个方案有想过,项目不复杂,一旦使用子模块,管理起来显得繁琐。第二个方案,是指的 maven 插件设置不同的 phase 来出发不同配置的 goal 吗?
crazyweeds
362 天前
你不好好写,我也不好好写,毕竟我是复制你的,哈哈。
<properties>
<mainClass>子模块配置这个<mainClass>
<properties>


<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <id>default-cli</id> <configuration> <mainClass>com.example.MainClass1</mainClass> </configuration> </execution> <execution> <id>second-entry-point</id> <goals> <goal>repackage</goal> </goals> <configuration> <mainClass>${mainClss}</mainClass> <classifier>second</classifier> </configuration> </execution> </executions> </plugin> </plugins> </build>
lchqfnu
362 天前
@crazyweeds 首先,感谢!但是我按你的方式尝试,还是报同样的错误。
crazyweeds
362 天前
@lchqfnu 这是 parent 模块

<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot-dependencies.version}</version>
<configuration>
<mainClass>${mainClass}</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>

这是子模块:

<properties>
<mainClass>cloud.pibox.ProxyApplication</mainClass>
</properties>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
gongshw
362 天前
@lchqfnu

pom.xml 中可以使用变量, 比如
<mainClass>${applicationMainClass}</mainClass>

然后执行命令是用 -D 传递变量参数:
maven install -DapplicationMainClass=com.example.MainClass1
maven install -DapplicationMainClass=com.example.MainClass2

细节还需要再打磨,比如生成的 jar 文件文件名应该也可以由参数决定
lchqfnu
362 天前
经过排查,<plugin>下首先要使用<configuration><mainClass>指定一个 main 方法,然后再使用 excutions 增加其他 mainClass 的打包方式。chatgpt 给的解决方案是错的,但稍加修改即可用。

-----

结帖,谢谢各位。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/940197

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX