使用Maven和Spring Boot运行调试时带参数

82
通常我会使用以下命令来运行我的Spring Boot应用程序:
mvn spring-boot:run -Drun.arguments=--server.port=9090 \
   -Dpath.to.config.dir=/var/data/my/config/dir

我想设置自定义端口进行调试,这样我就可以从eclipse连接。当我从示例中添加参数时Spring Boot Maven Plugin
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.port或者path.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"

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

在我的情况下,确切的解决方案是调用: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" - wbk
1
链接无法使用... - powder366
6个回答

90
参数名称必须以spring-boot.为前缀,例如-Dspring-boot.run.jvmArgument调试应用程序部分的Spring Boot参考文档中,提供了解决方案,因为我正在运行Spring Boot 2.0.3
mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"

7
这应该是被接受的答案,其他的回答都没有起作用。 - abarazal
7
这个答案对大多数情况适用,但在PowerShell中对我无效,我收到的信息是:“未找到前缀为'.run.jvmArguments=-Xdebug -Xrunjdwp'的插件”。 - Alex
3
谢谢。它起作用了 mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Dserver.port=8090 -Dspring.profiles.active=local" spring-boot-maven-plugin=2.2.5.RELEASE - Haran
1
当我在Windows 11上运行它时,我遇到了Alex上面提到的相同错误。 - thangchung
mvn spring-boot:run "-Dspring-boot.run.jvmArguments=-Dserver.port=8080" - 这对我有用(Spring-boot - 3.0.1) - skyho
显示剩余2条评论

52

您注意到的行为和变化是因为您开始使用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"

-- 编辑于 2020年9月22日 请查看@Stephane提供的答案(参数前缀)以补充此答案。


1
注意:这个方法可行,但我发现 -Drun.profiles 选项(以及其他以 'run' 开头的选项)需要保持在 jvmArguments 之外。例如:mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Dspring.foo=bar" -Drun.profiles=test - Ryan
你能指引我一份深入的文档,介绍这个东西是如何工作的吗? - powder366
@powder366 你是否已经尝试过上面回答中提到的官方文档?其中包含了示例和目标/选项的描述。你是指Spring Boot特定的文档还是更通用的Maven级别的文档? - A_Di-Matteo
1
我可以通过使用mvn spring boot插件启动Spring应用程序进行调试,但无法设置断点。我想了解调试的工作原理,以便能够理解它...因此正在寻找一些关于此方面的好文章。 - powder366
非常有帮助。谢谢。 - Laran Evans

27
从Spring Boot 2.0.2开始,注意名称已经发生了变化。更多详细信息请查看:
- Spring Boot Maven插件 - spring-boot:run
因此:
- run.jvmArguments -> spring-boot.run.jvmArguments - run.arguments -> spring-boot.run.arguments

2

根据redhat文档,..


根据Red Hat文档,...(具体内容需要在上下文中确定)
mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$PORT_NUMBER"

1

使用Powershell从Maven命令行覆盖spring-boot属性:

  • Spring Boot 2.4.4
  • Maven 3.6.3
  • Windows 10的Powershell

这对我很有用:

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

0

还有一个问题。如果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" 这样是行不通的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接