Create software components for Spring Boot jar and war artifacts
Closes gh-1666
This commit is contained in:
parent
31febfa383
commit
d9af21ab7c
|
@ -16,13 +16,21 @@
|
||||||
|
|
||||||
package org.springframework.boot.gradle.bundling;
|
package org.springframework.boot.gradle.bundling;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
|
|
||||||
import org.gradle.api.Project;
|
import org.gradle.api.Project;
|
||||||
import org.gradle.api.artifacts.Configuration;
|
import org.gradle.api.artifacts.Configuration;
|
||||||
|
import org.gradle.api.artifacts.ModuleDependency;
|
||||||
|
import org.gradle.api.artifacts.PublishArtifact;
|
||||||
import org.gradle.api.artifacts.maven.MavenResolver;
|
import org.gradle.api.artifacts.maven.MavenResolver;
|
||||||
|
import org.gradle.api.attributes.Usage;
|
||||||
import org.gradle.api.file.FileCollection;
|
import org.gradle.api.file.FileCollection;
|
||||||
import org.gradle.api.internal.artifacts.publish.ArchivePublishArtifact;
|
import org.gradle.api.internal.artifacts.publish.ArchivePublishArtifact;
|
||||||
|
import org.gradle.api.internal.attributes.Usages;
|
||||||
|
import org.gradle.api.internal.component.SoftwareComponentInternal;
|
||||||
|
import org.gradle.api.internal.component.UsageContext;
|
||||||
import org.gradle.api.plugins.JavaPlugin;
|
import org.gradle.api.plugins.JavaPlugin;
|
||||||
import org.gradle.api.plugins.JavaPluginConvention;
|
import org.gradle.api.plugins.JavaPluginConvention;
|
||||||
import org.gradle.api.plugins.WarPlugin;
|
import org.gradle.api.plugins.WarPlugin;
|
||||||
|
@ -54,7 +62,9 @@ public class BundlingPluginFeatures implements PluginFeatures {
|
||||||
private void configureBootWarTask(Project project) {
|
private void configureBootWarTask(Project project) {
|
||||||
BootWar bootWar = project.getTasks().create("bootWar", BootWar.class);
|
BootWar bootWar = project.getTasks().create("bootWar", BootWar.class);
|
||||||
bootWar.providedClasspath(providedRuntimeConfiguration(project));
|
bootWar.providedClasspath(providedRuntimeConfiguration(project));
|
||||||
this.singlePublishedArtifact.addCandidate(new ArchivePublishArtifact(bootWar));
|
ArchivePublishArtifact artifact = new ArchivePublishArtifact(bootWar);
|
||||||
|
this.singlePublishedArtifact.addCandidate(artifact);
|
||||||
|
project.getComponents().add(new BootSoftwareComponent(artifact, "bootWeb"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void configureBootJarTask(Project project) {
|
private void configureBootJarTask(Project project) {
|
||||||
|
@ -66,7 +76,9 @@ public class BundlingPluginFeatures implements PluginFeatures {
|
||||||
.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
|
.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
|
||||||
return mainSourceSet.getRuntimeClasspath();
|
return mainSourceSet.getRuntimeClasspath();
|
||||||
});
|
});
|
||||||
this.singlePublishedArtifact.addCandidate(new ArchivePublishArtifact(bootJar));
|
ArchivePublishArtifact artifact = new ArchivePublishArtifact(bootJar);
|
||||||
|
this.singlePublishedArtifact.addCandidate(artifact);
|
||||||
|
project.getComponents().add(new BootSoftwareComponent(artifact, "bootJava"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void configureBootArchivesUpload(Project project) {
|
private void configureBootArchivesUpload(Project project) {
|
||||||
|
@ -89,4 +101,58 @@ public class BundlingPluginFeatures implements PluginFeatures {
|
||||||
.getByName(WarPlugin.PROVIDED_RUNTIME_CONFIGURATION_NAME);
|
.getByName(WarPlugin.PROVIDED_RUNTIME_CONFIGURATION_NAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link SofwareComponent} for a Spring Boot fat jar or war.
|
||||||
|
*/
|
||||||
|
private static final class BootSoftwareComponent
|
||||||
|
implements SoftwareComponentInternal {
|
||||||
|
|
||||||
|
private final PublishArtifact artifact;
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
private BootSoftwareComponent(PublishArtifact artifact, String name) {
|
||||||
|
this.artifact = artifact;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<UsageContext> getUsages() {
|
||||||
|
return Collections.singleton(new BootUsageContext(this.artifact));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class BootUsageContext implements UsageContext {
|
||||||
|
|
||||||
|
private static final Usage USAGE = Usages.usage("master");
|
||||||
|
|
||||||
|
private final PublishArtifact artifact;
|
||||||
|
|
||||||
|
private BootUsageContext(PublishArtifact artifact) {
|
||||||
|
this.artifact = artifact;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Usage getUsage() {
|
||||||
|
return USAGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<PublishArtifact> getArtifacts() {
|
||||||
|
return Collections.singleton(this.artifact);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<ModuleDependency> getDependencies() {
|
||||||
|
return Collections.emptySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
* 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.gradle.bundling;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.gradle.testkit.runner.BuildResult;
|
||||||
|
import org.gradle.testkit.runner.TaskOutcome;
|
||||||
|
import org.junit.Rule;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.springframework.boot.gradle.testkit.GradleBuild;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Integration tests for publishing Boot jars and wars using Gradle's Maven Publish
|
||||||
|
* plugin.
|
||||||
|
*
|
||||||
|
* @author Andy Wilkinson
|
||||||
|
*/
|
||||||
|
public class MavenPublishingIntegrationTests {
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public final GradleBuild gradleBuild = new GradleBuild();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void bootJarCanBePublished() throws FileNotFoundException, IOException {
|
||||||
|
BuildResult result = this.gradleBuild.build("publish");
|
||||||
|
assertThat(result.task(":publish").getOutcome()).isEqualTo(TaskOutcome.SUCCESS);
|
||||||
|
assertThat(artifactWithSuffix("jar")).isFile();
|
||||||
|
assertThat(artifactWithSuffix("pom")).is(pomWith().groupId("com.example")
|
||||||
|
.artifactId(this.gradleBuild.getProjectDir().getName()).version("1.0")
|
||||||
|
.noPackaging().noDependencies());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void bootWarCanBePublished() throws IOException {
|
||||||
|
BuildResult result = this.gradleBuild.build("publish");
|
||||||
|
assertThat(result.task(":publish").getOutcome()).isEqualTo(TaskOutcome.SUCCESS);
|
||||||
|
assertThat(artifactWithSuffix("war")).isFile();
|
||||||
|
assertThat(artifactWithSuffix("pom")).is(pomWith().groupId("com.example")
|
||||||
|
.artifactId(this.gradleBuild.getProjectDir().getName()).version("1.0")
|
||||||
|
.packaging("war").noDependencies());
|
||||||
|
}
|
||||||
|
|
||||||
|
private File artifactWithSuffix(String suffix) {
|
||||||
|
String name = this.gradleBuild.getProjectDir().getName();
|
||||||
|
return new File(new File(this.gradleBuild.getProjectDir(), "build/repo"),
|
||||||
|
String.format("com/example/%s/1.0/%s-1.0.%s", name, name, suffix));
|
||||||
|
}
|
||||||
|
|
||||||
|
private PomCondition pomWith() {
|
||||||
|
return new PomCondition();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
buildscript {
|
||||||
|
dependencies {
|
||||||
|
classpath files(pluginClasspath.split(','))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
apply plugin: 'java'
|
||||||
|
apply plugin: 'org.springframework.boot'
|
||||||
|
apply plugin: 'maven-publish'
|
||||||
|
|
||||||
|
bootJar {
|
||||||
|
mainClass = 'com.example.Application'
|
||||||
|
}
|
||||||
|
|
||||||
|
group = 'com.example'
|
||||||
|
version = '1.0'
|
||||||
|
|
||||||
|
publishing {
|
||||||
|
repositories {
|
||||||
|
maven {
|
||||||
|
url "$buildDir/repo"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
publications {
|
||||||
|
mavenBootJava(MavenPublication) {
|
||||||
|
from components.bootJava
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
buildscript {
|
||||||
|
dependencies {
|
||||||
|
classpath files(pluginClasspath.split(','))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
apply plugin: 'war'
|
||||||
|
apply plugin: 'org.springframework.boot'
|
||||||
|
apply plugin: 'maven-publish'
|
||||||
|
|
||||||
|
bootWar {
|
||||||
|
mainClass = 'com.example.Application'
|
||||||
|
}
|
||||||
|
|
||||||
|
group = 'com.example'
|
||||||
|
version = '1.0'
|
||||||
|
|
||||||
|
publishing {
|
||||||
|
repositories {
|
||||||
|
maven {
|
||||||
|
url "$buildDir/repo"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
publications {
|
||||||
|
mavenBootWeb(MavenPublication) {
|
||||||
|
from components.bootWeb
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue