Maven spring boot run debug with arguments
Asked Answered
G

6

82

Usually I'm running my Spring Boot application with command:

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

I want to set custom port to debug, so I can connect from eclipse. When I add arguments from example 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"

it works but other arguments like server.port or path.to.config.dir are no longer recognized and I get exception like:

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"

Question: How I can run with all arguments?

Glennglenna answered 25/3, 2016 at 10:12 Comment(2)
Exact solution in my case was to call: 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" Glennglenna
Link not working...Diligence
U
52

The behavior and the change you notice is happening because you started using the jvmArguments option:

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.

By default, when using it, the Spring Boot Maven plugin will also fork its execution, as described by the fork option:

Flag to indicate if the run processes should be forked. By default process forking is only used if an agent or jvmArguments are specified.

Hence, the usage of jvmArguments also activated the fork mode of the plugin execution. By forking, you are actually not picking up the others -D arguments passed from command line.

Solution: if you want to use the jvmArguments, then pass all of the required arguments to it.

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"

-- Edit 22/09/2020 Check also the other answer from @Stephane to complent this answer (prefix of parameters)

Uela answered 25/3, 2016 at 10:21 Comment(4)
Note: This worked, but I found that the -Drun.profiles option (and I'd guess other options starting with 'run') need to be kept outside the jvmArguments bit. eg: mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Dspring.foo=bar" -Drun.profiles=testTimelag
Can you direct me to an in-depth document how this stuff works?Diligence
@Diligence did you already try with the official documentation, already pointed by the answer above? There are examples and description of goals/options. Do you refer to Spring Boot specific documents or to more generic Maven-level documents?Uela
I can debug starting the Spring application, running it with the mvn spring boot plugin I can't breakpoint. I like to understand how debugging works under the hood so I can make sense of it all... therefore looking for some nice articles about it.Diligence
R
94

The parameter name has to be prefixed with spring-boot. as in -Dspring-boot.run.jvmArgument

The Spring Boot Reference Documentation, in the Debug the Application section, provided me the solution as I'm running Spring Boot 2.0.3

mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"
Result answered 25/7, 2018 at 7:59 Comment(7)
This should be the accepted answer, the other answers didn't workFinsteraarhorn
This answer works for most, however it is not working for me in PowerShell, the message I get is: No plugin found for prefix '.run.jvmArguments=-Xdebug -Xrunjdwp'Navigate
Thanks. It worked mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Dserver.port=8090 -Dspring.profiles.active=local" spring-boot-maven-plugin=2.2.5.RELEASESuzannasuzanne
I have got the same error that Alex mentioned above when running it on Windows 11Holograph
@Navigate running the command in IntelliJ I had the same "No plugin found for prefix..." error, but it works for me from command line.Landside
mvn spring-boot:run "-Dspring-boot.run.jvmArguments=-Dserver.port=8080" - It's work for me (Spring-boot - 3.0.1)Orgasm
for selecting the active spring-boot profiles, use: -Dspring-boot.run.profiles=localFoch
U
52

The behavior and the change you notice is happening because you started using the jvmArguments option:

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.

By default, when using it, the Spring Boot Maven plugin will also fork its execution, as described by the fork option:

Flag to indicate if the run processes should be forked. By default process forking is only used if an agent or jvmArguments are specified.

Hence, the usage of jvmArguments also activated the fork mode of the plugin execution. By forking, you are actually not picking up the others -D arguments passed from command line.

Solution: if you want to use the jvmArguments, then pass all of the required arguments to it.

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"

-- Edit 22/09/2020 Check also the other answer from @Stephane to complent this answer (prefix of parameters)

Uela answered 25/3, 2016 at 10:21 Comment(4)
Note: This worked, but I found that the -Drun.profiles option (and I'd guess other options starting with 'run') need to be kept outside the jvmArguments bit. eg: mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Dspring.foo=bar" -Drun.profiles=testTimelag
Can you direct me to an in-depth document how this stuff works?Diligence
@Diligence did you already try with the official documentation, already pointed by the answer above? There are examples and description of goals/options. Do you refer to Spring Boot specific documents or to more generic Maven-level documents?Uela
I can debug starting the Spring application, running it with the mvn spring boot plugin I can't breakpoint. I like to understand how debugging works under the hood so I can make sense of it all... therefore looking for some nice articles about it.Diligence
C
27

Notice that from Spring Boot 2.0.2 names have changed. For more details check out:

Therefore:

  • run.jvmArguments -> spring-boot.run.jvmArguments
  • run.arguments -> spring-boot.run.arguments
Cloak answered 4/6, 2018 at 9:55 Comment(0)
E
2

One more issue is there. If pom.xml defines jvmArguments then command line arguments are ignored

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

If I would like to add debug properties to one of launchers

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

It is not gonna work.

Eulogistic answered 19/5, 2021 at 8:51 Comment(0)
A
2

Following redhat documentation ..

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$PORT_NUMBER"
Amphibology answered 7/6, 2021 at 17:42 Comment(0)
T
1

Override spring-boot properties from Maven command line using Powershell:

  • Spring Boot 2.4.4
  • Maven 3.6.3
  • Powershell Windows 10

This worked for me:

mvn spring-boot:run  -D"spring-boot.run.jvmArguments"="-Dimport.dataset.list=importpb"
Thibault answered 21/6, 2021 at 13:46 Comment(1)
ho to implement this in netbeans?Ankerite

© 2022 - 2024 — McMap. All rights reserved.