diff --git a/.gitignore b/.gitignore index 3e6eb9f0..5234dd9e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,11 @@ .settings/ target/ +build/ +bin/ +.jfrog/ +.gradle .idea/ *.iml *.ipr diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..0294e4c8 --- /dev/null +++ b/build.gradle @@ -0,0 +1,32 @@ +plugins { + id "base" + id 'org.springframework.shell.root' +} + +description = 'Spring Shell' + +repositories { + maven { url 'https://repo.spring.io/snapshot' } + maven { url 'https://repo.spring.io/milestone' } + maven { url 'https://repo.spring.io/release' } + mavenCentral() +} + +allprojects { + group = 'org.springframework.shell' + + repositories { + mavenCentral() + maven { url 'https://repo.spring.io/release' } + if (version.contains('-')) { + maven { url "https://repo.spring.io/milestone" } + } + if (version.endsWith('-SNAPSHOT')) { + maven { url "https://repo.spring.io/snapshot" } + } + } + + configurations.all { + resolutionStrategy.cacheChangingModulesFor 1, 'hours' + } +} diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle new file mode 100644 index 00000000..d52d3812 --- /dev/null +++ b/buildSrc/build.gradle @@ -0,0 +1,58 @@ +plugins { + id "java-gradle-plugin" + id "java" +} + +sourceCompatibility = JavaVersion.VERSION_17 + +repositories { + gradlePluginPortal() + mavenCentral() + maven { url 'https://repo.spring.io/plugins-release/' } + maven { url "https://repo.spring.io/snapshot" } +} + +ext { + def propertiesFile = new File(new File("$projectDir").parentFile, "gradle.properties") + propertiesFile.withInputStream { + def properties = new Properties() + properties.load(it) + set("springBootVersion", properties["springBootVersion"]) + } +} + +dependencies { + implementation(platform("org.springframework.boot:spring-boot-dependencies:${springBootVersion}")) + implementation("org.springframework:spring-core") + implementation 'org.asciidoctor:asciidoctor-gradle-jvm:3.3.2' + implementation 'org.jfrog.buildinfo:build-info-extractor-gradle:4.29.0' +} + +gradlePlugin { + plugins { + modulePlugin { + id = "org.springframework.shell.module" + implementationClass = "org.springframework.shell.gradle.ModulePlugin" + } + starterPlugin { + id = "org.springframework.shell.starter" + implementationClass = "org.springframework.shell.gradle.StarterPlugin" + } + bomPlugin { + id = "org.springframework.shell.bom" + implementationClass = "org.springframework.shell.gradle.BomPlugin" + } + docsPlugin { + id = "org.springframework.shell.docs" + implementationClass = "org.springframework.shell.gradle.DocsPlugin" + } + distPlugin { + id = "org.springframework.shell.root" + implementationClass = "org.springframework.shell.gradle.RootPlugin" + } + samplePlugin { + id = "org.springframework.shell.sample" + implementationClass = "org.springframework.shell.gradle.SamplePlugin" + } + } +} diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/ArtifactoryConventions.java b/buildSrc/src/main/java/org/springframework/shell/gradle/ArtifactoryConventions.java new file mode 100644 index 00000000..d668daf4 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/ArtifactoryConventions.java @@ -0,0 +1,69 @@ +/* + * Copyright 2022 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 + * + * https://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.shell.gradle; + +import java.util.HashMap; +import java.util.Map; + +import org.gradle.api.Project; +import org.gradle.api.Task; +import org.gradle.api.plugins.PluginManager; +import org.jfrog.build.extractor.clientConfiguration.ArtifactSpec; +import org.jfrog.build.extractor.clientConfiguration.ArtifactSpecs; +import org.jfrog.gradle.plugin.artifactory.ArtifactoryPlugin; +import org.jfrog.gradle.plugin.artifactory.task.ArtifactoryTask; + +/** + * @author Janne Valkealahti + */ +public class ArtifactoryConventions { + + void apply(Project project) { + PluginManager pluginManager = project.getPluginManager(); + pluginManager.apply(ArtifactoryPlugin.class); + + project.getPlugins().withType(ArtifactoryPlugin.class, artifactory -> { + Task task = project.getTasks().findByName(ArtifactoryTask.ARTIFACTORY_PUBLISH_TASK_NAME); + if (task != null) { + ArtifactoryTask aTask = (ArtifactoryTask) task; + aTask.setCiServerBuild(); + // bom is not a java project so plugin doesn't + // add defaults for publications. + aTask.publications("mavenJava"); + aTask.publishConfigs("archives"); + + // plugin is difficult to work with, use this hack + // to set props before task does its real work + task.doFirst(t -> { + // this needs mods if we ever have zips other than + // docs zip having asciidoc/javadoc. + ArtifactoryTask at = (ArtifactoryTask) t; + ArtifactSpecs artifactSpecs = at.getArtifactSpecs(); + Map propsMap = new HashMap<>(); + propsMap.put("zip.deployed", "false"); + propsMap.put("zip.type", "docs"); + ArtifactSpec spec = ArtifactSpec.builder() + .artifactNotation("*:*:*:*@zip") + // archives is manually set for zip in root plugin + .configuration("archives") + .properties(propsMap) + .build(); + artifactSpecs.add(spec); + }); + } + }); + } +} diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/BomPlugin.java b/buildSrc/src/main/java/org/springframework/shell/gradle/BomPlugin.java new file mode 100644 index 00000000..a7470f0f --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/BomPlugin.java @@ -0,0 +1,47 @@ +/* + * Copyright 2022 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 + * + * https://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.shell.gradle; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.artifacts.dsl.DependencyConstraintHandler; +import org.gradle.api.plugins.JavaPlatformPlugin; +import org.gradle.api.plugins.PluginManager; + +/** + * @author Janne Valkealahti + */ +class BomPlugin implements Plugin { + + @Override + public void apply(Project project) { + PluginManager pluginManager = project.getPluginManager(); + pluginManager.apply(SpringMavenPlugin.class); + pluginManager.apply(JavaPlatformPlugin.class); + new ArtifactoryConventions().apply(project); + + // bom should have main shell modules and starters + DependencyConstraintHandler constraints = project.getDependencies().getConstraints(); + project.getRootProject().getAllprojects().forEach(p -> { + p.getPlugins().withType(ModulePlugin.class, m -> { + constraints.add("api", p); + }); + p.getPlugins().withType(StarterPlugin.class, m -> { + constraints.add("api", p); + }); + }); + } +} diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/DocsPlugin.java b/buildSrc/src/main/java/org/springframework/shell/gradle/DocsPlugin.java new file mode 100644 index 00000000..99f78d84 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/DocsPlugin.java @@ -0,0 +1,215 @@ +/* + * Copyright 2022 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 + * + * https://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.shell.gradle; + +import java.io.File; +import java.net.URI; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.function.Consumer; + +import org.asciidoctor.gradle.base.AsciidoctorAttributeProvider; +import org.asciidoctor.gradle.jvm.AbstractAsciidoctorTask; +import org.asciidoctor.gradle.jvm.AsciidoctorJPlugin; +import org.asciidoctor.gradle.jvm.AsciidoctorTask; +import org.gradle.api.Action; +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.plugins.JavaLibraryPlugin; +import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.plugins.PluginManager; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.dsl.RepositoryHandler; +import org.gradle.api.file.CopySpec; +import org.gradle.api.file.FileTree; +import org.gradle.api.tasks.Sync; + +/** + * @author Janne Valkealahti + */ +class DocsPlugin implements Plugin { + + @Override + public void apply(Project project) { + PluginManager pluginManager = project.getPluginManager(); + pluginManager.apply(JavaPlugin.class); + pluginManager.apply(JavaLibraryPlugin.class); + pluginManager.apply(ManagementConfigurationPlugin.class); + pluginManager.apply(SpringMavenPlugin.class); + pluginManager.apply(AsciidoctorJPlugin.class); + + configureAdocPlugins(project); + } + + private void configureAdocPlugins(Project project) { + project.getPlugins().withType(AsciidoctorJPlugin.class, (asciidoctorPlugin) -> { + createDefaultAsciidoctorRepository(project); + makeAllWarningsFatal(project); + Sync unzipResources = createUnzipDocumentationResourcesTask(project); + Sync snippetsResources = createSnippetsResourcesTask(project); + project.getTasks().withType(AbstractAsciidoctorTask.class, (asciidoctorTask) -> { + asciidoctorTask.dependsOn(unzipResources); + asciidoctorTask.dependsOn(snippetsResources); + // configureExtensions(project, asciidoctorTask); + configureCommonAttributes(project, asciidoctorTask); + configureOptions(asciidoctorTask); + asciidoctorTask.sourceDir("src/main/asciidoc"); + asciidoctorTask.baseDirFollowsSourceDir(); + asciidoctorTask.useIntermediateWorkDir(); + asciidoctorTask.resources(new Action() { + @Override + public void execute(CopySpec resourcesSpec) { + resourcesSpec.from(unzipResources); + // resourcesSpec.from(snippetsResources); + resourcesSpec.from(snippetsResources, copySpec -> { + copySpec.include("docs/*"); + }); + resourcesSpec.from(asciidoctorTask.getSourceDir(), new Action() { + @Override + public void execute(CopySpec resourcesSrcDirSpec) { + // https://github.com/asciidoctor/asciidoctor-gradle-plugin/issues/523 + // For now copy the entire sourceDir over so that include files are + // available in the intermediateWorkDir + resourcesSrcDirSpec.include("images/*"); + } + }); + } + }); + if (asciidoctorTask instanceof AsciidoctorTask) { + configureHtmlOnlyAttributes(project, asciidoctorTask); + } + }); + }); + } + + private void createDefaultAsciidoctorRepository(Project project) { + project.getGradle().afterProject(new Action() { + @Override + public void execute(Project project) { + RepositoryHandler repositories = project.getRepositories(); + if (repositories.isEmpty()) { + repositories.mavenCentral(); + repositories.maven(repo -> { + repo.setUrl(URI.create("https://repo.spring.io/release")); + }); + } + } + }); + } + + private void makeAllWarningsFatal(Project project) { + // project.getExtensions().getByType(AsciidoctorJExtension.class).fatalWarnings(".*"); + } + + // private void configureExtensions(Project project, AbstractAsciidoctorTask asciidoctorTask) { + // Configuration extensionsConfiguration = project.getConfigurations().maybeCreate("asciidoctorExtensions"); + // extensionsConfiguration.defaultDependencies(new Action() { + // @Override + // public void execute(DependencySet dependencies) { + // dependencies.add(project.getDependencies().create("io.spring.asciidoctor:spring-asciidoctor-extensions-block-switch:0.4.2.RELEASE")); + // } + // }); + // asciidoctorTask.configurations(extensionsConfiguration); + // } + + private Sync createSnippetsResourcesTask(Project project) { + Sync sync = project.getTasks().create("snippetResources", Sync.class, s -> { + s.from(new File(project.getRootProject().getRootDir(), "spring-shell-docs/src/test/java/org/springframework/shell"), spec -> { + spec.include("docs/*"); + }); + File destination = new File(project.getBuildDir(), "docs/snippets"); + s.into(destination); + }); + return sync; + } + + private Sync createUnzipDocumentationResourcesTask(Project project) { + Configuration documentationResources = project.getConfigurations().maybeCreate("documentationResources"); + documentationResources.getDependencies() + .add(project.getDependencies().create("io.spring.docresources:spring-doc-resources:0.2.5")); + Sync unzipResources = project.getTasks().create("unzipDocumentationResources", + Sync.class, new Action() { + @Override + public void execute(Sync sync) { + sync.dependsOn(documentationResources); + sync.from(new Callable>() { + @Override + public List call() throws Exception { + List result = new ArrayList<>(); + documentationResources.getAsFileTree().forEach(new Consumer() { + @Override + public void accept(File file) { + result.add(project.zipTree(file)); + } + }); + return result; + } + }); + File destination = new File(project.getBuildDir(), "docs/resources"); + sync.into(project.relativePath(destination)); + } + }); + return unzipResources; + } + + private void configureOptions(AbstractAsciidoctorTask asciidoctorTask) { + asciidoctorTask.options(Collections.singletonMap("doctype", "book")); + } + + private void configureHtmlOnlyAttributes(Project project, AbstractAsciidoctorTask asciidoctorTask) { + Map attributes = new HashMap<>(); + attributes.put("toc", "left"); + attributes.put("source-highlighter", "highlight.js"); + attributes.put("highlightjsdir", "js/highlight"); + attributes.put("highlightjs-theme", "github"); + attributes.put("linkcss", true); + attributes.put("icons", "font"); + attributes.put("stylesheet", "css/spring.css"); + attributes.put("snippets", "docs"); + asciidoctorTask.getAttributeProviders().add(new AsciidoctorAttributeProvider() { + @Override + public Map getAttributes() { + Object version = project.getVersion(); + Map attrs = new HashMap<>(); + if (version != null && version.toString() != Project.DEFAULT_VERSION) { + attrs.put("revnumber", version); + attrs.put("projectVersion", version); + } + return attrs; + } + }); + asciidoctorTask.attributes(attributes); + } + + private void configureCommonAttributes(Project project, AbstractAsciidoctorTask asciidoctorTask) { + Map attributes = new HashMap<>(); + // attributes.put("attribute-missing", "warn"); + attributes.put("icons", "font"); + attributes.put("idprefix", ""); + attributes.put("idseparator", "-"); + attributes.put("docinfo", "shared"); + attributes.put("sectanchors", ""); + attributes.put("sectnums", ""); + attributes.put("today-year", LocalDate.now().getYear()); + asciidoctorTask.attributes(attributes); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/ManagementConfigurationPlugin.java b/buildSrc/src/main/java/org/springframework/shell/gradle/ManagementConfigurationPlugin.java new file mode 100644 index 00000000..8c5c1dc7 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/ManagementConfigurationPlugin.java @@ -0,0 +1,68 @@ +/* + * Copyright 2022 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 + * + * https://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.shell.gradle; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.artifacts.ConfigurationContainer; +import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.plugins.JavaTestFixturesPlugin; +import org.gradle.api.plugins.PluginContainer; +import org.gradle.api.publish.PublishingExtension; +import org.gradle.api.publish.maven.MavenPublication; +import org.gradle.api.publish.maven.plugins.MavenPublishPlugin; + +/** + * Creates a Management configuration that is appropriate for adding a platform + * to that is not exposed externally. If the JavaPlugin is applied, the + * compileClasspath, runtimeClasspath, testCompileClasspath, and + * testRuntimeClasspath will extend from it. + * + * @author Janne Valkealahti + */ +public class ManagementConfigurationPlugin implements Plugin { + + public static final String MANAGEMENT_CONFIGURATION_NAME = "management"; + + @Override + public void apply(Project project) { + ConfigurationContainer configurations = project.getConfigurations(); + configurations.create(MANAGEMENT_CONFIGURATION_NAME, (management) -> { + management.setVisible(false); + management.setCanBeConsumed(false); + management.setCanBeResolved(false); + PluginContainer plugins = project.getPlugins(); + plugins.withType(JavaPlugin.class, (javaPlugin) -> { + configurations.getByName(JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME).extendsFrom(management); + configurations.getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME).extendsFrom(management); + configurations.getByName(JavaPlugin.TEST_COMPILE_CLASSPATH_CONFIGURATION_NAME).extendsFrom(management); + configurations.getByName(JavaPlugin.TEST_RUNTIME_CLASSPATH_CONFIGURATION_NAME).extendsFrom(management); + }); + plugins.withType(JavaTestFixturesPlugin.class, (javaTestFixturesPlugin) -> { + configurations.getByName("testFixturesCompileClasspath").extendsFrom(management); + configurations.getByName("testFixturesRuntimeClasspath").extendsFrom(management); + }); + plugins.withType(MavenPublishPlugin.class, (mavenPublish) -> { + PublishingExtension publishing = project.getExtensions().getByType(PublishingExtension.class); + publishing.getPublications().withType(MavenPublication.class, (mavenPublication -> { + mavenPublication.versionMapping((versions) -> + versions.allVariants(versionMapping -> versionMapping.fromResolutionResult()) + ); + })); + }); + }); + } +} diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/ModulePlugin.java b/buildSrc/src/main/java/org/springframework/shell/gradle/ModulePlugin.java new file mode 100644 index 00000000..51a601d2 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/ModulePlugin.java @@ -0,0 +1,55 @@ +/* + * Copyright 2022 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 + * + * https://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.shell.gradle; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.plugins.JavaBasePlugin; +import org.gradle.api.plugins.JavaLibraryPlugin; +import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.plugins.PluginManager; +import org.gradle.api.tasks.javadoc.Javadoc; +import org.gradle.api.tasks.testing.Test; +import org.gradle.external.javadoc.CoreJavadocOptions; + +/** + * @author Janne Valkealahti + */ +class ModulePlugin implements Plugin { + + @Override + public final void apply(Project project) { + PluginManager pluginManager = project.getPluginManager(); + pluginManager.apply(JavaPlugin.class); + pluginManager.apply(ManagementConfigurationPlugin.class); + pluginManager.apply(JavaLibraryPlugin.class); + pluginManager.apply(SpringMavenPlugin.class); + new ArtifactoryConventions().apply(project); + + project.getPlugins().withType(JavaBasePlugin.class, java -> { + project.getTasks().withType(Javadoc.class, (javadoc) -> { + CoreJavadocOptions options = (CoreJavadocOptions) javadoc.getOptions(); + options.source("17"); + options.encoding("UTF-8"); + options.addStringOption("Xdoclint:none", "-quiet"); + }); + + project.getTasks().withType(Test.class, test -> { + test.useJUnitPlatform(); + }); + }); + } +} diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/PublishAllJavaComponentsPlugin.java b/buildSrc/src/main/java/org/springframework/shell/gradle/PublishAllJavaComponentsPlugin.java new file mode 100644 index 00000000..4545d637 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/PublishAllJavaComponentsPlugin.java @@ -0,0 +1,47 @@ +/* + * Copyright 2022 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 + * + * https://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.shell.gradle; + +import org.gradle.api.Action; +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.component.SoftwareComponent; +import org.gradle.api.plugins.JavaPlatformPlugin; +import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.publish.PublishingExtension; +import org.gradle.api.publish.maven.MavenPublication; +import org.gradle.api.publish.maven.plugins.MavenPublishPlugin; + +public class PublishAllJavaComponentsPlugin implements Plugin { + + @Override + public void apply(Project project) { + project.getPlugins().withType(MavenPublishPlugin.class).all((mavenPublish) -> { + PublishingExtension publishing = project.getExtensions().getByType(PublishingExtension.class); + publishing.getPublications().create("mavenJava", MavenPublication.class, new Action() { + @Override + public void execute(MavenPublication maven) { + project.getPlugins().withType(JavaPlugin.class, (plugin) -> { + maven.from(project.getComponents().getByName("java")); + }); + project.getPlugins().withType(JavaPlatformPlugin.class, (plugin) -> { + maven.from(project.getComponents().getByName("javaPlatform")); + }); + } + }); + }); + } +} diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/PublishLocalPlugin.java b/buildSrc/src/main/java/org/springframework/shell/gradle/PublishLocalPlugin.java new file mode 100644 index 00000000..fd7c0ae1 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/PublishLocalPlugin.java @@ -0,0 +1,37 @@ +/* + * Copyright 2022 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 + * + * https://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.shell.gradle; + +import java.io.File; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.publish.PublishingExtension; +import org.gradle.api.publish.maven.plugins.MavenPublishPlugin; + +public class PublishLocalPlugin implements Plugin { + + @Override + public void apply(Project project) { + + project.getPlugins().withType(MavenPublishPlugin.class).all(mavenPublish -> { + project.getExtensions().getByType(PublishingExtension.class).getRepositories().maven(maven -> { + maven.setName("local"); + maven.setUrl(new File(project.getRootProject().getBuildDir(), "publications/repos")); + }); + }); + } +} diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/RootPlugin.java b/buildSrc/src/main/java/org/springframework/shell/gradle/RootPlugin.java new file mode 100644 index 00000000..db8bfcf6 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/RootPlugin.java @@ -0,0 +1,97 @@ +/* + * Copyright 2022 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 + * + * https://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.shell.gradle; + +import java.io.File; + +import org.asciidoctor.gradle.jvm.AsciidoctorJPlugin; +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.plugins.JavaPluginConvention; +import org.gradle.api.plugins.PluginManager; +import org.gradle.api.publish.maven.plugins.MavenPublishPlugin; +import org.gradle.api.tasks.SourceSet; +import org.gradle.api.tasks.bundling.Zip; +import org.gradle.api.tasks.javadoc.Javadoc; +import org.gradle.external.javadoc.CoreJavadocOptions; + +/** + * Manages tasks creating zip file for docs and publishing it. + * + * @author Janne Valkealahti + */ +class RootPlugin implements Plugin { + + @Override + public void apply(Project project) { + PluginManager pluginManager = project.getPluginManager(); + pluginManager.apply(MavenPublishPlugin.class); + pluginManager.apply(PublishLocalPlugin.class); + new ArtifactoryConventions().apply(project); + Javadoc apiTask = createApiTask(project); + Zip zipTask = createZipTask(project); + zipTask.dependsOn(apiTask); + } + + private Zip createZipTask(Project project) { + Zip zipTask = project.getTasks().create("distZip", Zip.class, zip -> { + zip.setGroup("Distribution"); + zip.from("spring-shell-docs/build/docs/asciidoc", copy -> { + copy.into("docs"); + }); + zip.from("build/api", copy -> { + copy.into("api"); + }); + }); + + project.getRootProject().getAllprojects().forEach(p -> { + p.getPlugins().withType(AsciidoctorJPlugin.class, a -> { + p.getTasksByName("asciidoctor", false).forEach(t -> { + zipTask.dependsOn(t); + });; + }); + }); + + project.getArtifacts().add("archives", zipTask); + return zipTask; + } + + private Javadoc createApiTask(Project project) { + Javadoc api = project.getTasks().create("api", Javadoc.class, a -> { + a.setGroup("Documentation"); + a.setDescription("Generates aggregated Javadoc API documentation."); + a.setDestinationDir(new File(project.getBuildDir(), "api")); + CoreJavadocOptions options = (CoreJavadocOptions) a.getOptions(); + options.source("17"); + options.encoding("UTF-8"); + options.addStringOption("Xdoclint:none", "-quiet"); + }); + + project.getRootProject().getSubprojects().forEach(p -> { + p.getPlugins().withType(ModulePlugin.class, m -> { + JavaPluginConvention java = p.getConvention().getPlugin(JavaPluginConvention.class); + SourceSet mainSourceSet = java.getSourceSets().getByName("main"); + + api.setSource(api.getSource().plus(mainSourceSet.getAllJava())); + + p.getTasks().withType(Javadoc.class, j -> { + api.setClasspath(api.getClasspath().plus(j.getClasspath())); + }); + }); + }); + return api; + } +} diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/SamplePlugin.java b/buildSrc/src/main/java/org/springframework/shell/gradle/SamplePlugin.java new file mode 100644 index 00000000..1504aee8 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/SamplePlugin.java @@ -0,0 +1,34 @@ +/* + * Copyright 2022 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 + * + * https://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.shell.gradle; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.plugins.PluginManager; + +/** + * @author Janne Valkealahti + */ +class SamplePlugin implements Plugin { + + @Override + public void apply(Project project) { + PluginManager pluginManager = project.getPluginManager(); + pluginManager.apply(JavaPlugin.class); + pluginManager.apply(ManagementConfigurationPlugin.class); + } +} diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/SpringMavenPlugin.java b/buildSrc/src/main/java/org/springframework/shell/gradle/SpringMavenPlugin.java new file mode 100644 index 00000000..5861865c --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/SpringMavenPlugin.java @@ -0,0 +1,100 @@ +/* + * Copyright 2022 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 + * + * https://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.shell.gradle; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.plugins.JavaPluginExtension; +import org.gradle.api.plugins.PluginManager; +import org.gradle.api.publish.PublishingExtension; +import org.gradle.api.publish.maven.MavenPom; +import org.gradle.api.publish.maven.MavenPomDeveloperSpec; +import org.gradle.api.publish.maven.MavenPomIssueManagement; +import org.gradle.api.publish.maven.MavenPomLicenseSpec; +import org.gradle.api.publish.maven.MavenPomOrganization; +import org.gradle.api.publish.maven.MavenPomScm; +import org.gradle.api.publish.maven.MavenPublication; +import org.gradle.api.publish.maven.plugins.MavenPublishPlugin; + +public class SpringMavenPlugin implements Plugin { + + @Override + public void apply(Project project) { + PluginManager pluginManager = project.getPluginManager(); + pluginManager.apply(MavenPublishPlugin.class); + pluginManager.apply(PublishLocalPlugin.class); + pluginManager.apply(PublishAllJavaComponentsPlugin.class); + + project.getPlugins().withType(MavenPublishPlugin.class).all(mavenPublish -> { + PublishingExtension publishing = project.getExtensions().getByType(PublishingExtension.class); + publishing.getPublications().withType(MavenPublication.class) + .all(mavenPublication -> customizeMavenPublication(mavenPublication, project)); + project.getPlugins().withType(JavaPlugin.class).all(javaPlugin -> { + JavaPluginExtension extension = project.getExtensions().getByType(JavaPluginExtension.class); + extension.withJavadocJar(); + extension.withSourcesJar(); + }); + }); + } + + private void customizeMavenPublication(MavenPublication publication, Project project) { + customizePom(publication.getPom(), project); + } + + private void customizePom(MavenPom pom, Project project) { + pom.getUrl().set("https://spring.io/projects/spring-shell"); + pom.getName().set(project.provider(project::getName)); + pom.getDescription().set(project.provider(project::getDescription)); + pom.organization(this::customizeOrganization); + pom.licenses(this::customizeLicences); + pom.developers(this::customizeDevelopers); + pom.scm(scm -> customizeScm(scm, project)); + pom.issueManagement(this::customizeIssueManagement); + } + + private void customizeOrganization(MavenPomOrganization organization) { + organization.getName().set("Pivotal Software, Inc."); + organization.getUrl().set("https://spring.io"); + } + + private void customizeLicences(MavenPomLicenseSpec licences) { + licences.license(licence -> { + licence.getName().set("Apache License, Version 2.0"); + licence.getUrl().set("https://www.apache.org/licenses/LICENSE-2.0"); + }); + } + + private void customizeDevelopers(MavenPomDeveloperSpec developers) { + developers.developer((developer) -> { + developer.getName().set("Pivotal"); + developer.getEmail().set("info@pivotal.io"); + developer.getOrganization().set("Pivotal Software, Inc."); + developer.getOrganizationUrl().set("https://www.spring.io"); + }); + } + + private void customizeScm(MavenPomScm scm, Project project) { + scm.getConnection().set("scm:git:git://github.com/spring-projects/spring-shell.git"); + scm.getDeveloperConnection().set("scm:git:ssh://git@github.com/spring-projects/spring-shell.git"); + scm.getUrl().set("https://github.com/spring-projects/spring-shell"); + } + + private void customizeIssueManagement(MavenPomIssueManagement issueManagement) { + issueManagement.getSystem().set("GitHub"); + issueManagement.getUrl().set("https://github.com/spring-projects/spring-shell/issues"); + } +} diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/StarterPlugin.java b/buildSrc/src/main/java/org/springframework/shell/gradle/StarterPlugin.java new file mode 100644 index 00000000..e0979ddc --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/StarterPlugin.java @@ -0,0 +1,39 @@ +/* + * Copyright 2022 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 + * + * https://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.shell.gradle; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.plugins.JavaLibraryPlugin; +import org.gradle.api.plugins.PluginContainer; +import org.gradle.api.plugins.PluginManager; + +/** + * @author Janne Valkealahti + */ +class StarterPlugin implements Plugin { + + @Override + public void apply(Project project) { + PluginManager pluginManager = project.getPluginManager(); + pluginManager.apply(ManagementConfigurationPlugin.class); + PluginContainer plugins = project.getPlugins(); + plugins.apply(JavaLibraryPlugin.class); + pluginManager.apply(SpringMavenPlugin.class); + + new ArtifactoryConventions().apply(project); + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..4a987ec1 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,5 @@ +version=3.0.0-SNAPSHOT +springBootVersion=3.0.0-SNAPSHOT +jlineVersion=3.21.0 +st4Version=4.3.1 +jimfsVersion=1.2 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000..7454180f Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..aa991fce --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 00000000..1b6c7873 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original 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 +# +# https://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. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..ac1b06f9 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..fbb90ba6 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,36 @@ +pluginManagement { + repositories { + maven { url 'https://repo.spring.io/plugins-release' } + mavenCentral() + gradlePluginPortal() + maven { url 'https://repo.spring.io/release' } + if (version.contains('-')) { + maven { url 'https://repo.spring.io/milestone' } + } + if (version.endsWith('-SNAPSHOT')) { + maven { url 'https://repo.spring.io/snapshot' } + } + } + plugins { + id 'org.springframework.boot' version "$springBootVersion" + } +} + +rootProject.name = 'spring-shell' + +include 'spring-shell-autoconfigure' +include 'spring-shell-core' +include 'spring-shell-core-test-support' +include 'spring-shell-management' +include 'spring-shell-dependencies' +include 'spring-shell-docs' +include 'spring-shell-samples' +include 'spring-shell-standard' +include 'spring-shell-standard-commands' +include 'spring-shell-starter' +include 'spring-shell-starter-jna' +include 'spring-shell-table' + +rootProject.children.each {project -> + project.buildFileName = "${project.name}.gradle" +} diff --git a/spring-shell-autoconfigure/spring-shell-autoconfigure.gradle b/spring-shell-autoconfigure/spring-shell-autoconfigure.gradle new file mode 100644 index 00000000..fd518033 --- /dev/null +++ b/spring-shell-autoconfigure/spring-shell-autoconfigure.gradle @@ -0,0 +1,14 @@ +plugins { + id 'org.springframework.shell.module' +} + +description = 'Spring Shell Autoconfigure' + +dependencies { + management platform(project(":spring-shell-management")) + implementation 'org.springframework.boot:spring-boot-autoconfigure' + implementation project(':spring-shell-core') + implementation project(':spring-shell-standard') + implementation project(':spring-shell-standard-commands') + testImplementation 'org.springframework.boot:spring-boot-starter-test' +} diff --git a/spring-shell-core-test-support/spring-shell-core-test-support.gradle b/spring-shell-core-test-support/spring-shell-core-test-support.gradle new file mode 100644 index 00000000..b2631849 --- /dev/null +++ b/spring-shell-core-test-support/spring-shell-core-test-support.gradle @@ -0,0 +1,11 @@ +plugins { + id 'org.springframework.shell.module' +} + +description = 'Spring Shell Core Test Support' + +dependencies { + management platform(project(":spring-shell-management")) + implementation project(':spring-shell-core') + api('org.assertj:assertj-core') +} diff --git a/spring-shell-core/spring-shell-core.gradle b/spring-shell-core/spring-shell-core.gradle new file mode 100644 index 00000000..cedaec18 --- /dev/null +++ b/spring-shell-core/spring-shell-core.gradle @@ -0,0 +1,18 @@ +plugins { + id 'org.springframework.shell.module' +} + +description = 'Spring Shell Core' + +dependencies { + management platform(project(":spring-shell-management")) + implementation project(':spring-shell-table') + api('org.springframework:spring-core') + api('org.springframework.boot:spring-boot-starter-validation') + api('org.springframework:spring-messaging') + api('org.jline:jline') + api('org.antlr:ST4') + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.awaitility:awaitility' + testImplementation 'com.google.jimfs:jimfs' +} diff --git a/spring-shell-dependencies/spring-shell-dependencies.gradle b/spring-shell-dependencies/spring-shell-dependencies.gradle new file mode 100644 index 00000000..1a810588 --- /dev/null +++ b/spring-shell-dependencies/spring-shell-dependencies.gradle @@ -0,0 +1,5 @@ +plugins { + id 'org.springframework.shell.bom' +} + +description = 'Spring Shell BOM' diff --git a/spring-shell-docs/spring-shell-docs.gradle b/spring-shell-docs/spring-shell-docs.gradle new file mode 100644 index 00000000..605051b2 --- /dev/null +++ b/spring-shell-docs/spring-shell-docs.gradle @@ -0,0 +1,15 @@ +plugins { + id 'org.springframework.shell.docs' +} + +description = 'Spring Shell Documentation' + +dependencies { + management platform(project(":spring-shell-management")) + implementation project(':spring-shell-starter') + testImplementation 'org.springframework.boot:spring-boot-starter-test' +} + +asciidoctorj { + version = '2.5.4' +} diff --git a/spring-shell-management/spring-shell-management.gradle b/spring-shell-management/spring-shell-management.gradle new file mode 100644 index 00000000..eb29a254 --- /dev/null +++ b/spring-shell-management/spring-shell-management.gradle @@ -0,0 +1,18 @@ +plugins { + id 'java-platform' + id 'maven-publish' +} + +javaPlatform { + allowDependencies() +} + +description = 'Spring Shell BOM' + +dependencies { + api platform("org.springframework.boot:spring-boot-dependencies:$springBootVersion") + api "org.jline:jline:$jlineVersion" + api "org.jline:jline-terminal-jna:$jlineVersion" + api "org.antlr:ST4:$st4Version" + api "com.google.jimfs:jimfs:$jimfsVersion" +} diff --git a/spring-shell-samples/spring-shell-samples.gradle b/spring-shell-samples/spring-shell-samples.gradle new file mode 100644 index 00000000..b3e3807e --- /dev/null +++ b/spring-shell-samples/spring-shell-samples.gradle @@ -0,0 +1,12 @@ +plugins { + id 'org.springframework.shell.sample' + id 'org.springframework.boot' +} + +description = 'Spring Shell Samples' + +dependencies { + management platform(project(":spring-shell-management")) + implementation project(':spring-shell-starter-jna') + testImplementation 'org.springframework.boot:spring-boot-starter-test' +} diff --git a/spring-shell-standard-commands/spring-shell-standard-commands.gradle b/spring-shell-standard-commands/spring-shell-standard-commands.gradle new file mode 100644 index 00000000..eea11658 --- /dev/null +++ b/spring-shell-standard-commands/spring-shell-standard-commands.gradle @@ -0,0 +1,12 @@ +plugins { + id 'org.springframework.shell.module' +} + +description = 'Spring Shell Standard Commands' + +dependencies { + management platform(project(":spring-shell-management")) + implementation project(':spring-shell-core') + implementation project(':spring-shell-standard') + testImplementation 'org.springframework.boot:spring-boot-starter-test' +} diff --git a/spring-shell-standard/spring-shell-standard.gradle b/spring-shell-standard/spring-shell-standard.gradle new file mode 100644 index 00000000..61ae82f7 --- /dev/null +++ b/spring-shell-standard/spring-shell-standard.gradle @@ -0,0 +1,11 @@ +plugins { + id 'org.springframework.shell.module' +} + +description = 'Spring Shell Standard' + +dependencies { + management platform(project(":spring-shell-management")) + implementation project(':spring-shell-core') + testImplementation 'org.springframework.boot:spring-boot-starter-test' +} diff --git a/spring-shell-starter-jna/spring-shell-starter-jna.gradle b/spring-shell-starter-jna/spring-shell-starter-jna.gradle new file mode 100644 index 00000000..eada79af --- /dev/null +++ b/spring-shell-starter-jna/spring-shell-starter-jna.gradle @@ -0,0 +1,11 @@ +plugins { + id 'org.springframework.shell.starter' +} + +description = 'Spring Shell Starter Jna' + +dependencies { + management platform(project(':spring-shell-management')) + api(project(':spring-shell-starter')) + implementation 'org.jline:jline-terminal-jna' +} diff --git a/spring-shell-starter/spring-shell-starter.gradle b/spring-shell-starter/spring-shell-starter.gradle new file mode 100644 index 00000000..2967e9d5 --- /dev/null +++ b/spring-shell-starter/spring-shell-starter.gradle @@ -0,0 +1,15 @@ +plugins { + id 'org.springframework.shell.starter' +} + +description = 'Spring Shell Starter' + +dependencies { + management platform(project(":spring-shell-management")) + api(project(":spring-shell-autoconfigure")) + api(project(":spring-shell-core")) + api(project(":spring-shell-standard")) + api(project(":spring-shell-standard-commands")) + api(project(":spring-shell-table")) + api 'org.springframework.boot:spring-boot-starter' +} diff --git a/spring-shell-table/spring-shell-table.gradle b/spring-shell-table/spring-shell-table.gradle new file mode 100644 index 00000000..ae5f5613 --- /dev/null +++ b/spring-shell-table/spring-shell-table.gradle @@ -0,0 +1,12 @@ +plugins { + id 'org.springframework.shell.module' +} + +description = 'Spring Shell Table' + +dependencies { + management platform(project(":spring-shell-management")) + api('org.springframework:spring-core') + api('org.springframework:spring-context') + testImplementation 'org.springframework.boot:spring-boot-starter-test' +}