Maven spring 启动 运行 使用参数进行调试
Maven spring boot run debug with arguments
通常我 运行 使用以下命令启动我的 Spring 应用程序:
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.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"
问题:我如何 运行 包含所有参数?
您注意到的行为和变化正在发生,因为您开始使用 jvmArguments
选项:
JVM arguments that should be associated with the forked process used to run the application. On command line, make sure to wrap multiple values between quotes.
默认情况下,当使用它时,Spring Boot Maven 插件也会分叉它的执行,如 fork
选项所述:
Flag to indicate if the run processes should be forked. By default process forking is only used if an agent or jvmArguments
are specified.
因此,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
- run.jvmArguments -> spring-boot.run.jvmArguments
- run.arguments -> spring-boot.run.arguments
参数名称必须以 spring-boot.
为前缀,如 -Dspring-boot.run.jvmArgument
Spring Boot documentation 为我提供了解决方案,因为我 运行 Spring Boot 2.0.3
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 documentation ..
mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$PORT_NUMBER"
使用 Powershell 从 Maven 命令行覆盖 spring-boot 属性:
- Spring 启动 2.4.4
- 行家 3.6.3
- Powershell Windows 10
这对我有用:
mvn spring-boot:run -D"spring-boot.run.jvmArguments"="-Dimport.dataset.list=importpb"
通常我 运行 使用以下命令启动我的 Spring 应用程序:
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.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"
问题:我如何 运行 包含所有参数?
您注意到的行为和变化正在发生,因为您开始使用 jvmArguments
选项:
JVM arguments that should be associated with the forked process used to run the application. On command line, make sure to wrap multiple values between quotes.
默认情况下,当使用它时,Spring Boot Maven 插件也会分叉它的执行,如 fork
选项所述:
Flag to indicate if the run processes should be forked. By default process forking is only used if an agent or
jvmArguments
are specified.
因此,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
- run.jvmArguments -> spring-boot.run.jvmArguments
- run.arguments -> spring-boot.run.arguments
参数名称必须以 spring-boot.
为前缀,如 -Dspring-boot.run.jvmArgument
Spring Boot documentation 为我提供了解决方案,因为我 运行 Spring Boot 2.0.3
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 documentation ..
mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$PORT_NUMBER"
使用 Powershell 从 Maven 命令行覆盖 spring-boot 属性:
- Spring 启动 2.4.4
- 行家 3.6.3
- Powershell Windows 10
这对我有用:
mvn spring-boot:run -D"spring-boot.run.jvmArguments"="-Dimport.dataset.list=importpb"