Add system properties support using explicit configuration tag

See gh-10741
pull/12955/head
Vadeg 7 years ago committed by Stephane Nicoll
parent fe497d70b8
commit ba34bf6470

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

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

@ -0,0 +1,37 @@
<?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/>
</systemPropertyVariables>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

@ -0,0 +1,44 @@
/*
* Copyright 2012-2017 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("property1 system property mismatch (got [" + property2 + "]");
}
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.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;
import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.Artifact;
import org.apache.maven.model.Resource; import org.apache.maven.model.Resource;
@ -169,6 +171,15 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
@Parameter(property = "spring-boot.run.skip", defaultValue = "false") @Parameter(property = "spring-boot.run.skip", defaultValue = "false")
private boolean skip; 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 @Override
public void execute() throws MojoExecutionException, MojoFailureException { public void execute() throws MojoExecutionException, MojoFailureException {
if (this.skip) { if (this.skip) {
@ -201,7 +212,8 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
} }
private boolean hasJvmArgs() { 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() { private boolean hasWorkingDirectorySet() {
@ -232,8 +244,22 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
getLog().warn("Fork mode disabled, ignoring agent"); getLog().warn("Fork mode disabled, ignoring agent");
} }
if (hasJvmArgs()) { if (hasJvmArgs()) {
getLog().warn("Fork mode disabled, ignoring JVM argument(s) [" String messageTemplate = "Fork mode disabled, ignoring JVM argument(s) [%s%s]";
+ this.jvmArguments + "]"); 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);
} }
if (hasWorkingDirectorySet()) { if (hasWorkingDirectorySet()) {
getLog().warn("Fork mode disabled, ignoring working directory configuration"); getLog().warn("Fork mode disabled, ignoring working directory configuration");
@ -292,7 +318,22 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
* @return a {@link RunArguments} defining the JVM arguments * @return a {@link RunArguments} defining the JVM arguments
*/ */
protected RunArguments resolveJvmArguments() { protected RunArguments resolveJvmArguments() {
return new RunArguments(this.jvmArguments); final StringBuilder stringBuilder = new StringBuilder();
if (this.jvmArguments != null) {
stringBuilder.append(this.jvmArguments);
}
if (this.systemPropertyVariables != null) {
String result = this.systemPropertyVariables
.entrySet()
.stream()
.map(e -> SystemPropertyFormatter.format(e.getKey(), e.getValue()))
.collect(Collectors.joining(" "));
stringBuilder
.append(" ")
.append(result);
}
return new RunArguments(stringBuilder.toString());
} }
private void addJvmArgs(List<String> args) { private void addJvmArgs(List<String> args) {
@ -509,4 +550,23 @@ public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo {
} }
/**
* System properties formatter.
*/
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,52 @@
/*
* Copyright 2012-2017 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.assertj.core.api.Assertions;
import org.junit.Test;
import org.springframework.boot.maven.AbstractRunMojo.SystemPropertyFormatter;
/**
* Tests for {@link AbstractRunMojo.SystemPropertyFormatter}
*/
public class SystemPropertyFormatterTests {
@Test
public void parseEmpty() throws Exception {
Assertions.assertThat(SystemPropertyFormatter.format(null, null))
.isEqualTo("");
}
@Test
public void parseOnlyKey() throws Exception {
Assertions.assertThat(SystemPropertyFormatter.format("key1", null))
.isEqualTo("-Dkey1");
}
@Test
public void parseKeyWithValue() throws Exception {
Assertions.assertThat(SystemPropertyFormatter.format("key1", "value1"))
.isEqualTo("-Dkey1=value1");
}
@Test
public void parseKeyWithEmptyValue() throws Exception {
Assertions.assertThat(SystemPropertyFormatter.format("key1", ""))
.isEqualTo("-Dkey1");
}
}
Loading…
Cancel
Save