带参数的 Maven Spring 引导运行调试

通常我使用以下命令运行 Spring Boot 应用程序:

mvn spring-boot:run -Drun.arguments=--server.port=9090 \
-Dpath.to.config.dir=/var/data/my/config/dir

我想设置自定义端口调试,这样我就可以从 Eclipse 连接。当我从例子 https://docs.spring.io/spring-boot/docs/1.1.2.RELEASE/maven-plugin/examples/run-debug.html中添加参数时

mvn spring-boot:run -Drun.arguments=--server.port=9090 \
-Dpath.to.config.dir=/var/data/my/config/dir \
-Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8787"

它工作,但其他参数,如 server.portpath.to.config.dir不再识别,我得到例外,如:

org.springframework.beans.factory.BeanDefinitionStoreException: Failed
to parse configuration class [com.my.app.Controller]; nested exception
is java.lang.IllegalArgumentException: Could not resolve placeholder
'path.to.config.dir' in string value
file:///${path.to.config.dir}/some.properties"

问题 : 如何运行所有的参数?

117848 次浏览

您注意到的行为和变化是因为您开始使用 jvmArguments选项而发生的:

应该与用于运行应用程序的分支进程关联的 JVM 参数。在命令行上,确保在引号之间包装多个值。

默认情况下,当使用它时,Spring Boot Maven 插件也会分叉执行,如 fork选项所描述的:

标志,以指示是否应分叉运行进程。默认情况下,只有在指定了代理或 jvmArguments时才使用进程分叉。

因此,jvmArguments的使用也激活了插件执行的 fork 模式。通过分叉,您实际上不会拾取从命令行传递的其他 -D参数。

解决方案 : 如果您想使用 jvmArguments,那么将所有必需的参数传递给它。

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8787 -Dserver.port=9090 -Dpath.to.config.dir=/var/data/my/config/dir"

编辑22/09/2020 还可以检查@Stephane 的另一个答案来补充这个答案(参数前缀)

注意,从 spring-boot 2.0开始,名称已经发生了变化:

Https://docs.spring.io/spring-boot/docs/2.0.2.release/maven-plugin/run-mojo.html

  • Spring-boot. run.jvmArguments -> spring-boot. run.jvmArguments
  • Run.arguments -> spring-boot. run.arguments

参数名称必须像在 -Dspring-boot.run.jvmArgument中那样以 spring-boot.作为前缀

在我运行 Spring Boot 2.0.3时,Spring Boot 文档为我提供了解决方案

mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"

还有一个问题,如果 pom.xml 定义了 jvmArguments,那么命令行参数将被忽略

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jvmArguments>-Xmx2048m -XX:NativeMemoryTracking=summary --enable-preview</jvmArguments>
</configuration>
</plugin>

如果我想添加调试属性到其中一个启动程序

-Dspring-boot.run.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8282"

没用的。

跟随 Redhat 文档

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$PORT_NUMBER"

使用 Powershell 从 Maven 命令行重写 spring-boot 属性:

  • SpringBoot2.4.4
  • Maven 3.6.3
  • Powershell Windows 10

这对我很有效:

mvn spring-boot:run  -D"spring-boot.run.jvmArguments"="-Dimport.dataset.list=importpb"