Add a BuildInfo task for generating build.properties with Gradle

The commit adds a new BuildInfo task that can be used to generate
a build.properties file, intended for inclusion in the Actuator's
info endpoint.

A default instance of the task can be configure using the plugin's
DSL:

springBoot {
	buildInfo()
}

Additional properties can also be configured using the DSL:

springBoot {
	buildInfo {
		additionalProperties = [
			'foo': 'bar'
		]
	}
}

When configured via the DSL, the Java plugin's classes task is
configured to depend on the build info task. Alternatively, if more
control is required, the task can be declared and configured manually:

task buildInfo(type: org.springframework.boot.gradle.buildinfo.BuildInfo) {
	additionalProperties = [
		'foo': 'bar'
	]
}

classes {
	dependsOn buildInfo
}

See gh-2559
This commit is contained in:
Andy Wilkinson
2016-03-23 17:58:54 +00:00
parent 4167469781
commit 58ca9a1c5d
6 changed files with 328 additions and 68 deletions

View File

@@ -39,7 +39,8 @@ public class SpringBootPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
project.getExtensions().create("springBoot", SpringBootPluginExtension.class);
project.getExtensions().create("springBoot", SpringBootPluginExtension.class,
project);
project.getPlugins().apply(JavaPlugin.class);
new AgentPluginFeatures().apply(project);
new RepackagePluginFeatures().apply(project);

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2015 the original author or authors.
* Copyright 2012-2016 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.
@@ -20,6 +20,11 @@ import java.io.File;
import java.util.Map;
import java.util.Set;
import groovy.lang.Closure;
import org.gradle.api.Project;
import org.gradle.api.plugins.JavaPlugin;
import org.springframework.boot.gradle.buildinfo.BuildInfo;
import org.springframework.boot.loader.tools.Layout;
import org.springframework.boot.loader.tools.Layouts;
@@ -39,9 +44,12 @@ import org.springframework.boot.loader.tools.Layouts;
* @author Phillip Webb
* @author Dave Syer
* @author Stephane Nicoll
* @author Andy Wilkinson
*/
public class SpringBootPluginExtension {
private final Project project;
/**
* The main class that should be run. Instead of setting this explicitly you can use
* the 'mainClassName' of the project or the 'main' of the 'run' task. If not
@@ -128,6 +136,10 @@ public class SpringBootPluginExtension {
*/
Map<String, String> embeddedLaunchScriptProperties;
public SpringBootPluginExtension(Project project) {
this.project = project;
}
/**
* Convenience method for use in a custom task.
* @return the Layout to use or null if not explicitly set
@@ -249,6 +261,21 @@ public class SpringBootPluginExtension {
this.embeddedLaunchScriptProperties = embeddedLaunchScriptProperties;
}
public void buildInfo() {
this.buildInfo(null);
}
public void buildInfo(Closure<?> taskConfigurer) {
BuildInfo buildInfo = this.project.getTasks().create("buildInfo",
BuildInfo.class);
this.project.getTasks().getByName(JavaPlugin.CLASSES_TASK_NAME)
.dependsOn(buildInfo);
if (taskConfigurer != null) {
taskConfigurer.setDelegate(buildInfo);
taskConfigurer.call();
}
}
/**
* Layout Types.
*/

View File

@@ -0,0 +1,137 @@
/*
* Copyright 2012-2016 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.gradle.buildinfo;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.gradle.api.DefaultTask;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.OutputFile;
import org.gradle.api.tasks.TaskAction;
import org.gradle.api.tasks.TaskExecutionException;
import org.gradle.api.tasks.bundling.Jar;
import org.springframework.boot.loader.tools.BuildPropertiesWriter;
import org.springframework.boot.loader.tools.BuildPropertiesWriter.ProjectDetails;
/**
* {@link DefaultTask} for generating a {@code build.properties} file from a
* {@code Project}.
* <p>
* By default, the {@code build.properties} file is generated in
* project.buildDir/resources/main/META-INF/boot.
* </p>
*
* @author Andy Wilkinson
*/
public class BuildInfo extends DefaultTask {
@OutputFile
private File outputFile = getProject().file(new File(getProject().getBuildDir(),
"resources/main/META-INF/boot/build.properties"));
@Input
private String projectGroup = getProject().getGroup().toString();
@Input
private String projectArtifact = ((Jar) getProject().getTasks()
.getByName(JavaPlugin.JAR_TASK_NAME)).getBaseName();
@Input
private String projectVersion = getProject().getVersion().toString();
@Input
private String projectName = getProject().getName();
@Input
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
@TaskAction
public void generateBuildProperties() {
try {
new BuildPropertiesWriter(this.outputFile)
.writeBuildProperties(new ProjectDetails(this.projectGroup,
this.projectArtifact, this.projectVersion, this.projectName,
coerceToStringValues(this.additionalProperties)));
}
catch (IOException ex) {
throw new TaskExecutionException(this, ex);
}
}
public String getProjectGroup() {
return this.projectGroup;
}
public void setProjectGroup(String projectGroup) {
this.projectGroup = projectGroup;
}
public String getProjectArtifact() {
return this.projectArtifact;
}
public void setProjectArtifact(String projectArtifact) {
this.projectArtifact = projectArtifact;
}
public String getProjectVersion() {
return this.projectVersion;
}
public void setProjectVersion(String projectVersion) {
this.projectVersion = projectVersion;
}
public String getProjectName() {
return this.projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
public File getOutputFile() {
return this.outputFile;
}
public void setOutputFile(File outputFile) {
this.outputFile = outputFile;
}
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}
public void setAdditionalProperties(Map<String, Object> additionalProperties) {
this.additionalProperties = additionalProperties;
}
private Map<String, String> coerceToStringValues(Map<String, Object> input) {
Map<String, String> output = new HashMap<String, String>();
for (Entry<String, Object> entry : this.additionalProperties.entrySet()) {
output.put(entry.getKey(), entry.getValue().toString());
}
return output;
}
}