Merge pull request #10741 from vadeg:feature/jvm-arguments

* pr/10741:
  Polish "Add system properties support using explicit configuration tag"
  Add system properties support using explicit configuration tag
pull/12955/head
Stephane Nicoll 7 years ago
commit 54c0b85608

@ -26,6 +26,10 @@
<fork>false</fork>
<jvmArguments>-Dfoo=bar</jvmArguments>
<workingDirectory>${project.build.sourceDirectory}</workingDirectory>
<systemPropertyVariables>
<property1>value1</property1>
<property2/>
</systemPropertyVariables>
</configuration>
</execution>
</executions>

@ -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]")
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")

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework.boot.maven.it</groupId>
<artifactId>run-jvmargs</artifactId>
<version>0.0.1.BUILD-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>@java.version@</maven.compiler.source>
<maven.compiler.target>@java.version@</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>@project.groupId@</groupId>
<artifactId>@project.artifactId@</artifactId>
<version>@project.version@</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<jvmArguments>-Dfoo="value 1" -Dbar=value2</jvmArguments>
<systemPropertyVariables>
<property1>value1</property1>
<property2/>
<property3>${project.artifactId}</property3>
<foo>should-be-ignored</foo>
</systemPropertyVariables>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

@ -0,0 +1,45 @@
/*
* 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.test;
public class SampleApplication {
public static void main(String[] args) {
String foo = System.getProperty("foo");
if (!"value 1".equals(foo)) {
throw new IllegalStateException("foo system property mismatch (got [" + foo + "]");
}
String bar = System.getProperty("bar");
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("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");
}
}

@ -0,0 +1,3 @@
def file = new File(basedir, "build.log")
return file.text.contains("I haz been run")

@ -25,7 +25,9 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.model.Resource;
@ -105,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.
@ -201,7 +211,9 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
}
private boolean hasJvmArgs() {
return (this.jvmArguments != null && !this.jvmArguments.isEmpty());
return (this.jvmArguments != null && !this.jvmArguments.isEmpty()) ||
(this.systemPropertyVariables != null
&& !this.systemPropertyVariables.isEmpty());
}
private boolean hasWorkingDirectorySet() {
@ -232,8 +244,10 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
getLog().warn("Fork mode disabled, ignoring agent");
}
if (hasJvmArgs()) {
RunArguments runArguments = resolveJvmArguments();
getLog().warn("Fork mode disabled, ignoring JVM argument(s) ["
+ this.jvmArguments + "]");
+ Arrays.stream(runArguments.asArray()).collect(
Collectors.joining(" ")) + "]");
}
if (hasWorkingDirectorySet()) {
getLog().warn("Fork mode disabled, ignoring working directory configuration");
@ -292,7 +306,18 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
* @return a {@link RunArguments} defining the JVM arguments
*/
protected RunArguments resolveJvmArguments() {
return new RunArguments(this.jvmArguments);
final StringBuilder stringBuilder = new StringBuilder();
if (this.systemPropertyVariables != null) {
stringBuilder.append(this.systemPropertyVariables
.entrySet()
.stream()
.map(e -> SystemPropertyFormatter.format(e.getKey(), e.getValue()))
.collect(Collectors.joining(" ")));
}
if (this.jvmArguments != null) {
stringBuilder.append(" ").append(this.jvmArguments);
}
return new RunArguments(stringBuilder.toString());
}
private void addJvmArgs(List<String> args) {
@ -509,4 +534,24 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
}
/**
* 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) {
if (key == null) {
return "";
}
if (value == null || String.valueOf(value).trim().isEmpty()) {
return String.format(NO_VALUE_FORMAT, key);
}
return String.format(KEY_VALUE_FORMAT, key, 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"/>

@ -0,0 +1,51 @@
/*
* 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.maven;
import org.junit.Test;
import org.springframework.boot.maven.AbstractRunMojo.SystemPropertyFormatter;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link AbstractRunMojo.SystemPropertyFormatter}.
*/
public class SystemPropertyFormatterTests {
@Test
public void parseEmpty() {
assertThat(SystemPropertyFormatter.format(null, null)).isEqualTo("");
}
@Test
public void parseOnlyKey() {
assertThat(SystemPropertyFormatter.format("key1", null)).isEqualTo("-Dkey1");
}
@Test
public void parseKeyWithValue() {
assertThat(SystemPropertyFormatter.format("key1", "value1"))
.isEqualTo("-Dkey1=value1");
}
@Test
public void parseKeyWithEmptyValue() {
assertThat(SystemPropertyFormatter.format("key1", "")).isEqualTo("-Dkey1");
}
}
Loading…
Cancel
Save