使用exec-maven-plugin运行spring boot应用

Maven 项目中一般使用exec-maven-plugin运行项目中有main方法的类,运行目标为exec:java时常用的参数简单说明如下:

  • exec.mainClass,运行时指定main方法所在 Java 类的完全限定名
  • exec.args,给main方法的参数

exec-maven-plugin详细的使用帮助可以用如下命令查看:

 mvn exec:help -Ddetail=true

spring boot 运行 exec-maven-plugin 碰到的问题

如果没有在spring-boot项目的pom.xml文件中指定exec-maven-plugin配置中configurationmainClass的值,就会提示mainClass找不到的错误:

 mvn clean compile exec:java -Dexec.mainClass="com.example.Main"[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.6.0:java (default-cli) on project spring-boot-shiro:The parameters 'mainClass' for goal org.codehaus.mojo:exec-maven-plugin:1.6.0:java are missing or invalid -> [Help 1]

这让人很奇怪,这个插件最基本的用法就是这样的,明确指定了exec.mainClass却提示参数没有设置,新建了干净的项目测试都是正常的,看来是spring-boot在这个插件上做了什么特定的配置。使用以下命令检查当前 Maven 项目的effective pom中此插件的配置情况:

 mvn help:effective-pom

以上命令运行输出中关于exec-maven-plugin插件的配置如下,可以从输出结果中看到spring-boot已经为此插件指定了mainClass,因为这个配置,所以程序运行的时候是去找名为start-class的系统变量,当然会抛出如上missing or invalid的错误。

<plugin>    <groupId>org.codehaus.mojo</groupId>    <artifactId>exec-maven-plugin</artifactId>    <version>1.5.0</version>    <configuration>        <mainClass>${start-class}</mainClass>    </configuration></plugin>

正确运行方法一

可以在spring-boot项目的pom.xml中设置start-class属性,指定要运行的main方法所在类的完全限定名:

<properties>    <start-class>com.example.Main</start-class></properties>

正确运行方法二

上面这样硬编码的方式非常不灵活,最好是在运行时再指定start-class这个系统变量:

 mvn exec:java -Dstart-class="com.example.Main"

问题原因说明

原因上面也已经提到,因为spring-boot在插件依赖配置里已经为其指定了一个mainClass,而exec-maven-plugin这个插件如果配置过mainClass之后,命令行指定的-Dexec.mainClass=com.example.Main这个参数就没有用了,而运行时又找不到start-class这个系统属性,于是就抛出上面的错误。从这点来说,exec-maven-plugin命令行中的配置不能覆盖pom.xml中的插件配置,还是不够灵活些。

References

  1. Exec usage
  2. Spring boot and maven exec plugin issue