Skip to content

Commit 72a2e5b

Browse files
author
Phillip Webb
committed
Polish Gradle repackage
1 parent 965c16d commit 72a2e5b

File tree

2 files changed

+89
-69
lines changed

2 files changed

+89
-69
lines changed

spring-boot-tools/spring-boot-gradle-plugin/src/main/groovy/org/springframework/boot/gradle/repackage/RepackagePluginFeatures.java

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.gradle.api.Project;
2323
import org.gradle.api.Task;
2424
import org.gradle.api.artifacts.Dependency;
25+
import org.gradle.api.logging.Logger;
2526
import org.gradle.api.plugins.BasePlugin;
2627
import org.gradle.api.tasks.bundling.Jar;
2728
import org.springframework.boot.gradle.PluginFeatures;
@@ -32,6 +33,7 @@
3233
* {@link PluginFeatures} to add repackage support.
3334
*
3435
* @author Phillip Webb
36+
* @author Dave Syer
3537
*/
3638
public class RepackagePluginFeatures implements PluginFeatures {
3739

@@ -58,10 +60,10 @@ private void addRepackageTask(Project project) {
5860

5961
private void registerOutput(Project project, final RepackageTask task) {
6062
project.afterEvaluate(new Action<Project>() {
61-
6263
@Override
6364
public void execute(Project project) {
64-
project.getTasks().withType(Jar.class, new OutputAction(task));
65+
project.getTasks().withType(Jar.class,
66+
new RegisterInputsOutputsAction(task));
6567
Object withJar = task.getWithJarTask();
6668
if (withJar!=null) {
6769
task.dependsOn(withJar);
@@ -82,50 +84,49 @@ private void registerRepackageTaskProperty(Project project) {
8284
RepackageTask.class);
8385
}
8486

85-
private class OutputAction implements Action<Jar> {
87+
/**
88+
* Register task input/outputs when classifiers are used
89+
*/
90+
private static class RegisterInputsOutputsAction implements Action<Jar> {
91+
92+
private final RepackageTask task;
8693

87-
private RepackageTask task;
94+
private final Project project;
8895

89-
public OutputAction(RepackageTask task) {
96+
public RegisterInputsOutputsAction(RepackageTask task) {
9097
this.task = task;
98+
this.project = task.getProject();
9199
}
92100

93101
@Override
94-
public void execute(Jar archive) {
95-
if ("".equals(archive.getClassifier())) {
96-
setClassifier(archive);
97-
File file = archive.getArchivePath();
102+
public void execute(Jar jarTask) {
103+
if ("".equals(jarTask.getClassifier())) {
98104
String classifier = this.task.getClassifier();
105+
if (classifier == null) {
106+
SpringBootPluginExtension extension = this.project.getExtensions()
107+
.getByType(SpringBootPluginExtension.class);
108+
classifier = extension.getClassifier();
109+
this.task.setClassifier(classifier);
110+
}
99111
if (classifier != null) {
100-
this.task.getInputs().file(archive);
101-
task.getInputs().file(task.getDependencies());
102-
String withClassifer = file.getName();
103-
withClassifer = StringUtils.stripFilenameExtension(withClassifer)
104-
+ "-" + classifier + "."
105-
+ StringUtils.getFilenameExtension(withClassifer);
106-
File out = new File(file.getParentFile(), withClassifer);
107-
file = out;
108-
this.task.getOutputs().file(file);
109-
this.task.setOutputFile(file);
112+
setupInputOutputs(jarTask, classifier);
110113
}
111114
}
112-
113115
}
114116

115-
private void setClassifier(Jar archive) {
116-
Project project = task.getProject();
117-
String classifier = null;
118-
SpringBootPluginExtension extension = project.getExtensions().getByType(
119-
SpringBootPluginExtension.class);
120-
if (task.getClassifier() != null) {
121-
classifier = task.getClassifier();
122-
} else if (extension.getClassifier() != null) {
123-
classifier = extension.getClassifier();
124-
}
125-
if (classifier != null) {
126-
project.getLogger().info("Setting classifier: " + classifier);
127-
task.setClassifier(classifier);
128-
}
117+
private void setupInputOutputs(Jar jarTask, String classifier) {
118+
Logger logger = this.project.getLogger();
119+
logger.debug("Using classifier: " + classifier + " for task "
120+
+ task.getName());
121+
File inputFile = jarTask.getArchivePath();
122+
String outputName = inputFile.getName();
123+
outputName = StringUtils.stripFilenameExtension(outputName) + "-"
124+
+ classifier + "." + StringUtils.getFilenameExtension(outputName);
125+
File outputFile = new File(inputFile.getParentFile(), outputName);
126+
this.task.getInputs().file(jarTask);
127+
this.task.getInputs().file(this.task.getDependencies());
128+
this.task.getOutputs().file(outputFile);
129+
this.task.setOutputFile(outputFile);
129130
}
130131

131132
}

spring-boot-tools/spring-boot-gradle-plugin/src/main/groovy/org/springframework/boot/gradle/repackage/RepackageTask.java

Lines changed: 54 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.gradle.api.DefaultTask;
2727
import org.gradle.api.Project;
2828
import org.gradle.api.tasks.TaskAction;
29+
import org.gradle.api.tasks.TaskContainer;
2930
import org.gradle.api.tasks.bundling.Jar;
3031
import org.springframework.boot.gradle.SpringBootPluginExtension;
3132
import org.springframework.boot.loader.tools.LibraryCallback;
@@ -105,14 +106,13 @@ public File[] getDependencies() {
105106
final List<File> files = new ArrayList<File>();
106107
try {
107108
libraries.doWithLibraries(new LibraryCallback() {
108-
109109
@Override
110110
public void library(File file, LibraryScope scope) throws IOException {
111111
files.add(file);
112112
}
113113
});
114-
} catch (IOException e) {
115-
throw new IllegalStateException("Cannot retrieve dependencies", e);
114+
} catch (IOException ex) {
115+
throw new IllegalStateException("Cannot retrieve dependencies", ex);
116116
}
117117
return files.toArray(new File[files.size()]);
118118
}
@@ -133,6 +133,9 @@ private ProjectLibraries getLibraries() {
133133
return libraries;
134134
}
135135

136+
/**
137+
* Action to repackage JARs.
138+
*/
136139
private class RepackageAction implements Action<Jar> {
137140

138141
private final SpringBootPluginExtension extension;
@@ -146,50 +149,63 @@ public RepackageAction(SpringBootPluginExtension extension,
146149
}
147150

148151
@Override
149-
public void execute(Jar archive) {
150-
if (!enabled) {
152+
public void execute(Jar jarTask) {
153+
if (!RepackageTask.this.enabled) {
151154
getLogger().info("Repackage disabled");
152155
return;
153156
}
154-
// if withJarTask is set, compare tasks and bail out if we didn't match
155-
if (RepackageTask.this.withJarTask != null
156-
&& !(archive.equals(RepackageTask.this.withJarTask)
157-
|| archive.equals(getProject().getTasks().findByName(
158-
RepackageTask.this.withJarTask.toString())))) {
157+
Object withJarTask = RepackageTask.this.withJarTask;
158+
if (isTaskMatch(jarTask, withJarTask)) {
159159
getLogger().info(
160-
"Jar task not repackaged (didn't match withJarTask): " + archive);
160+
"Jar task not repackaged (didn't match withJarTask): " + jarTask);
161161
return;
162162
}
163-
164-
if ("".equals(archive.getClassifier())
163+
if ("".equals(jarTask.getClassifier())
165164
|| RepackageTask.this.withJarTask != null) {
166-
File file = archive.getArchivePath();
165+
File file = jarTask.getArchivePath();
167166
if (file.exists()) {
168-
Repackager repackager = new LoggingRepackager(file);
169-
File out = RepackageTask.this.outputFile;
170-
if (out != null && !file.equals(out)) {
171-
try {
172-
FileCopyUtils.copy(file, out);
173-
} catch (IOException ex) {
174-
throw new IllegalStateException(ex.getMessage(), ex);
175-
}
176-
file = out;
177-
}
178-
RepackageTask.this.outputFile = file;
179-
setMainClass(repackager);
180-
if (this.extension.convertLayout() != null) {
181-
repackager.setLayout(this.extension.convertLayout());
182-
}
183-
repackager.setBackupSource(this.extension.isBackupSource());
184-
try {
185-
repackager.repackage(file, this.libraries);
186-
} catch (IOException ex) {
187-
throw new IllegalStateException(ex.getMessage(), ex);
188-
}
167+
repackage(file);
189168
}
190169
}
191170
}
192171

172+
private boolean isTaskMatch(Jar task, Object compare) {
173+
if (compare == null) {
174+
return false;
175+
}
176+
TaskContainer tasks = getProject().getTasks();
177+
return task.equals(compare) || task.equals(tasks.findByName(task.toString()));
178+
}
179+
180+
private void repackage(File file) {
181+
File outputFile = RepackageTask.this.outputFile;
182+
if (outputFile != null && !file.equals(outputFile)) {
183+
copy(file, outputFile);
184+
file = outputFile;
185+
}
186+
Repackager repackager = new LoggingRepackager(file);
187+
setMainClass(repackager);
188+
if (this.extension.convertLayout() != null) {
189+
repackager.setLayout(this.extension.convertLayout());
190+
}
191+
repackager.setBackupSource(this.extension.isBackupSource());
192+
try {
193+
repackager.repackage(file, this.libraries);
194+
}
195+
catch (IOException ex) {
196+
throw new IllegalStateException(ex.getMessage(), ex);
197+
}
198+
}
199+
200+
private void copy(File source, File dest) {
201+
try {
202+
FileCopyUtils.copy(source, dest);
203+
}
204+
catch (IOException ex) {
205+
throw new IllegalStateException(ex.getMessage(), ex);
206+
}
207+
}
208+
193209
private void setMainClass(Repackager repackager) {
194210
String mainClass = (String) getProject().property("mainClassName");
195211
if (RepackageTask.this.mainClass != null) {
@@ -205,6 +221,9 @@ private void setMainClass(Repackager repackager) {
205221
}
206222
}
207223

224+
/**
225+
* {@link Repackager} that also logs when searching takes too long.
226+
*/
208227
private class LoggingRepackager extends Repackager {
209228

210229
public LoggingRepackager(File source) {

0 commit comments

Comments
 (0)