Maven spring boot使用参数运行调试

通常我用命令运行我的Spring Boot应用程序:

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

我想设置自定义端口进行调试,所以我可以从eclipse连接。 当我从示例http://docs.spring.io/spring-boot/docs/1.1.2.BUILD-SNAPSHOT/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" 

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

您注意到的行为和更改正在发生,因为您开始使用jvmArguments选项:

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

默认情况下,使用它时,Spring Boot Maven插件也将执行fork,如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" 

请注意,从spring-boot 2.0名称已更改。 有关详细信息,请查看:

https://docs.spring.io/spring-boot/docs/2.0.2.RELEASE/maven-plugin/run-mojo.html

  • run.jvmArguments – > spring-boot.run.jvmArguments
  • run.arguments – > spring-boot.run.arguments

参数名称必须以spring-boot.为前缀spring-boot.-Dspring-boot.run.jvmArgument

当我运行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"