Polish "Add system properties support using explicit configuration tag"

Closes gh-10741
pull/12955/head
Stephane Nicoll 7 years ago
parent ba34bf6470
commit 03539d8e16

@ -2,6 +2,6 @@ import static org.junit.Assert.assertTrue
def file = new File(basedir, "build.log")
assertTrue file.text.contains("I haz been run")
assertTrue file.text.contains("Fork mode disabled, ignoring JVM argument(s) [-Dfoo=bar -Dproperty1=value1 -Dproperty2]")
assertTrue file.text.contains("Fork mode disabled, ignoring JVM argument(s) [-Dproperty1=value1 -Dproperty2 -Dfoo=bar]")
assertTrue file.text.contains("Fork mode disabled, ignoring working directory configuration")

@ -27,6 +27,8 @@
<systemPropertyVariables>
<property1>value1</property1>
<property2/>
<property3>${project.artifactId}</property3>
<foo>should-be-ignored</foo>
</systemPropertyVariables>
</configuration>
</execution>

@ -1,5 +1,5 @@
/*
* Copyright 2012-2017 the original author or authors.
* Copyright 2012-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -27,17 +27,18 @@ public class SampleApplication {
if (!"value2".equals(bar)) {
throw new IllegalStateException("bar system property mismatch (got [" + bar + "]");
}
String property1 = System.getProperty("property1");
if (!"value1".equals(property1)) {
throw new IllegalStateException("property1 system property mismatch (got [" + property1 + "]");
}
String property2 = System.getProperty("property2");
if (!"".equals(property2)) {
throw new IllegalStateException("property1 system property mismatch (got [" + property2 + "]");
throw new IllegalStateException("property2 system property mismatch (got [" + property2 + "]");
}
String property3 = System.getProperty("property3");
if (!"run-jvmargs".equals(property3)) {
throw new IllegalStateException("property3 system property mismatch (got [" + property3 + "]");
}
System.out.println("I haz been run");
}

@ -107,6 +107,14 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
@Parameter(property = "spring-boot.run.jvmArguments")
private String jvmArguments;
/**
* List of JVM system properties to pass to the process. NOTE: the use of system
* properties means that processes will be started by forking a new JVM.
* @since 2.1.0
*/
@Parameter
private Map<String, String> systemPropertyVariables;
/**
* Arguments that should be passed to the application. On command line use commas to
* separate multiple arguments.
@ -171,15 +179,6 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
@Parameter(property = "spring-boot.run.skip", defaultValue = "false")
private boolean skip;
/**
* List of JVM system properties. System property consists of key and value
* and it will be transformed to <code>-Dkey=value</code> format.
* In case if value is not specified or empty only key will be provided.
* @since 2.0
*/
@Parameter(property = "spring-boot.run.systemPropertyVariabled")
private Map<String, String> systemPropertyVariables;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
if (this.skip) {
@ -213,7 +212,8 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
private boolean hasJvmArgs() {
return (this.jvmArguments != null && !this.jvmArguments.isEmpty()) ||
(this.systemPropertyVariables != null && !this.systemPropertyVariables.isEmpty());
(this.systemPropertyVariables != null
&& !this.systemPropertyVariables.isEmpty());
}
private boolean hasWorkingDirectorySet() {
@ -244,22 +244,10 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
getLog().warn("Fork mode disabled, ignoring agent");
}
if (hasJvmArgs()) {
String messageTemplate = "Fork mode disabled, ignoring JVM argument(s) [%s%s]";
String sysPropsStr = "";
if (this.systemPropertyVariables != null && !this.systemPropertyVariables.isEmpty()) {
sysPropsStr = this.systemPropertyVariables
.entrySet()
.stream()
.map(e -> SystemPropertyFormatter.format(e.getKey(), e.getValue()))
.collect(Collectors.joining(" "));
}
String message = String.format(
messageTemplate,
this.jvmArguments,
sysPropsStr.isEmpty() ? sysPropsStr : " " + sysPropsStr
);
getLog().warn(message);
RunArguments runArguments = resolveJvmArguments();
getLog().warn("Fork mode disabled, ignoring JVM argument(s) ["
+ Arrays.stream(runArguments.asArray()).collect(
Collectors.joining(" ")) + "]");
}
if (hasWorkingDirectorySet()) {
getLog().warn("Fork mode disabled, ignoring working directory configuration");
@ -319,19 +307,15 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
*/
protected RunArguments resolveJvmArguments() {
final StringBuilder stringBuilder = new StringBuilder();
if (this.jvmArguments != null) {
stringBuilder.append(this.jvmArguments);
}
if (this.systemPropertyVariables != null) {
String result = this.systemPropertyVariables
stringBuilder.append(this.systemPropertyVariables
.entrySet()
.stream()
.map(e -> SystemPropertyFormatter.format(e.getKey(), e.getValue()))
.collect(Collectors.joining(" "));
stringBuilder
.append(" ")
.append(result);
.collect(Collectors.joining(" ")));
}
if (this.jvmArguments != null) {
stringBuilder.append(" ").append(this.jvmArguments);
}
return new RunArguments(stringBuilder.toString());
}
@ -551,11 +535,12 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
}
/**
* System properties formatter.
* Format System properties.
*/
static class SystemPropertyFormatter {
private static final String NO_VALUE_FORMAT = "-D%s";
private static final String KEY_VALUE_FORMAT = NO_VALUE_FORMAT + "=%s";
public static String format(Object key, Object value) {

@ -0,0 +1,59 @@
-----
Using System Properties
-----
Stephane Nicoll
-----
2018-04-24
-----
System properties can be specified using the <<<systemPropertyVariables>>> attribute.
The following sets <<<property1>>> to <<<test>>> and <<<property2>>> to 42:
---
<project>
...
<build>
<properties>
<my.value>42</my.value>
</properties>
...
<plugins>
...
<plugin>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
<configuration>
<systemPropertyVariables>
<property1>test</property1>
<property2>${my.value}</property2>
</profiles>
</configuration>
...
</plugin>
...
</plugins>
...
</build>
...
</project>
---
If the value is empty or not defined (i.e. <<<<my-property/>>>>), the system property
is set with an empty String as the value.
Any String typed Maven variable can be passed as system properties. Any attempt to pass
any other Maven variable type (e.g. a <<<List>>> or a <<<URL>>> variable) will cause the
variable expression to be passed literally (unevaluated).
The <<<jvmArguments>>> parameter takes precedence over system properties defined with
the mechanism above. In the following example, the value for <<<property1>>> is
<<<overridden>>>:
---
mvn spring-boot:run -Dspring-boot.jvmArguments="-Dproperty1=overridden"
---

@ -52,6 +52,8 @@ Spring Boot Maven Plugin
* {{{./examples/run-debug.html}Debug the application}}
* {{{./examples/run-system-properties.html}Using system properties}}
* {{{./examples/it-random-port.html}Random port for integration tests}}
* {{{./examples/it-skip.html}Skip integration tests}}

@ -135,12 +135,15 @@ mvn spring-boot:run
By default the application is executed directly from the Maven JVM. If you need to run
in a forked process you can use the 'fork' option. Forking will also occur if the
'jvmArguments' or 'agent' options are specified, or if devtools is present.
'jvmArguments', 'systemPropertyVariables' or 'agent' options are specified, or if
devtools is present.
If you need to specify some JVM arguments (i.e. for debugging purposes), you can use
the <<<jvmArguments>>> parameter, see {{{./examples/run-debug.html}Debug the application}}
for more details. As a convenience, the profiles to enable are handled by a specific
property (<<<profiles>>>), see {{{./examples/run-profiles.html}Specify active profiles}}.
for more details. There is also explicit support
{{{./examples/run-system-properties.html}for system properties}}. As a convenience, the
profiles to enable are handled by a specific property (<<<profiles>>>), see
{{{./examples/run-profiles.html}Specify active profiles}}.
Spring Boot 1.3 has introduced <<<devtools>>>, a module to improve the development-time
experience when working on Spring Boot applications. To enable it, just add the following

@ -11,6 +11,7 @@
<item name="Local repackaged artifact" href="examples/repackage-disable-attach.html"/>
<item name="Exclude a dependency" href="examples/exclude-dependency.html"/>
<item name="Debug the application" href="examples/run-debug.html"/>
<item name="Using system properties" href="examples/run-system-properties.html"/>
<item name="Random port for integration tests" href="examples/it-random-port.html"/>
<item name="Skip integration tests" href="examples/it-skip.html"/>
<item name="Specify active profiles" href="examples/run-profiles.html"/>

@ -1,5 +1,5 @@
/*
* Copyright 2012-2017 the original author or authors.
* Copyright 2012-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -16,37 +16,36 @@
package org.springframework.boot.maven;
import org.assertj.core.api.Assertions;
import org.junit.Test;
import org.springframework.boot.maven.AbstractRunMojo.SystemPropertyFormatter;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link AbstractRunMojo.SystemPropertyFormatter}
* Tests for {@link AbstractRunMojo.SystemPropertyFormatter}.
*/
public class SystemPropertyFormatterTests {
@Test
public void parseEmpty() throws Exception {
Assertions.assertThat(SystemPropertyFormatter.format(null, null))
.isEqualTo("");
public void parseEmpty() {
assertThat(SystemPropertyFormatter.format(null, null)).isEqualTo("");
}
@Test
public void parseOnlyKey() throws Exception {
Assertions.assertThat(SystemPropertyFormatter.format("key1", null))
.isEqualTo("-Dkey1");
public void parseOnlyKey() {
assertThat(SystemPropertyFormatter.format("key1", null)).isEqualTo("-Dkey1");
}
@Test
public void parseKeyWithValue() throws Exception {
Assertions.assertThat(SystemPropertyFormatter.format("key1", "value1"))
public void parseKeyWithValue() {
assertThat(SystemPropertyFormatter.format("key1", "value1"))
.isEqualTo("-Dkey1=value1");
}
@Test
public void parseKeyWithEmptyValue() throws Exception {
Assertions.assertThat(SystemPropertyFormatter.format("key1", ""))
.isEqualTo("-Dkey1");
public void parseKeyWithEmptyValue() {
assertThat(SystemPropertyFormatter.format("key1", "")).isEqualTo("-Dkey1");
}
}

Loading…
Cancel
Save