From ce99db19028b54886ae99c1fd916e613a982b65f Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 10 Jan 2020 13:48:43 +0000 Subject: [PATCH] Port the build to Gradle Closes gh-19609 Closes gh-19608 --- .bomr/bomr.yaml | 28 - .gitignore | 4 + .mvn/jvm.config | 1 - .mvn/wrapper/maven-wrapper.jar | Bin 50709 -> 0 bytes .mvn/wrapper/maven-wrapper.properties | 2 - CONTRIBUTING.adoc | 105 +- build.gradle | 20 + buildSrc/README.adoc | 26 + buildSrc/build.gradle | 84 + buildSrc/settings.gradle | 16 + .../boot/build/AsciidoctorConventions.java | 213 + .../boot/build/ConventionsPlugin.java | 207 + .../boot/build/DeployedPlugin.java | 54 + .../boot/build/MavenRepositoryPlugin.java | 111 + .../AutoConfigurationMetadata.java | 93 + .../AutoConfigurationPlugin.java | 78 + .../DocumentAutoConfigurationClasses.java | 136 + .../boot/build/bom/BomExtension.java | 297 ++ .../boot/build/bom/BomPlugin.java | 295 ++ .../boot/build/bom/CheckBom.java | 86 + .../boot/build/bom/Library.java | 196 + .../boot/build/bom/UpgradePolicy.java | 61 + .../bom/bomr/InteractiveUpgradeResolver.java | 142 + .../bomr/MavenMetadataVersionResolver.java | 98 + .../boot/build/bom/bomr/Upgrade.java | 46 + .../boot/build/bom/bomr/UpgradeBom.java | 146 + .../boot/build/bom/bomr/UpgradeResolver.java | 38 + .../boot/build/bom/bomr/VersionResolver.java | 39 + .../boot/build/bom/bomr/github/GitHub.java | 46 + .../bom/bomr/github/GitHubRepository.java | 50 + .../boot/build/bom/bomr/github/Milestone.java | 56 + .../build/bom/bomr/github/StandardGitHub.java | 74 + .../bomr/github/StandardGitHubRepository.java | 74 + .../version/AbstractDependencyVersion.java | 69 + .../ArtifactVersionDependencyVersion.java | 100 + ...nedPatchAndQualifierDependencyVersion.java | 58 + .../bom/bomr/version/DependencyVersion.java | 69 + .../LeadingZeroesDependencyVersion.java | 56 + .../NumericQualifierDependencyVersion.java | 56 + .../ReleaseTrainDependencyVersion.java | 125 + .../UnstructuredDependencyVersion.java | 60 + .../classpath/CheckClasspathForConflicts.java | 135 + ...eckClasspathForProhibitedDependencies.java | 85 + .../AbstractPackageManagerDefinitionTask.java | 112 + .../boot/build/cli/HomebrewFormula.java | 35 + .../boot/build/cli/ScoopManifest.java | 36 + .../DocumentConstrainedVersions.java | 81 + .../ExtractVersionConstraints.java | 139 + .../context/properties/AsciidocBuilder.java | 59 + .../CompoundConfigurationTableEntry.java | 51 + .../ConfigurationMetadataDocumentWriter.java | 125 + .../properties/ConfigurationProperties.java | 81 + .../ConfigurationPropertiesPlugin.java | 94 + .../properties/ConfigurationProperty.java | 68 + .../properties/ConfigurationTable.java | 60 + .../properties/ConfigurationTableEntry.java | 56 + .../DocumentConfigurationProperties.java | 95 + .../context/properties/DocumentOptions.java | 98 + .../SingleConfigurationTableEntry.java | 82 + .../ReproducibleLog4j2PluginsDatAction.java | 111 + .../mavenplugin/DocumentPluginGoals.java | 194 + .../boot/build/mavenplugin/MavenExec.java | 101 + .../build/mavenplugin/MavenPluginPlugin.java | 211 + .../build/mavenplugin/PluginXmlParser.java | 287 ++ .../mavenplugin/PrepareMavenBinaries.java | 70 + .../optional/OptionalDependenciesPlugin.java | 65 + .../boot/build/starters/DocumentStarters.java | 163 + .../boot/build/starters/StarterMetadata.java | 82 + .../boot/build/starters/StarterPlugin.java | 78 + .../build/test/IntegrationTestPlugin.java | 82 + .../autoconfigure/DocumentTestSlices.java | 129 + .../test/autoconfigure/TestSliceMetadata.java | 172 + .../main/resources/effective-bom-settings.xml | 24 + .../boot/build/assertj/NodeAssert.java | 87 + .../build/bom/BomPluginIntegrationTests.java | 193 + ...ArtifactVersionDependencyVersionTests.java | 119 + .../bomr/version/DependencyVersionTests.java | 55 + ...umericQualifierDependencyVersionTests.java | 54 + .../ReleaseTrainDependencyVersionTests.java | 99 + .../CompoundConfigurationTableEntryTests.java | 47 + .../properties/ConfigurationTableTests.java | 48 + .../SingleConfigurationTableEntryTests.java | 110 + .../ReproduciblePluginsDatActionTests.java | 80 + .../mavenplugin/PluginXmlParserTests.java | 40 + ...nalDependenciesPluginIntegrationTests.java | 110 + buildSrc/src/test/resources/plugin.xml | 911 +++++ ci/pipeline.yml | 89 +- ci/scripts/build-deployment-tests.sh | 9 - ci/scripts/build-integration-tests.sh | 9 - ci/scripts/build-project-windows.bat | 4 +- ci/scripts/build-project.sh | 3 +- ci/scripts/build-smoke-tests.sh | 9 - ci/scripts/stage.sh | 13 +- ci/tasks/build-deployment-tests.yml | 10 - ci/tasks/build-integration-tests.yml | 10 - ci/tasks/build-pr-project.yml | 3 + ci/tasks/build-project.yml | 6 +- ci/tasks/build-smoke-tests.yml | 10 - ci/tasks/stage.yml | 4 + eclipse/spring-boot-project.setup | 14 +- gradle.properties | 7 + gradle/build-cache-settings.gradle | 18 + gradle/build-scan-user-data.gradle | 67 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58702 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 183 + gradlew.bat | 100 + pom.xml | 384 -- settings.gradle | 71 + spring-boot-project/pom.xml | 33 - .../build.gradle | 185 + .../pom.xml | 863 ---- .../docs/asciidoc/endpoints/auditevents.adoc | 40 + .../src/docs/asciidoc/endpoints/beans.adoc | 28 + .../src/docs/asciidoc/endpoints/caches.adoc | 89 + .../docs/asciidoc/endpoints/conditions.adoc | 28 + .../docs/asciidoc/endpoints/configprops.adoc | 28 + .../src/docs/asciidoc/endpoints/env.adoc | 53 + .../src/docs/asciidoc/endpoints/flyway.adoc | 28 + .../src/docs/asciidoc/endpoints/health.adoc | 75 + .../src/docs/asciidoc/endpoints/heapdump.adoc | 18 + .../docs/asciidoc/endpoints/httptrace.adoc | 28 + .../src/docs/asciidoc/endpoints/info.adoc | 46 + .../asciidoc/endpoints/integrationgraph.adoc | 35 + .../docs/asciidoc/endpoints/liquibase.adoc | 28 + .../src/docs/asciidoc/endpoints/logfile.adoc | 33 + .../src/docs/asciidoc/endpoints/loggers.adoc | 134 + .../src/docs/asciidoc/endpoints/mappings.adoc | 74 + .../src/docs/asciidoc/endpoints/metrics.adoc | 76 + .../docs/asciidoc/endpoints/prometheus.adoc | 17 + .../asciidoc/endpoints/scheduledtasks.adoc | 28 + .../src/docs/asciidoc/endpoints/sessions.adoc | 76 + .../src/docs/asciidoc/endpoints/shutdown.adoc | 28 + .../docs/asciidoc/endpoints/threaddump.adoc | 42 + .../src/{main => docs}/asciidoc/index.adoc | 0 .../main/asciidoc/endpoints/auditevents.adoc | 40 - .../src/main/asciidoc/endpoints/beans.adoc | 28 - .../src/main/asciidoc/endpoints/caches.adoc | 89 - .../main/asciidoc/endpoints/conditions.adoc | 28 - .../main/asciidoc/endpoints/configprops.adoc | 28 - .../src/main/asciidoc/endpoints/env.adoc | 53 - .../src/main/asciidoc/endpoints/flyway.adoc | 28 - .../src/main/asciidoc/endpoints/health.adoc | 75 - .../src/main/asciidoc/endpoints/heapdump.adoc | 18 - .../main/asciidoc/endpoints/httptrace.adoc | 28 - .../src/main/asciidoc/endpoints/info.adoc | 46 - .../asciidoc/endpoints/integrationgraph.adoc | 35 - .../main/asciidoc/endpoints/liquibase.adoc | 28 - .../src/main/asciidoc/endpoints/logfile.adoc | 33 - .../src/main/asciidoc/endpoints/loggers.adoc | 134 - .../src/main/asciidoc/endpoints/mappings.adoc | 74 - .../src/main/asciidoc/endpoints/metrics.adoc | 76 - .../main/asciidoc/endpoints/prometheus.adoc | 17 - .../asciidoc/endpoints/scheduledtasks.adoc | 28 - .../src/main/asciidoc/endpoints/sessions.adoc | 76 - .../src/main/asciidoc/endpoints/shutdown.adoc | 28 - .../main/asciidoc/endpoints/threaddump.adoc | 42 - .../spring-boot-actuator/build.gradle | 96 + .../spring-boot-actuator/pom.xml | 401 -- ...EndpointTestInvocationContextProvider.java | 9 +- .../spring-boot-autoconfigure/build.gradle | 185 + .../spring-boot-autoconfigure/pom.xml | 1044 ----- ...ctiveRestClientAutoConfigurationTests.java | 9 +- .../TransactionAutoConfigurationTests.java | 4 +- .../spring-boot-cli/build.gradle | 195 + spring-boot-project/spring-boot-cli/pom.xml | 469 --- .../boot/cli/CommandLineIT.java | 86 + .../boot/cli/JarCommandIT.java | 150 + .../boot/cli/WarCommandIT.java | 66 + .../infrastructure/CommandLineInvoker.java | 217 + .../resources/jar-command/bad.groovy | 0 .../resources/jar-command/jar.groovy | 0 .../resources/jar-command/public/public.txt | 0 .../jar-command/resources/resource.txt | 0 .../resources/jar-command/root.properties | 0 .../resources/jar-command/static/static.txt | 0 .../jar-command/templates/template.txt | 0 .../resources/run-command/quiet.groovy | 0 .../src/intTest/resources/settings.xml | 23 + .../resources/war-command/root.properties | 0 .../resources/war-command/war.groovy | 0 .../boot/cli/CommandLineIT.java | 85 - .../boot/cli/JarCommandIT.java | 155 - .../boot/cli/WarCommandIT.java | 69 - .../infrastructure/CommandLineInvoker.java | 213 - .../src/main/homebrew/springboot.rb | 2 +- ...gBootDependenciesDependencyManagement.java | 4 +- .../compiler/maven/MavenSettingsReader.java | 17 +- .../src/main/scoop/springboot.json | 12 +- .../springframework/boot/cli/CliTester.java | 7 +- .../boot/cli/GrabCommandIntegrationTests.java | 5 +- .../boot/cli/RunCommandIntegrationTests.java | 2 +- ...DependenciesDependencyManagementTests.java | 3 +- .../grape/AetherGrapeEngineTests.java | 11 +- .../src/test/resources/.m2/settings.xml | 5 +- .../resources/cli-tester/.m2/settings.xml | 44 + .../test/resources/run-command/quiet.groovy | 10 + .../spring-boot-dependencies/build.gradle | 1900 +++++++++ .../spring-boot-dependencies/pom.xml | 3531 ----------------- .../spring-boot-devtools/build.gradle | 86 + .../spring-boot-devtools/pom.xml | 220 - .../java/com/example/ControllerOne.java | 0 .../com/example/DevToolsTestApplication.java | 0 .../tests/AbstractApplicationLauncher.java | 0 .../AbstractDevToolsIntegrationTests.java | 113 + .../devtools/tests/ApplicationLauncher.java | 0 .../boot/devtools/tests/ApplicationState.java | 0 .../tests/DevToolsIntegrationTests.java | 163 + ...ithLazyInitializationIntegrationTests.java | 0 .../boot/devtools/tests/Directories.java | 0 .../ExplodedRemoteApplicationLauncher.java | 0 .../boot/devtools/tests/FileContents.java | 0 .../JarFileRemoteApplicationLauncher.java | 0 .../boot/devtools/tests/JvmLauncher.java | 0 .../devtools/tests/LaunchedApplication.java | 0 .../tests/LocalApplicationLauncher.java | 0 .../tests/RemoteApplicationLauncher.java | 0 .../META-INF/spring-devtools.properties | 10 +- .../filewatch/FileSystemWatcherTests.java | 11 +- .../devtools/restart/ChangeableUrlsTests.java | 2 +- .../DefaultRestartInitializerTests.java | 17 +- .../settings/DevToolsSettingsTests.java | 2 +- .../spring-boot-docs/build.gradle | 241 ++ spring-boot-project/spring-boot-docs/pom.xml | 1760 -------- .../appendix-application-properties.adoc | 78 + .../appendix-auto-configuration-classes.adoc | 24 + .../appendix-configuration-metadata.adoc | 860 ++++ .../appendix-dependency-versions.adoc | 14 + .../appendix-executable-jar-format.adoc | 281 ++ .../appendix-test-auto-configuration.adoc | 13 + .../src/docs/asciidoc/attributes.adoc | 108 + .../asciidoc/build-tool-plugins.adoc | 0 .../{main => docs}/asciidoc/deployment.adoc | 0 .../asciidoc/documentation-overview.adoc | 0 .../asciidoc/getting-started.adoc | 0 .../src/{main => docs}/asciidoc/howto.adoc | 0 .../{main => docs}/asciidoc/index-docinfo.xml | 0 .../{main => docs}/asciidoc/index.htmladoc | 0 .../asciidoc/index.htmlsingleadoc | 0 .../src/{main => docs}/asciidoc/legal.adoc | 0 .../asciidoc/production-ready-features.adoc | 0 .../asciidoc/spring-boot-cli.adoc | 0 .../asciidoc/spring-boot-features.adoc | 0 .../asciidoc/spring-boot-reference.pdfadoc | 0 .../src/docs/asciidoc/using-spring-boot.adoc | 1039 +++++ .../appendix-application-properties.adoc | 78 - .../appendix-auto-configuration-classes.adoc | 24 - .../appendix-configuration-metadata.adoc | 860 ---- .../appendix-dependency-versions.adoc | 14 - .../appendix-executable-jar-format.adoc | 281 -- .../appendix-test-auto-configuration.adoc | 13 - .../src/main/asciidoc/attributes.adoc | 108 - .../src/main/asciidoc/using-spring-boot.adoc | 1039 ----- .../spring-boot-parent/build.gradle | 41 + .../spring-boot-parent/pom.xml | 559 --- .../build.gradle | 18 + .../spring-boot-properties-migrator/pom.xml | 39 - .../spring-boot-starters/pom.xml | 174 - .../spring-boot-starter-activemq/build.gradle | 15 + .../spring-boot-starter-activemq/pom.xml | 45 - .../spring-boot-starter-actuator/build.gradle | 12 + .../spring-boot-starter-actuator/pom.xml | 36 - .../spring-boot-starter-amqp/build.gradle | 12 + .../spring-boot-starter-amqp/pom.xml | 35 - .../spring-boot-starter-aop/build.gradle | 12 + .../spring-boot-starter-aop/pom.xml | 35 - .../spring-boot-starter-artemis/build.gradle | 18 + .../spring-boot-starter-artemis/pom.xml | 49 - .../spring-boot-starter-batch/build.gradle | 12 + .../spring-boot-starter-batch/pom.xml | 68 - .../spring-boot-starter-cache/build.gradle | 11 + .../spring-boot-starter-cache/pom.xml | 31 - .../build.gradle | 14 + .../pom.xml | 45 - .../build.gradle | 13 + .../pom.xml | 47 - .../build.gradle | 12 + .../pom.xml | 42 - .../build.gradle | 15 + .../pom.xml | 54 - .../build.gradle | 13 + .../pom.xml | 46 - .../build.gradle | 11 + .../pom.xml | 68 - .../build.gradle | 11 + .../spring-boot-starter-data-jdbc/pom.xml | 31 - .../spring-boot-starter-data-jpa/build.gradle | 23 + .../spring-boot-starter-data-jpa/pom.xml | 83 - .../build.gradle | 11 + .../spring-boot-starter-data-ldap/pom.xml | 37 - .../build.gradle | 17 + .../pom.xml | 58 - .../build.gradle | 14 + .../spring-boot-starter-data-mongodb/pom.xml | 46 - .../build.gradle | 11 + .../spring-boot-starter-data-neo4j/pom.xml | 37 - .../build.gradle | 10 + .../pom.xml | 27 - .../build.gradle | 12 + .../spring-boot-starter-data-redis/pom.xml | 42 - .../build.gradle | 11 + .../spring-boot-starter-data-rest/pom.xml | 38 - .../build.gradle | 17 + .../spring-boot-starter-data-solr/pom.xml | 46 - .../build.gradle | 12 + .../spring-boot-starter-freemarker/pom.xml | 35 - .../build.gradle | 11 + .../pom.xml | 48 - .../spring-boot-starter-hateoas/build.gradle | 12 + .../spring-boot-starter-hateoas/pom.xml | 32 - .../build.gradle | 11 + .../spring-boot-starter-integration/pom.xml | 31 - .../spring-boot-starter-jdbc/build.gradle | 12 + .../spring-boot-starter-jdbc/pom.xml | 35 - .../spring-boot-starter-jersey/build.gradle | 27 + .../spring-boot-starter-jersey/pom.xml | 176 - .../spring-boot-starter-jetty/build.gradle | 25 + .../spring-boot-starter-jetty/pom.xml | 108 - .../spring-boot-starter-jooq/build.gradle | 17 + .../spring-boot-starter-jooq/pom.xml | 54 - .../spring-boot-starter-json/build.gradle | 15 + .../spring-boot-starter-json/pom.xml | 46 - .../build.gradle | 14 + .../spring-boot-starter-jta-atomikos/pom.xml | 49 - .../build.gradle | 15 + .../spring-boot-starter-jta-bitronix/pom.xml | 45 - .../spring-boot-starter-log4j2/build.gradle | 13 + .../spring-boot-starter-log4j2/pom.xml | 40 - .../spring-boot-starter-logging/build.gradle | 12 + .../spring-boot-starter-logging/pom.xml | 35 - .../spring-boot-starter-mail/build.gradle | 12 + .../spring-boot-starter-mail/pom.xml | 36 - .../spring-boot-starter-mustache/build.gradle | 11 + .../spring-boot-starter-mustache/pom.xml | 31 - .../build.gradle | 17 + .../spring-boot-starter-oauth2-client/pom.xml | 53 - .../build.gradle | 14 + .../pom.xml | 44 - .../spring-boot-starter-parent/build.gradle | 226 ++ .../spring-boot-starter-parent/pom.xml | 297 -- .../spring-boot-starter-quartz/build.gradle | 13 + .../spring-boot-starter-quartz/pom.xml | 39 - .../build.gradle | 10 + .../spring-boot-starter-reactor-netty/pom.xml | 31 - .../spring-boot-starter-rsocket/build.gradle | 18 + .../spring-boot-starter-rsocket/pom.xml | 46 - .../spring-boot-starter-security/build.gradle | 13 + .../spring-boot-starter-security/pom.xml | 39 - .../spring-boot-starter-test/build.gradle | 30 + .../spring-boot-starter-test/pom.xml | 129 - .../build.gradle | 12 + .../spring-boot-starter-thymeleaf/pom.xml | 35 - .../spring-boot-starter-tomcat/build.gradle | 17 + .../spring-boot-starter-tomcat/pom.xml | 46 - .../spring-boot-starter-undertow/build.gradle | 20 + .../spring-boot-starter-undertow/pom.xml | 50 - .../build.gradle | 12 + .../spring-boot-starter-validation/pom.xml | 46 - .../build.gradle | 14 + .../spring-boot-starter-web-services/pom.xml | 49 - .../spring-boot-starter-web/build.gradle | 16 + .../spring-boot-starter-web/pom.xml | 54 - .../spring-boot-starter-webflux/build.gradle | 16 + .../spring-boot-starter-webflux/pom.xml | 58 - .../build.gradle | 12 + .../spring-boot-starter-websocket/pom.xml | 36 - .../spring-boot-starter/build.gradle | 17 + .../spring-boot-starter/pom.xml | 48 - .../build.gradle | 96 + .../spring-boot-test-autoconfigure/pom.xml | 384 -- .../neo4j/DataNeo4jTestIntegrationTests.java | 5 +- ...taNeo4jTestPropertiesIntegrationTests.java | 5 +- ...TestWithIncludeFilterIntegrationTests.java | 5 +- .../spring-boot-test/build.gradle | 55 + spring-boot-project/spring-boot-test/pom.xml | 288 -- .../pom.xml | 48 - spring-boot-project/spring-boot-tools/pom.xml | 35 - .../spring-boot-antlib/build.gradle | 75 + .../spring-boot-antlib/pom.xml | 155 - .../src/it/sample/build.xml | 7 +- .../build.gradle | 16 + .../pom.xml | 41 - .../spring-boot-configuration-docs/pom.xml | 26 - .../configurationdocs/AsciidocBuilder.java | 59 - .../CompoundConfigurationTableEntry.java | 53 - .../ConfigurationMetadataDocumentWriter.java | 142 - .../configurationdocs/ConfigurationTable.java | 60 - .../ConfigurationTableEntry.java | 56 - .../configurationdocs/DocumentOptions.java | 98 - .../SingleConfigurationTableEntry.java | 84 - .../boot/configurationdocs/package-info.java | 20 - .../CompoundConfigurationTableEntryTests.java | 55 - .../ConfigurationTableTests.java | 56 - .../SingleConfigurationTableEntryTests.java | 130 - .../build.gradle | 16 + .../pom.xml | 27 - .../build.gradle | 27 + .../pom.xml | 69 - .../configurationprocessor/json/JSON.java | 17 +- .../json/JSONArray.java | 8 +- .../json/JSONObject.java | 22 +- .../json/JSONStringer.java | 3 +- .../json/JSONTokener.java | 4 +- .../spring-boot-gradle-plugin/build.gradle | 129 +- .../gradle.properties | 1 - .../gradle/wrapper/gradle-wrapper.jar | Bin 56177 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - .../spring-boot-gradle-plugin/gradlew | 172 - .../spring-boot-gradle-plugin/gradlew.bat | 84 - .../spring-boot-gradle-plugin/pom.xml | 399 -- .../src/{main => docs}/asciidoc/css/style.css | 0 .../asciidoc/getting-started.adoc | 0 .../src/docs/asciidoc/index.adoc | 51 + .../asciidoc/integrating-with-actuator.adoc | 0 .../asciidoc/managing-dependencies.adoc | 0 .../{main => docs}/asciidoc/packaging.adoc | 0 .../{main => docs}/asciidoc/publishing.adoc | 0 .../src/{main => docs}/asciidoc/reacting.adoc | 0 .../src/{main => docs}/asciidoc/running.adoc | 0 .../apply-plugin-release.gradle | 0 .../apply-plugin-release.gradle.kts | 0 .../apply-plugin-snapshot.gradle | 0 .../getting-started/milestone-settings.gradle | 0 .../milestone-settings.gradle.kts | 0 .../getting-started/snapshot-settings.gradle | 0 .../snapshot-settings.gradle.kts | 0 .../getting-started/typical-plugins.gradle | 0 .../typical-plugins.gradle.kts | 0 .../build-info-additional.gradle | 0 .../build-info-additional.gradle.kts | 0 .../build-info-basic.gradle | 0 .../build-info-basic.gradle.kts | 0 .../build-info-custom-values.gradle | 0 .../build-info-custom-values.gradle.kts | 0 .../configure-bom-with-plugins.gradle.kts | 0 .../configure-bom.gradle | 0 .../configure-bom.gradle.kts | 0 .../custom-version.gradle | 0 .../custom-version.gradle.kts | 0 .../depend-on-plugin-milestone.gradle | 0 .../depend-on-plugin-release.gradle | 0 .../depend-on-plugin-release.gradle.kts | 0 .../depend-on-plugin-snapshot.gradle | 0 .../managing-dependencies/dependencies.gradle | 0 .../dependencies.gradle.kts | 0 .../application-plugin-main-class.gradle | 0 .../application-plugin-main-class.gradle.kts | 0 .../gradle/packaging/boot-jar-and-jar.gradle | 0 .../packaging/boot-jar-and-jar.gradle.kts | 0 .../boot-jar-custom-launch-script.gradle | 0 .../boot-jar-custom-launch-script.gradle.kts | 0 .../boot-jar-include-launch-script.gradle | 0 .../boot-jar-include-launch-script.gradle.kts | 0 .../boot-jar-launch-script-properties.gradle | 0 ...ot-jar-launch-script-properties.gradle.kts | 0 .../packaging/boot-jar-main-class.gradle | 0 .../packaging/boot-jar-main-class.gradle.kts | 0 .../boot-jar-manifest-main-class.gradle | 0 .../boot-jar-manifest-main-class.gradle.kts | 0 .../packaging/boot-jar-requires-unpack.gradle | 0 .../boot-jar-requires-unpack.gradle.kts | 0 .../boot-war-include-devtools.gradle | 0 .../boot-war-include-devtools.gradle.kts | 0 .../boot-war-properties-launcher.gradle | 0 .../boot-war-properties-launcher.gradle.kts | 0 .../spring-boot-dsl-main-class.gradle | 0 .../spring-boot-dsl-main-class.gradle.kts | 0 .../packaging/war-container-dependency.gradle | 0 .../war-container-dependency.gradle.kts | 0 .../gradle/publishing/maven-publish.gradle | 0 .../publishing/maven-publish.gradle.kts | 0 .../gradle/publishing/maven.gradle | 0 .../gradle/publishing/maven.gradle.kts | 0 .../application-plugin-main-class-name.gradle | 0 ...lication-plugin-main-class-name.gradle.kts | 0 .../boot-run-disable-optimized-launch.gradle | 0 ...ot-run-disable-optimized-launch.gradle.kts | 0 .../gradle/running/boot-run-main.gradle | 0 .../gradle/running/boot-run-main.gradle.kts | 0 .../running/boot-run-source-resources.gradle | 0 .../boot-run-source-resources.gradle.kts | 0 .../spring-boot-dsl-main-class-name.gradle | 0 ...spring-boot-dsl-main-class-name.gradle.kts | 0 .../src/main/asciidoc/index.adoc | 51 - .../org.springframework.boot.properties | 1 - .../GettingStartedDocumentationTests.java | 2 +- ...gratingWithActuatorDocumentationTests.java | 6 +- ...anagingDependenciesDocumentationTests.java | 8 +- .../docs/PackagingDocumentationTests.java | 24 +- .../docs/PublishingDocumentationTests.java | 4 +- .../docs/RunningDocumentationTests.java | 17 +- .../junit/GradleCompatibilityExtension.java | 15 +- .../bundling/AbstractBootArchiveTests.java | 79 +- .../gradle/tasks/bundling/BootJarTests.java | 4 +- .../gradle/tasks/bundling/BootWarTests.java | 19 +- .../LaunchScriptConfigurationTests.java | 17 +- .../tasks/run/BootRunIntegrationTests.java | 18 +- .../spring-boot-loader-tools/build.gradle | 50 + .../spring-boot-loader-tools/pom.xml | 109 - .../spring-boot-loader/build.gradle | 26 + .../spring-boot-loader/pom.xml | 122 - .../it/executable-dir/application.properties | 2 - .../src/it/executable-dir/pom.xml | 97 - .../launcher/it/jar/EmbeddedJarStarter.java | 47 - .../launcher/it/jar/ExampleController.java | 37 - .../launcher/it/jar/SpringConfiguration.java | 33 - .../src/it/executable-jar/pom.xml | 111 - .../main/assembly/jar-with-dependencies.xml | 26 - .../launcher/it/jar/EmbeddedJarStarter.java | 47 - .../launcher/it/jar/ExampleController.java | 37 - .../launcher/it/jar/SpringConfiguration.java | 33 - .../it/executable-props-lib/loader.properties | 1 - .../src/it/executable-props-lib/pom.xml | 114 - .../src/main/assembly/app.xml | 27 - .../src/main/assembly/dependencies.xml | 17 - .../launcher/it/props/EmbeddedJarStarter.java | 34 - .../it/props/SpringConfiguration.java | 53 - .../src/main/resources/application.properties | 1 - .../src/it/executable-props-lib/verify.groovy | 17 - .../src/it/executable-props/pom.xml | 101 - .../main/assembly/jar-with-dependencies.xml | 27 - .../launcher/it/props/EmbeddedJarStarter.java | 34 - .../it/props/SpringConfiguration.java | 53 - .../src/main/resources/application.properties | 1 - .../src/it/executable-props/verify.groovy | 31 - .../src/it/executable-war/pom.xml | 90 - .../launcher/it/war/ExampleController.java | 37 - .../launcher/it/war/SpringConfiguration.java | 33 - .../launcher/it/war/SpringInitializer.java | 41 - .../it/war/embedded/EmbeddedWarStarter.java | 46 - ...bApplicationInitializersConfiguration.java | 74 - .../spring-boot-loader/src/it/settings.xml | 35 - .../boot/loader/PropertiesLauncherTests.java | 8 +- .../spring-boot-maven-plugin/build.gradle | 88 + .../spring-boot-maven-plugin/pom.xml | 499 --- .../src/docs/asciidoc/build-info.adoc | 41 + .../src/docs/asciidoc/getting-started.adoc | 7 + .../src/docs/asciidoc/help.adoc | 5 + .../src/{main => docs}/asciidoc/index.adoc | 0 .../src/docs/asciidoc/integration-tests.adoc | 179 + .../src/docs/asciidoc/packaging.adoc | 395 ++ .../src/docs/asciidoc/running.adoc | 241 ++ .../AbstractArchiveIntegrationTests.java | 173 + .../boot/maven/BuildInfoIntegrationTests.java | 147 + .../boot/maven/JarIntegrationTests.java | 283 ++ .../boot/maven/MavenBuild.java | 202 + .../boot/maven/MavenBuildExtension.java | 100 + .../boot/maven/RunIntegrationTests.java | 145 + .../boot/maven/StartStopIntegrationTests.java | 57 + .../boot/maven/WarIntegrationTests.java | 66 + .../build-info-additional-properties/pom.xml | 37 + .../main/java/org/test/SampleApplication.java | 0 .../build-info-custom-build-time/pom.xml | 33 + .../main/java/org/test/SampleApplication.java | 0 .../projects/build-info-custom-file/pom.xml | 33 + .../main/java/org/test/SampleApplication.java | 0 .../build-info-disable-build-time/pom.xml | 0 .../main/java/org/test/SampleApplication.java | 0 .../src/intTest/projects/build-info/pom.xml | 30 + .../main/java/org/test/SampleApplication.java | 0 .../projects/jar-attach-disabled/pom.xml | 32 + .../main/java/org/test/SampleApplication.java | 0 .../pom.xml | 33 + .../main/java/org/test/SampleApplication.java | 0 .../projects/jar-classifier-main/pom.xml | 32 + .../main/java/org/test/SampleApplication.java | 0 .../pom.xml | 49 + .../main/java/org/test/SampleApplication.java | 0 .../projects/jar-classifier-source/pom.xml | 48 + .../main/java/org/test/SampleApplication.java | 0 .../intTest/projects/jar-create-dir/pom.xml | 33 + .../main/java/org/test/SampleApplication.java | 0 .../intTest/projects/jar-custom-dir/pom.xml | 32 + .../main/java/org/test/SampleApplication.java | 0 .../projects/jar-custom-launcher/pom.xml | 35 + .../src/launcher/custom.script | 0 .../main/java/org/test/SampleApplication.java | 0 .../projects/jar-custom-layout/custom/pom.xml | 43 + .../main/java/org/test/SampleApplication.java | 0 .../jar-custom-layout/default/pom.xml | 38 + .../main/java/org/test/SampleApplication.java | 0 .../projects/jar-custom-layout/layout/pom.xml | 19 + .../java/smoketest/layout/SampleLayout.java | 0 .../smoketest/layout/SampleLayoutFactory.java | 0 .../main/resources/META-INF/spring.factories | 0 .../projects/jar-custom-layout/pom.xml | 19 + .../projects/jar-exclude-entry/pom.xml | 50 + .../main/java/org/test/SampleApplication.java | 0 .../projects/jar-exclude-group/pom.xml | 56 + .../main/java/org/test/SampleApplication.java | 0 .../intTest/projects/jar-executable/pom.xml | 46 + .../main/java/org/test/SampleApplication.java | 0 .../jar-lib-name-conflict/acme-lib/pom.xml | 13 + .../another-acme-lib/pom.xml | 0 .../projects}/jar-lib-name-conflict/pom.xml | 0 .../test-project/pom.xml | 42 + .../main/java/org/test/SampleApplication.java | 0 .../src/intTest/projects/jar-pom/pom.xml | 28 + .../src/intTest/projects/jar-skip/pom.xml | 32 + .../projects/jar-system-scope-default/pom.xml | 38 + .../jar-system-scope-default/sample-1.0.0.jar | Bin .../main/java/org/test/SampleApplication.java | 0 .../intTest/projects/jar-system-scope/pom.xml | 41 + .../jar-system-scope/sample-1.0.0.jar | Bin .../main/java/org/test/SampleApplication.java | 0 .../intTest/projects/jar-test-scope/pom.xml | 42 + .../main/java/org/test/SampleApplication.java | 0 .../projects/jar-with-kotlin-module/pom.xml | 69 + .../main/kotlin/org/test/SampleApplication.kt | 0 .../jar-with-layout-property/pom.xml | 0 .../main/java/org/test/SampleApplication.java | 0 .../projects}/jar-with-unpack/pom.xml | 0 .../main/java/org/test/SampleApplication.java | 0 .../projects/jar-with-zip-layout/pom.xml | 32 + .../main/java/org/test/SampleApplication.java | 0 .../src/{it => intTest/projects}/jar/pom.xml | 0 .../java/org/test}/SampleApplication.java | 0 .../run-arguments-commandline/pom.xml | 22 + .../main/java/org/test/SampleApplication.java | 0 .../intTest/projects/run-arguments/pom.xml | 28 + .../main/java/org/test/SampleApplication.java | 0 .../src/intTest/projects/run-devtools/pom.xml | 27 + .../boot/devtools/restart/Restarter.java | 0 .../main/java/org/test/SampleApplication.java | 0 .../intTest/projects/run-disable-fork/pom.xml | 31 + .../main/java/org/test/SampleApplication.java | 0 .../src/intTest/projects/run-envargs/pom.xml | 30 + .../main/java/org/test/SampleApplication.java | 0 .../src/intTest/projects/run-exclude/pom.xml | 50 + .../main/java/org/test/SampleApplication.java | 0 .../{it => intTest/projects}/run-fork/pom.xml | 0 .../main/java/org/test/SampleApplication.java | 0 .../projects/run-jvm-system-props/pom.xml | 31 + .../main/java/org/test/SampleApplication.java | 0 .../src/intTest/projects/run-jvmargs/pom.xml | 25 + .../main/java/org/test/SampleApplication.java | 0 .../run-profiles-fork-disabled/pom.xml | 29 + .../main/java/org/test/SampleApplication.java | 0 .../src/intTest/projects/run-profiles/pom.xml | 28 + .../main/java/org/test/SampleApplication.java | 0 .../projects}/run-toolchains/jdkHome/bin/java | 0 .../projects}/run-toolchains/pom.xml | 0 .../main/java/org/test/SampleApplication.java | 0 .../projects}/run-toolchains/toolchains.xml | 0 .../projects/run-use-test-classpath/pom.xml | 33 + .../main/java/org/test/SampleApplication.java | 0 .../projects/run-working-directory/pom.xml | 25 + .../main/java/org/test/SampleApplication.java | 0 .../src/intTest/projects/run/pom.xml | 22 + .../main/java/org/test/SampleApplication.java | 0 .../src/intTest/projects/settings.xml | 76 + .../projects/start-stop-fork-disabled/pom.xml | 36 + .../main/java/org/test/SampleApplication.java | 0 .../projects}/start-stop-skip/pom.xml | 0 .../main/java/org/test/SampleApplication.java | 0 .../projects/start-stop}/pom.xml | 0 .../main/java/org/test/SampleApplication.java | 0 .../projects}/war-reactor/jar/pom.xml | 0 .../projects}/war-reactor/pom.xml | 0 .../projects}/war-reactor/war/pom.xml | 0 .../java/com/example}/SampleApplication.java | 0 .../war/src/main/webapp/index.html | 0 .../intTest/projects/war-with-unpack/pom.xml | 63 + .../main/java/org/test/SampleApplication.java | 0 .../src/main/webapp/index.html | 0 .../src/{it => intTest/projects}/war/pom.xml | 0 .../main/java/org/test/SampleApplication.java | 0 .../projects}/war/src/main/webapp/index.html | 0 .../build-info-additional-properties/pom.xml | 50 - .../verify.groovy | 13 - .../it/build-info-custom-build-time/pom.xml | 46 - .../verify.groovy | 9 - .../src/it/build-info-custom-file/pom.xml | 46 - .../it/build-info-custom-file/verify.groovy | 9 - .../verify.groovy | 9 - .../src/it/build-info/pom.xml | 43 - .../src/it/build-info/verify.groovy | 9 - .../it/jar-attach-disabled/invoker.properties | 1 - .../src/it/jar-attach-disabled/pom.xml | 60 - .../src/it/jar-attach-disabled/verify.groovy | 18 - .../invoker.properties | 1 - .../pom.xml | 58 - .../verify.groovy | 24 - .../it/jar-classifier-main/invoker.properties | 1 - .../src/it/jar-classifier-main/pom.xml | 57 - .../src/it/jar-classifier-main/verify.groovy | 22 - .../invoker.properties | 1 - .../pom.xml | 67 - .../verify.groovy | 20 - .../jar-classifier-source/invoker.properties | 1 - .../src/it/jar-classifier-source/pom.xml | 66 - .../it/jar-classifier-source/verify.groovy | 16 - .../src/it/jar-create-dir/pom.xml | 61 - .../src/it/jar-create-dir/verify.groovy | 6 - .../src/it/jar-custom-dir/invoker.properties | 1 - .../src/it/jar-custom-dir/pom.xml | 60 - .../src/it/jar-custom-dir/verify.groovy | 10 - .../src/it/jar-custom-launcher/pom.xml | 63 - .../src/it/jar-custom-launcher/verify.groovy | 6 - .../src/it/jar-exclude-entry/pom.xml | 68 - .../src/it/jar-exclude-entry/verify.groovy | 27 - .../src/it/jar-exclude-group/pom.xml | 62 - .../src/it/jar-exclude-group/verify.groovy | 27 - .../src/it/jar-executable/pom.xml | 62 - .../src/it/jar-executable/verify.groovy | 7 - .../it/jar-lib-name-conflict/acme-lib/pom.xml | 20 - .../test-project/pom.xml | 60 - .../it/jar-lib-name-conflict/verify.groovy | 30 - .../src/it/jar-non-executable/pom.xml | 60 - .../src/it/jar-non-executable/verify.groovy | 6 - .../src/it/jar-pom/pom.xml | 41 - .../src/it/jar-skip/pom.xml | 32 - .../src/it/jar-skip/verify.groovy | 7 - .../src/it/jar-system-scope-default/pom.xml | 61 - .../it/jar-system-scope-default/verify.groovy | 27 - .../src/it/jar-system-scope/pom.xml | 64 - .../src/it/jar-system-scope/verify.groovy | 27 - .../src/it/jar-test-scope/pom.xml | 63 - .../src/it/jar-test-scope/verify.groovy | 27 - .../src/it/jar-with-kotlin-module/pom.xml | 106 - .../it/jar-with-kotlin-module/verify.groovy | 30 - .../invoker.properties | 1 - .../it/jar-with-layout-property/verify.groovy | 4 - .../src/it/jar-with-unpack/verify.groovy | 28 - .../src/it/jar/invoker.properties | 1 - .../src/it/jar/verify.groovy | 19 - .../src/it/prop/pom.xml | 57 - .../src/it/prop/verify.groovy | 6 - .../invoker.properties | 1 - .../src/it/run-arguments-commandline/pom.xml | 30 - .../run-arguments-commandline/test.properties | 1 - .../run-arguments-commandline/verify.groovy | 2 - .../src/it/run-arguments/pom.xml | 36 - .../src/it/run-arguments/verify.groovy | 2 - .../src/it/run-devtools/pom.xml | 35 - .../src/it/run-devtools/verify.groovy | 6 - .../src/it/run-disable-fork/pom.xml | 39 - .../src/it/run-disable-fork/verify.groovy | 7 - .../src/it/run-envargs/pom.xml | 38 - .../src/it/run-envargs/verify.groovy | 3 - .../src/it/run-exclude/pom.xml | 58 - .../src/it/run-exclude/verify.groovy | 3 - .../src/it/run-fork/invoker.properties | 1 - .../src/it/run-fork/verify.groovy | 21 - .../src/it/run-jvm-system-props/pom.xml | 39 - .../src/it/run-jvm-system-props/verify.groovy | 3 - .../src/it/run-jvmargs/pom.xml | 33 - .../src/it/run-jvmargs/verify.groovy | 3 - .../src/it/run-profiles-fork/pom.xml | 36 - .../src/it/run-profiles-fork/verify.groovy | 2 - .../src/it/run-profiles/pom.xml | 36 - .../src/it/run-profiles/verify.groovy | 2 - .../src/it/run-toolchains/invoker.properties | 2 - .../src/it/run-toolchains/verify.groovy | 2 - .../src/it/run-use-test-classpath/pom.xml | 41 - .../it/run-use-test-classpath/verify.groovy | 3 - .../src/it/run-working-directory/pom.xml | 33 - .../it/run-working-directory/verify.groovy | 6 - .../src/it/run/pom.xml | 33 - .../src/it/run/verify.groovy | 3 - .../src/it/settings.xml | 35 - .../src/it/start-stop-fork/invoker.properties | 1 - .../src/it/start-stop-fork/verify.groovy | 5 - .../src/it/start-stop-skip/invoker.properties | 1 - .../src/it/start-stop-skip/verify.groovy | 5 - .../src/it/start-stop/invoker.properties | 1 - .../src/it/start-stop/pom.xml | 39 - .../src/it/start-stop/verify.groovy | 5 - .../src/it/war-reactor/verify.groovy | 29 - .../src/it/war-with-unpack/pom.xml | 63 - .../src/it/war-with-unpack/verify.groovy | 29 - .../src/it/war/verify.groovy | 7 - .../src/main/asciidoc/build-info.adoc | 41 - .../src/main/asciidoc/getting-started.adoc | 7 - .../src/main/asciidoc/help.adoc | 5 - .../src/main/asciidoc/integration-tests.adoc | 179 - .../src/main/asciidoc/packaging.adoc | 395 -- .../src/main/asciidoc/running.adoc | 241 -- .../src/maven/resources/pom.xml | 45 + .../springframework/boot/maven/Verify.java | 308 -- .../spring-boot-test-support/build.gradle | 37 + .../spring-boot-test-support/pom.xml | 149 - .../boot/testsupport/BuildOutput.java | 15 +- spring-boot-project/spring-boot/build.gradle | 127 + spring-boot-project/spring-boot/pom.xml | 560 --- .../boot/SpringApplicationTests.java | 2 +- .../log4j2/Log4J2LoggingSystemTests.java | 4 + .../AbstractServletWebServerFactoryTests.java | 63 +- spring-boot-tests/pom.xml | 59 - .../spring-boot-deployment-tests/build.gradle | 28 + .../spring-boot-deployment-tests/pom.xml | 85 - .../pom.xml | 117 - .../SampleGlassfishDeployApplication.java | 25 - .../src/main/webapp/WEB-INF/glassfish-web.xml | 4 - .../SampleGlassfishDeployApplicationIT.java | 52 - .../pom.xml | 90 - .../main/java/sample/SampleController.java | 44 - .../sample/SampleTomcatDeployApplication.java | 25 - .../SampleTomcatDeployApplicationIT.java | 98 - .../spring-boot-deployment-test-tomee/pom.xml | 103 - .../main/java/sample/SampleController.java | 30 - .../sample/SampleTomEEDeployApplication.java | 31 - .../SampleTomEEDeployApplicationIT.java | 51 - .../pom.xml | 95 - .../main/java/sample/SampleController.java | 30 - .../SampleWildFlyDeployApplication.java | 25 - .../WEB-INF/jboss-deployment-structure.xml | 15 - .../SampleWildFlyDeployApplicationIT.java | 51 - .../spring-boot-deployment-test-wlp/pom.xml | 95 - .../main/java/sample/SampleController.java | 30 - .../sample/SampleWlpDeployApplication.java | 25 - .../sample/SampleWlpDeployApplicationIT.java | 51 - .../sample/DeploymentIntegrationTests.java | 139 + .../sample/DeploymentTestApplication.java | 25 + .../main/java/sample/SampleController.java | 0 .../spring-boot-integration-tests/pom.xml | 35 - .../build.gradle | 17 + .../pom.xml | 40 - .../spring-boot-devtools-tests/pom.xml | 67 - .../AbstractDevToolsIntegrationTests.java | 114 - .../tests/DevToolsIntegrationTests.java | 162 - .../app/build.gradle | 21 + .../app/settings.gradle | 15 + .../LaunchScriptTestApplication.java | 0 .../LaunchVerificationController.java | 0 .../build.gradle | 45 + .../spring-boot-launch-script-tests/pom.xml | 110 - .../SysVinitLaunchScriptIntegrationTests.java | 356 ++ .../conf/CentOS/6.9-a23bced6/Dockerfile | 11 + .../conf/Ubuntu/trusty-20160914/Dockerfile | 10 + .../conf/Ubuntu/xenial-20160914/Dockerfile | 10 + .../{test => intTest}/resources/logback.xml | 0 .../resources/scripts/basic-launch.sh | 0 .../scripts/force-stop-when-stopped.sh | 0 ...launch-with-double-link-single-java-opt.sh | 0 .../scripts/launch-with-missing-log-folder.sh | 0 .../scripts/launch-with-missing-pid-folder.sh | 0 ...ch-with-multiple-command-line-arguments.sh | 0 .../scripts/launch-with-multiple-java-opts.sh | 0 .../scripts/launch-with-multiple-run-args.sh | 0 .../launch-with-relative-log-folder.sh | 0 .../launch-with-relative-pid-folder.sh | 0 .../launch-with-run-as-invalid-user.sh | 0 ...with-run-as-user-preferred-to-jar-owner.sh | 0 .../launch-with-run-as-user-root-required.sh | 0 .../scripts/launch-with-run-as-user.sh | 0 ...aunch-with-single-command-line-argument.sh | 0 .../scripts/launch-with-single-java-opt.sh | 0 .../scripts/launch-with-single-run-arg.sh | 0 ...-with-use-of-start-stop-daemon-disabled.sh | 0 ...-file-ownership-is-changed-when-created.sh | 0 ...file-ownership-is-unchanged-when-exists.sh | 0 .../resources/scripts/log-file-ownership.sh | 0 .../resources/scripts/pid-file-ownership.sh | 0 .../resources/scripts/pid-folder-ownership.sh | 0 .../resources/scripts/restart-when-started.sh | 0 .../resources/scripts/restart-when-stopped.sh | 0 .../resources/scripts/start-when-started.sh | 0 .../resources/scripts/start-when-stopped.sh | 0 .../resources/scripts/status-when-killed.sh | 0 .../resources/scripts/status-when-started.sh | 0 .../resources/scripts/status-when-stopped.sh | 0 .../resources/scripts/stop-when-stopped.sh | 0 .../resources/scripts/test-functions.sh | 53 + .../launchscript/SysVinitLaunchScriptIT.java | 359 -- .../conf/CentOS/6.9-a23bced6/Dockerfile | 11 - .../conf/Ubuntu/trusty-20160914/Dockerfile | 10 - .../conf/Ubuntu/xenial-20160914/Dockerfile | 10 - .../test/resources/scripts/test-functions.sh | 53 - .../spring-boot-server-tests/build.gradle | 51 + .../spring-boot-server-tests/pom.xml | 84 - .../embedded/AbstractApplicationLauncher.java | 2 +- .../context/embedded/ApplicationBuilder.java | 15 +- ...verContainerInvocationContextProvider.java | 6 +- .../embedded/ExplodedApplicationLauncher.java | 1 + .../boot/context/embedded/Versions.java | 35 +- .../src/test/resources/settings-template.xml | 1 + .../spring-boot-smoke-tests-invoker/pom.xml | 81 - .../spring-boot-smoke-tests/pom.xml | 206 - .../build.gradle | 11 + .../spring-boot-smoke-test-activemq/pom.xml | 37 - .../build.gradle | 17 + .../pom.xml | 59 - .../build.gradle | 20 + .../pom.xml | 59 - .../build.gradle | 14 + .../pom.xml | 43 - .../build.gradle | 15 + .../pom.xml | 53 - .../build.gradle | 17 + .../spring-boot-smoke-test-actuator/pom.xml | 85 - .../resources/META-INF/build-info.properties | 5 + .../spring-boot-smoke-test-amqp/build.gradle | 10 + .../spring-boot-smoke-test-amqp/pom.xml | 38 - .../build.gradle | 10 + .../pom.xml | 37 - .../spring-boot-smoke-test-ant/build.gradle | 69 + .../spring-boot-smoke-test-ant/build.xml | 9 +- .../ivysettings.xml | 4 +- .../spring-boot-smoke-test-ant/pom.xml | 107 - .../smoketest/ant/SampleAntApplicationIT.java | 2 +- .../spring-boot-smoke-test-aop/build.gradle | 12 + .../spring-boot-smoke-test-aop/pom.xml | 37 - .../build.gradle | 16 + .../spring-boot-smoke-test-atmosphere/pom.xml | 57 - .../spring-boot-smoke-test-batch/build.gradle | 13 + .../spring-boot-smoke-test-batch/pom.xml | 43 - .../spring-boot-smoke-test-cache/build.gradle | 46 + .../spring-boot-smoke-test-cache/pom.xml | 56 - .../pom.xml | 85 - .../src/it/custom/pom.xml | 43 - .../src/it/custom/verify.groovy | 6 - .../src/it/default/pom.xml | 38 - .../main/java/org/test/SampleApplication.java | 24 - .../src/it/default/verify.groovy | 6 - .../src/it/settings.xml | 35 - .../test/java/smoketest/layout/Verify.java | 41 - .../build.gradle | 40 + .../pom.xml | 102 - .../build.gradle | 12 + .../pom.xml | 37 - .../build.gradle | 12 + .../pom.xml | 41 - .../build.gradle | 14 + .../spring-boot-smoke-test-data-jdbc/pom.xml | 47 - .../build.gradle | 14 + .../spring-boot-smoke-test-data-jpa/pom.xml | 47 - .../build.gradle | 13 + .../spring-boot-smoke-test-data-ldap/pom.xml | 45 - .../build.gradle | 13 + .../pom.xml | 45 - .../build.gradle | 12 + .../spring-boot-smoke-test-data-neo4j/pom.xml | 37 - .../build.gradle | 12 + .../spring-boot-smoke-test-data-redis/pom.xml | 51 - .../build.gradle | 19 + .../spring-boot-smoke-test-data-rest/pom.xml | 80 - .../build.gradle | 12 + .../spring-boot-smoke-test-data-solr/pom.xml | 37 - .../build.gradle | 20 + .../spring-boot-smoke-test-devtools/pom.xml | 45 - .../build.gradle | 17 + .../spring-boot-smoke-test-flyway/pom.xml | 69 - .../build.gradle | 12 + .../spring-boot-smoke-test-hateoas/pom.xml | 37 - .../build.gradle | 22 + .../pom.xml | 44 - .../build.gradle | 16 + .../pom.xml | 52 - .../build.gradle | 18 + .../spring-boot-smoke-test-jersey/pom.xml | 67 - .../build.gradle | 25 + .../spring-boot-smoke-test-jetty-jsp/pom.xml | 125 - .../build.gradle | 16 + .../spring-boot-smoke-test-jetty-ssl/pom.xml | 53 - .../spring-boot-smoke-test-jetty/build.gradle | 16 + .../spring-boot-smoke-test-jetty/pom.xml | 48 - .../spring-boot-smoke-test-jooq/build.gradle | 43 + .../spring-boot-smoke-test-jooq/pom.xml | 164 - .../spring-boot-smoke-test-jpa/build.gradle | 25 + .../spring-boot-smoke-test-jpa/pom.xml | 87 - .../build.gradle | 23 + .../pom.xml | 77 - .../build.gradle | 23 + .../pom.xml | 77 - .../spring-boot-smoke-test-jta-jndi/pom.xml | 58 - .../build.gradle | 26 + .../pom.xml | 45 - .../build.gradle | 24 + .../pom.xml | 27 - .../spring-boot-smoke-test-kafka/build.gradle | 15 + .../spring-boot-smoke-test-kafka/pom.xml | 51 - .../build.gradle | 17 + .../spring-boot-smoke-test-liquibase/pom.xml | 55 - .../build.gradle | 12 + .../spring-boot-smoke-test-logback/pom.xml | 37 - .../build.gradle | 14 + .../pom.xml | 46 - .../build.gradle | 14 + .../pom.xml | 47 - .../build.gradle | 15 + .../pom.xml | 51 - .../build.gradle | 12 + .../spring-boot-smoke-test-profile/pom.xml | 37 - .../build.gradle | 14 + .../pom.xml | 43 - .../build.gradle | 16 + .../spring-boot-smoke-test-quartz/pom.xml | 52 - .../build.gradle | 15 + .../pom.xml | 50 - .../build.gradle | 14 + .../pom.xml | 47 - .../build.gradle | 15 + .../spring-boot-smoke-test-rsocket/pom.xml | 67 - .../build.gradle | 14 + .../pom.xml | 45 - .../build.gradle | 15 + .../pom.xml | 77 - .../build.gradle | 15 + .../pom.xml | 59 - .../build.gradle | 12 + .../spring-boot-smoke-test-secure/pom.xml | 37 - .../build.gradle | 14 + .../spring-boot-smoke-test-servlet/pom.xml | 49 - .../build.gradle | 27 + .../pom.xml | 75 - .../build.gradle | 36 + .../spring-boot-smoke-test-session/pom.xml | 105 - .../build.gradle | 16 + .../spring-boot-smoke-test-simple/pom.xml | 51 - .../build.gradle | 18 + .../pom.xml | 52 - .../spring-boot-smoke-test-test/build.gradle | 18 + .../spring-boot-smoke-test-test/pom.xml | 77 - .../build.gradle | 21 + .../spring-boot-smoke-test-testng/pom.xml | 61 - .../testng/SampleTestNGApplicationTests.java | 4 +- .../build.gradle | 16 + .../spring-boot-smoke-test-tomcat-jsp/pom.xml | 56 - .../build.gradle | 13 + .../pom.xml | 42 - .../build.gradle | 13 + .../spring-boot-smoke-test-tomcat-ssl/pom.xml | 42 - .../build.gradle | 14 + .../spring-boot-smoke-test-tomcat/pom.xml | 45 - .../build.gradle | 17 + .../pom.xml | 54 - .../build.gradle | 16 + .../pom.xml | 51 - .../build.gradle | 15 + .../spring-boot-smoke-test-undertow/pom.xml | 47 - .../spring-boot-smoke-test-war/build.gradle | 16 + .../spring-boot-smoke-test-war/pom.xml | 93 - .../build.gradle | 13 + .../pom.xml | 52 - .../build.gradle | 15 + .../pom.xml | 51 - .../build.gradle | 16 + .../spring-boot-smoke-test-web-jsp/pom.xml | 61 - .../build.gradle | 15 + .../pom.xml | 49 - .../build.gradle | 13 + .../pom.xml | 49 - .../build.gradle | 15 + .../pom.xml | 50 - .../build.gradle | 18 + .../pom.xml | 58 - .../build.gradle | 16 + .../spring-boot-smoke-test-web-secure/pom.xml | 54 - .../build.gradle | 17 + .../spring-boot-smoke-test-web-static/pom.xml | 54 - .../build.gradle | 13 + .../spring-boot-smoke-test-web-ui/pom.xml | 45 - .../build.gradle | 30 + .../pom.xml | 77 - .../build.gradle | 14 + .../spring-boot-smoke-test-webflux/pom.xml | 55 - .../build.gradle | 21 + .../pom.xml | 67 - .../build.gradle | 15 + .../pom.xml | 47 - .../build.gradle | 12 + .../pom.xml | 37 - .../build.gradle | 15 + .../pom.xml | 47 - .../spring-boot-smoke-test-xml/build.gradle | 12 + .../spring-boot-smoke-test-xml/pom.xml | 37 - src/checkstyle/checkstyle-suppressions.xml | 2 + src/checkstyle/checkstyle.xml | 7 +- 1069 files changed, 24479 insertions(+), 33967 deletions(-) delete mode 100644 .bomr/bomr.yaml delete mode 100644 .mvn/jvm.config delete mode 100755 .mvn/wrapper/maven-wrapper.jar delete mode 100755 .mvn/wrapper/maven-wrapper.properties create mode 100644 build.gradle create mode 100644 buildSrc/README.adoc create mode 100644 buildSrc/build.gradle create mode 100644 buildSrc/settings.gradle create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/AsciidoctorConventions.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/ConventionsPlugin.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/DeployedPlugin.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/MavenRepositoryPlugin.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/AutoConfigurationMetadata.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/AutoConfigurationPlugin.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/DocumentAutoConfigurationClasses.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/BomExtension.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/BomPlugin.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/CheckBom.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/Library.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/UpgradePolicy.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/InteractiveUpgradeResolver.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/MavenMetadataVersionResolver.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/Upgrade.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeBom.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeResolver.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/VersionResolver.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/github/GitHub.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/github/GitHubRepository.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/github/Milestone.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/github/StandardGitHub.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/github/StandardGitHubRepository.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/AbstractDependencyVersion.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/ArtifactVersionDependencyVersion.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/CombinedPatchAndQualifierDependencyVersion.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/DependencyVersion.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/LeadingZeroesDependencyVersion.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/NumericQualifierDependencyVersion.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/ReleaseTrainDependencyVersion.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/UnstructuredDependencyVersion.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/classpath/CheckClasspathForConflicts.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/classpath/CheckClasspathForProhibitedDependencies.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/cli/AbstractPackageManagerDefinitionTask.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/cli/HomebrewFormula.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/cli/ScoopManifest.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/constraints/DocumentConstrainedVersions.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/constraints/ExtractVersionConstraints.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/context/properties/AsciidocBuilder.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/context/properties/CompoundConfigurationTableEntry.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationMetadataDocumentWriter.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationProperties.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationPropertiesPlugin.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationProperty.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationTable.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationTableEntry.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/context/properties/DocumentConfigurationProperties.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/context/properties/DocumentOptions.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/context/properties/SingleConfigurationTableEntry.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/log4j2/ReproducibleLog4j2PluginsDatAction.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/DocumentPluginGoals.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/MavenExec.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/MavenPluginPlugin.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/PluginXmlParser.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/PrepareMavenBinaries.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/optional/OptionalDependenciesPlugin.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/starters/DocumentStarters.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/starters/StarterMetadata.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/starters/StarterPlugin.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/test/IntegrationTestPlugin.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/test/autoconfigure/DocumentTestSlices.java create mode 100644 buildSrc/src/main/java/org/springframework/boot/build/test/autoconfigure/TestSliceMetadata.java create mode 100644 buildSrc/src/main/resources/effective-bom-settings.xml create mode 100644 buildSrc/src/test/java/org/springframework/boot/build/assertj/NodeAssert.java create mode 100644 buildSrc/src/test/java/org/springframework/boot/build/bom/BomPluginIntegrationTests.java create mode 100644 buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/ArtifactVersionDependencyVersionTests.java create mode 100644 buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/DependencyVersionTests.java create mode 100644 buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/NumericQualifierDependencyVersionTests.java create mode 100644 buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/ReleaseTrainDependencyVersionTests.java create mode 100644 buildSrc/src/test/java/org/springframework/boot/build/context/properties/CompoundConfigurationTableEntryTests.java create mode 100644 buildSrc/src/test/java/org/springframework/boot/build/context/properties/ConfigurationTableTests.java create mode 100644 buildSrc/src/test/java/org/springframework/boot/build/context/properties/SingleConfigurationTableEntryTests.java create mode 100644 buildSrc/src/test/java/org/springframework/boot/build/log4j2/ReproduciblePluginsDatActionTests.java create mode 100644 buildSrc/src/test/java/org/springframework/boot/build/mavenplugin/PluginXmlParserTests.java create mode 100644 buildSrc/src/test/java/org/springframework/boot/build/optional/OptionalDependenciesPluginIntegrationTests.java create mode 100644 buildSrc/src/test/resources/plugin.xml delete mode 100755 ci/scripts/build-deployment-tests.sh delete mode 100755 ci/scripts/build-integration-tests.sh delete mode 100755 ci/scripts/build-smoke-tests.sh delete mode 100644 ci/tasks/build-deployment-tests.yml delete mode 100644 ci/tasks/build-integration-tests.yml delete mode 100644 ci/tasks/build-smoke-tests.yml create mode 100644 gradle.properties create mode 100644 gradle/build-cache-settings.gradle create mode 100644 gradle/build-scan-user-data.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat delete mode 100644 pom.xml create mode 100644 settings.gradle delete mode 100644 spring-boot-project/pom.xml create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/build.gradle delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/auditevents.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/beans.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/caches.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/conditions.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/configprops.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/env.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/flyway.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/health.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/heapdump.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/httptrace.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/info.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/integrationgraph.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/liquibase.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/logfile.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/loggers.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/mappings.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/metrics.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/prometheus.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/scheduledtasks.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/sessions.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/shutdown.adoc create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/threaddump.adoc rename spring-boot-project/spring-boot-actuator-autoconfigure/src/{main => docs}/asciidoc/index.adoc (100%) delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/auditevents.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/beans.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/caches.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/conditions.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/configprops.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/env.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/flyway.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/health.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/heapdump.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/httptrace.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/info.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/integrationgraph.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/liquibase.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/logfile.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/loggers.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/mappings.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/metrics.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/prometheus.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/scheduledtasks.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/sessions.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/shutdown.adoc delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/threaddump.adoc create mode 100644 spring-boot-project/spring-boot-actuator/build.gradle delete mode 100644 spring-boot-project/spring-boot-actuator/pom.xml create mode 100644 spring-boot-project/spring-boot-autoconfigure/build.gradle delete mode 100755 spring-boot-project/spring-boot-autoconfigure/pom.xml create mode 100644 spring-boot-project/spring-boot-cli/build.gradle delete mode 100644 spring-boot-project/spring-boot-cli/pom.xml create mode 100644 spring-boot-project/spring-boot-cli/src/intTest/java/org/springframework/boot/cli/CommandLineIT.java create mode 100644 spring-boot-project/spring-boot-cli/src/intTest/java/org/springframework/boot/cli/JarCommandIT.java create mode 100644 spring-boot-project/spring-boot-cli/src/intTest/java/org/springframework/boot/cli/WarCommandIT.java create mode 100644 spring-boot-project/spring-boot-cli/src/intTest/java/org/springframework/boot/cli/infrastructure/CommandLineInvoker.java rename spring-boot-project/spring-boot-cli/src/{it => intTest}/resources/jar-command/bad.groovy (100%) rename spring-boot-project/spring-boot-cli/src/{it => intTest}/resources/jar-command/jar.groovy (100%) rename spring-boot-project/spring-boot-cli/src/{it => intTest}/resources/jar-command/public/public.txt (100%) rename spring-boot-project/spring-boot-cli/src/{it => intTest}/resources/jar-command/resources/resource.txt (100%) rename spring-boot-project/spring-boot-cli/src/{it => intTest}/resources/jar-command/root.properties (100%) rename spring-boot-project/spring-boot-cli/src/{it => intTest}/resources/jar-command/static/static.txt (100%) rename spring-boot-project/spring-boot-cli/src/{it => intTest}/resources/jar-command/templates/template.txt (100%) rename spring-boot-project/spring-boot-cli/src/{it => intTest}/resources/run-command/quiet.groovy (100%) create mode 100644 spring-boot-project/spring-boot-cli/src/intTest/resources/settings.xml rename spring-boot-project/spring-boot-cli/src/{it => intTest}/resources/war-command/root.properties (100%) rename spring-boot-project/spring-boot-cli/src/{it => intTest}/resources/war-command/war.groovy (100%) delete mode 100644 spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/CommandLineIT.java delete mode 100644 spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/JarCommandIT.java delete mode 100644 spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/WarCommandIT.java delete mode 100644 spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/infrastructure/CommandLineInvoker.java create mode 100644 spring-boot-project/spring-boot-cli/src/test/resources/cli-tester/.m2/settings.xml create mode 100644 spring-boot-project/spring-boot-cli/src/test/resources/run-command/quiet.groovy create mode 100644 spring-boot-project/spring-boot-dependencies/build.gradle delete mode 100644 spring-boot-project/spring-boot-dependencies/pom.xml create mode 100644 spring-boot-project/spring-boot-devtools/build.gradle delete mode 100644 spring-boot-project/spring-boot-devtools/pom.xml rename {spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test => spring-boot-project/spring-boot-devtools/src/intTest}/java/com/example/ControllerOne.java (100%) rename {spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test => spring-boot-project/spring-boot-devtools/src/intTest}/java/com/example/DevToolsTestApplication.java (100%) rename {spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test => spring-boot-project/spring-boot-devtools/src/intTest}/java/org/springframework/boot/devtools/tests/AbstractApplicationLauncher.java (100%) create mode 100644 spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/AbstractDevToolsIntegrationTests.java rename {spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test => spring-boot-project/spring-boot-devtools/src/intTest}/java/org/springframework/boot/devtools/tests/ApplicationLauncher.java (100%) rename {spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test => spring-boot-project/spring-boot-devtools/src/intTest}/java/org/springframework/boot/devtools/tests/ApplicationState.java (100%) create mode 100644 spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/DevToolsIntegrationTests.java rename {spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test => spring-boot-project/spring-boot-devtools/src/intTest}/java/org/springframework/boot/devtools/tests/DevToolsWithLazyInitializationIntegrationTests.java (100%) rename {spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test => spring-boot-project/spring-boot-devtools/src/intTest}/java/org/springframework/boot/devtools/tests/Directories.java (100%) rename {spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test => spring-boot-project/spring-boot-devtools/src/intTest}/java/org/springframework/boot/devtools/tests/ExplodedRemoteApplicationLauncher.java (100%) rename {spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test => spring-boot-project/spring-boot-devtools/src/intTest}/java/org/springframework/boot/devtools/tests/FileContents.java (100%) rename {spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test => spring-boot-project/spring-boot-devtools/src/intTest}/java/org/springframework/boot/devtools/tests/JarFileRemoteApplicationLauncher.java (100%) rename {spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test => spring-boot-project/spring-boot-devtools/src/intTest}/java/org/springframework/boot/devtools/tests/JvmLauncher.java (100%) rename {spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test => spring-boot-project/spring-boot-devtools/src/intTest}/java/org/springframework/boot/devtools/tests/LaunchedApplication.java (100%) rename {spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test => spring-boot-project/spring-boot-devtools/src/intTest}/java/org/springframework/boot/devtools/tests/LocalApplicationLauncher.java (100%) rename {spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test => spring-boot-project/spring-boot-devtools/src/intTest}/java/org/springframework/boot/devtools/tests/RemoteApplicationLauncher.java (100%) create mode 100644 spring-boot-project/spring-boot-docs/build.gradle delete mode 100644 spring-boot-project/spring-boot-docs/pom.xml create mode 100644 spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-application-properties.adoc create mode 100644 spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-auto-configuration-classes.adoc create mode 100644 spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-configuration-metadata.adoc create mode 100644 spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-dependency-versions.adoc create mode 100644 spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-executable-jar-format.adoc create mode 100644 spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-test-auto-configuration.adoc create mode 100644 spring-boot-project/spring-boot-docs/src/docs/asciidoc/attributes.adoc rename spring-boot-project/spring-boot-docs/src/{main => docs}/asciidoc/build-tool-plugins.adoc (100%) rename spring-boot-project/spring-boot-docs/src/{main => docs}/asciidoc/deployment.adoc (100%) rename spring-boot-project/spring-boot-docs/src/{main => docs}/asciidoc/documentation-overview.adoc (100%) rename spring-boot-project/spring-boot-docs/src/{main => docs}/asciidoc/getting-started.adoc (100%) rename spring-boot-project/spring-boot-docs/src/{main => docs}/asciidoc/howto.adoc (100%) rename spring-boot-project/spring-boot-docs/src/{main => docs}/asciidoc/index-docinfo.xml (100%) rename spring-boot-project/spring-boot-docs/src/{main => docs}/asciidoc/index.htmladoc (100%) rename spring-boot-project/spring-boot-docs/src/{main => docs}/asciidoc/index.htmlsingleadoc (100%) rename spring-boot-project/spring-boot-docs/src/{main => docs}/asciidoc/legal.adoc (100%) rename spring-boot-project/spring-boot-docs/src/{main => docs}/asciidoc/production-ready-features.adoc (100%) rename spring-boot-project/spring-boot-docs/src/{main => docs}/asciidoc/spring-boot-cli.adoc (100%) rename spring-boot-project/spring-boot-docs/src/{main => docs}/asciidoc/spring-boot-features.adoc (100%) rename spring-boot-project/spring-boot-docs/src/{main => docs}/asciidoc/spring-boot-reference.pdfadoc (100%) create mode 100644 spring-boot-project/spring-boot-docs/src/docs/asciidoc/using-spring-boot.adoc delete mode 100644 spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc delete mode 100644 spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-auto-configuration-classes.adoc delete mode 100644 spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-configuration-metadata.adoc delete mode 100644 spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-dependency-versions.adoc delete mode 100644 spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-executable-jar-format.adoc delete mode 100644 spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-test-auto-configuration.adoc delete mode 100644 spring-boot-project/spring-boot-docs/src/main/asciidoc/attributes.adoc delete mode 100644 spring-boot-project/spring-boot-docs/src/main/asciidoc/using-spring-boot.adoc create mode 100644 spring-boot-project/spring-boot-parent/build.gradle delete mode 100644 spring-boot-project/spring-boot-parent/pom.xml create mode 100644 spring-boot-project/spring-boot-properties-migrator/build.gradle delete mode 100644 spring-boot-project/spring-boot-properties-migrator/pom.xml delete mode 100644 spring-boot-project/spring-boot-starters/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-activemq/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-activemq/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-actuator/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-actuator/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-amqp/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-amqp/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-aop/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-aop/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-artemis/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-artemis/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-batch/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-batch/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-cache/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-cache/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-cloud-connectors/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-cloud-connectors/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-cassandra-reactive/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-cassandra-reactive/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-cassandra/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-cassandra/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-couchbase-reactive/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-couchbase-reactive/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-couchbase/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-couchbase/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-elasticsearch/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-elasticsearch/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-jdbc/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-jdbc/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-jpa/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-jpa/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-ldap/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-ldap/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-mongodb-reactive/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-mongodb-reactive/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-mongodb/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-mongodb/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-neo4j/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-neo4j/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-redis-reactive/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-redis-reactive/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-redis/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-redis/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-rest/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-rest/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-solr/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-data-solr/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-freemarker/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-freemarker/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-groovy-templates/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-groovy-templates/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-hateoas/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-hateoas/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-integration/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-integration/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-jdbc/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-jdbc/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-jersey/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-jersey/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-jetty/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-jetty/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-jooq/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-jooq/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-json/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-json/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-jta-atomikos/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-jta-atomikos/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-jta-bitronix/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-jta-bitronix/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-log4j2/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-log4j2/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-logging/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-logging/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-mail/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-mail/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-mustache/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-mustache/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-oauth2-client/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-oauth2-client/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-oauth2-resource-server/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-oauth2-resource-server/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-parent/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-parent/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-quartz/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-quartz/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-reactor-netty/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-reactor-netty/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-rsocket/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-rsocket/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-security/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-security/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-test/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-test/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-thymeleaf/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-thymeleaf/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-tomcat/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-tomcat/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-undertow/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-undertow/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-validation/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-validation/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-web-services/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-web-services/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-web/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-web/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-webflux/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-webflux/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-websocket/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter-websocket/pom.xml create mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter/build.gradle delete mode 100644 spring-boot-project/spring-boot-starters/spring-boot-starter/pom.xml create mode 100644 spring-boot-project/spring-boot-test-autoconfigure/build.gradle delete mode 100644 spring-boot-project/spring-boot-test-autoconfigure/pom.xml create mode 100644 spring-boot-project/spring-boot-test/build.gradle delete mode 100644 spring-boot-project/spring-boot-test/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/org.springframework.boot.gradle.plugin/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/pom.xml create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-antlib/build.gradle delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-antlib/pom.xml create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-autoconfigure-processor/build.gradle delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-autoconfigure-processor/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/AsciidocBuilder.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/CompoundConfigurationTableEntry.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/ConfigurationMetadataDocumentWriter.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/ConfigurationTable.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/ConfigurationTableEntry.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/DocumentOptions.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/SingleConfigurationTableEntry.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/package-info.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/test/java/org/springframework/boot/configurationdocs/CompoundConfigurationTableEntryTests.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/test/java/org/springframework/boot/configurationdocs/ConfigurationTableTests.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/test/java/org/springframework/boot/configurationdocs/SingleConfigurationTableEntryTests.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-configuration-metadata/build.gradle delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-configuration-metadata/pom.xml create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/build.gradle delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/gradle.properties delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/gradle/wrapper/gradle-wrapper.jar delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/gradle/wrapper/gradle-wrapper.properties delete mode 100755 spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/gradlew delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/gradlew.bat delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/asciidoc/css/style.css (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/asciidoc/getting-started.adoc (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/index.adoc rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/asciidoc/integrating-with-actuator.adoc (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/asciidoc/managing-dependencies.adoc (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/asciidoc/packaging.adoc (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/asciidoc/publishing.adoc (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/asciidoc/reacting.adoc (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/asciidoc/running.adoc (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/getting-started/apply-plugin-release.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/getting-started/apply-plugin-release.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/getting-started/apply-plugin-snapshot.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/getting-started/milestone-settings.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/getting-started/milestone-settings.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/getting-started/snapshot-settings.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/getting-started/snapshot-settings.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/getting-started/typical-plugins.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/getting-started/typical-plugins.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/integrating-with-actuator/build-info-additional.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/integrating-with-actuator/build-info-additional.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/integrating-with-actuator/build-info-basic.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/integrating-with-actuator/build-info-basic.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/integrating-with-actuator/build-info-custom-values.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/integrating-with-actuator/build-info-custom-values.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/managing-dependencies/configure-bom-with-plugins.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/managing-dependencies/configure-bom.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/managing-dependencies/configure-bom.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/managing-dependencies/custom-version.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/managing-dependencies/custom-version.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/managing-dependencies/depend-on-plugin-milestone.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/managing-dependencies/depend-on-plugin-release.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/managing-dependencies/depend-on-plugin-release.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/managing-dependencies/depend-on-plugin-snapshot.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/managing-dependencies/dependencies.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/managing-dependencies/dependencies.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/application-plugin-main-class.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/application-plugin-main-class.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/boot-jar-and-jar.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/boot-jar-and-jar.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/boot-jar-custom-launch-script.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/boot-jar-custom-launch-script.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/boot-jar-include-launch-script.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/boot-jar-include-launch-script.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/boot-jar-launch-script-properties.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/boot-jar-launch-script-properties.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/boot-jar-main-class.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/boot-jar-main-class.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/boot-jar-manifest-main-class.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/boot-jar-manifest-main-class.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/boot-jar-requires-unpack.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/boot-jar-requires-unpack.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/boot-war-include-devtools.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/boot-war-include-devtools.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/boot-war-properties-launcher.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/boot-war-properties-launcher.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/spring-boot-dsl-main-class.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/spring-boot-dsl-main-class.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/war-container-dependency.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/packaging/war-container-dependency.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/publishing/maven-publish.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/publishing/maven-publish.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/publishing/maven.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/publishing/maven.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/running/application-plugin-main-class-name.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/running/application-plugin-main-class-name.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/running/boot-run-disable-optimized-launch.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/running/boot-run-disable-optimized-launch.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/running/boot-run-main.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/running/boot-run-main.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/running/boot-run-source-resources.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/running/boot-run-source-resources.gradle.kts (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/running/spring-boot-dsl-main-class-name.gradle (100%) rename spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/{main => docs}/gradle/running/spring-boot-dsl-main-class-name.gradle.kts (100%) delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/index.adoc delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.springframework.boot.properties create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader-tools/build.gradle delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader-tools/pom.xml create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/build.gradle delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-dir/application.properties delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-dir/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-dir/src/main/java/org/springframework/launcher/it/jar/EmbeddedJarStarter.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-dir/src/main/java/org/springframework/launcher/it/jar/ExampleController.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-dir/src/main/java/org/springframework/launcher/it/jar/SpringConfiguration.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-jar/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-jar/src/main/assembly/jar-with-dependencies.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-jar/src/main/java/org/springframework/launcher/it/jar/EmbeddedJarStarter.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-jar/src/main/java/org/springframework/launcher/it/jar/ExampleController.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-jar/src/main/java/org/springframework/launcher/it/jar/SpringConfiguration.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/loader.properties delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/src/main/assembly/app.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/src/main/assembly/dependencies.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/src/main/java/org/springframework/boot/launcher/it/props/EmbeddedJarStarter.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/src/main/java/org/springframework/boot/launcher/it/props/SpringConfiguration.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/src/main/resources/application.properties delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/src/main/assembly/jar-with-dependencies.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/src/main/java/org/springframework/launcher/it/props/EmbeddedJarStarter.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/src/main/java/org/springframework/launcher/it/props/SpringConfiguration.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/src/main/resources/application.properties delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/src/main/java/org/springframework/launcher/it/war/ExampleController.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/src/main/java/org/springframework/launcher/it/war/SpringConfiguration.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/src/main/java/org/springframework/launcher/it/war/SpringInitializer.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/src/main/java/org/springframework/launcher/it/war/embedded/EmbeddedWarStarter.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/src/main/java/org/springframework/launcher/it/war/embedded/WebApplicationInitializersConfiguration.java delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/settings.xml create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/build.gradle delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/pom.xml create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/build-info.adoc create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/getting-started.adoc create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/help.adoc rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{main => docs}/asciidoc/index.adoc (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/integration-tests.adoc create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/packaging.adoc create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/running.adoc create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/AbstractArchiveIntegrationTests.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/BuildInfoIntegrationTests.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/JarIntegrationTests.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/MavenBuild.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/MavenBuildExtension.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/RunIntegrationTests.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/StartStopIntegrationTests.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/WarIntegrationTests.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-additional-properties/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/build-info-additional-properties/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-custom-build-time/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/build-info-custom-build-time/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-custom-file/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/build-info-custom-file/src/main/java/org/test/SampleApplication.java (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/build-info-disable-build-time/pom.xml (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/build-info-disable-build-time/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/build-info/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-attach-disabled/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/jar-attach-disabled/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-main-attach-disabled/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/jar-classifier-main-attach-disabled/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-main/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/jar-classifier-main/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-source-attach-disabled/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/jar-classifier-source-attach-disabled/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-source/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/jar-classifier-source/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-create-dir/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/jar-create-dir/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-dir/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/jar-custom-dir/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-launcher/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/jar-custom-launcher/src/launcher/custom.script (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/jar-custom-launcher/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/custom/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it/jar-exclude-entry => intTest/projects/jar-custom-layout/custom}/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/default/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it/jar-exclude-group => intTest/projects/jar-custom-layout/default}/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/layout/pom.xml rename {spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout => spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/layout}/src/main/java/smoketest/layout/SampleLayout.java (100%) rename {spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout => spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/layout}/src/main/java/smoketest/layout/SampleLayoutFactory.java (100%) rename {spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout => spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/layout}/src/main/resources/META-INF/spring.factories (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/pom.xml create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-exclude-entry/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it/jar-executable => intTest/projects/jar-exclude-entry}/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-exclude-group/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it/jar-lib-name-conflict/test-project => intTest/projects/jar-exclude-group}/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-executable/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it/jar-non-executable => intTest/projects/jar-executable}/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-lib-name-conflict/acme-lib/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/jar-lib-name-conflict/another-acme-lib/pom.xml (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/jar-lib-name-conflict/pom.xml (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-lib-name-conflict/test-project/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it/jar-system-scope-default => intTest/projects/jar-lib-name-conflict/test-project}/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-pom/pom.xml create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-skip/pom.xml create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-system-scope-default/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/jar-system-scope-default/sample-1.0.0.jar (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it/jar-system-scope => intTest/projects/jar-system-scope-default}/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-system-scope/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/jar-system-scope/sample-1.0.0.jar (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it/jar-test-scope => intTest/projects/jar-system-scope}/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-test-scope/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it/jar-with-unpack => intTest/projects/jar-test-scope}/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-with-kotlin-module/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/jar-with-kotlin-module/src/main/kotlin/org/test/SampleApplication.kt (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/jar-with-layout-property/pom.xml (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/jar-with-layout-property/src/main/java/org/test/SampleApplication.java (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/jar-with-unpack/pom.xml (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it/jar => intTest/projects/jar-with-unpack}/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-with-zip-layout/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it/prop => intTest/projects/jar-with-zip-layout}/src/main/java/org/test/SampleApplication.java (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/jar/pom.xml (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it/war-reactor/war/src/main/java/com/example => intTest/projects/jar/src/main/java/org/test}/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-arguments-commandline/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/run-arguments-commandline/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-arguments/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/run-arguments/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-devtools/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/run-devtools/src/main/java/org/springframework/boot/devtools/restart/Restarter.java (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/run-devtools/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-disable-fork/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/run-disable-fork/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-envargs/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/run-envargs/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-exclude/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/run-exclude/src/main/java/org/test/SampleApplication.java (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/run-fork/pom.xml (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/run-fork/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-jvm-system-props/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/run-jvm-system-props/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-jvmargs/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/run-jvmargs/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-profiles-fork-disabled/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it/run-profiles-fork => intTest/projects/run-profiles-fork-disabled}/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-profiles/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/run-profiles/src/main/java/org/test/SampleApplication.java (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/run-toolchains/jdkHome/bin/java (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/run-toolchains/pom.xml (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/run-toolchains/src/main/java/org/test/SampleApplication.java (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/run-toolchains/toolchains.xml (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-use-test-classpath/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/run-use-test-classpath/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-working-directory/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/run-working-directory/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/run/src/main/java/org/test/SampleApplication.java (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/settings.xml create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/start-stop-fork-disabled/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it/start-stop => intTest/projects/start-stop-fork-disabled}/src/main/java/org/test/SampleApplication.java (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/start-stop-skip/pom.xml (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/start-stop-skip/src/main/java/org/test/SampleApplication.java (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it/start-stop-fork => intTest/projects/start-stop}/pom.xml (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it/start-stop-fork => intTest/projects/start-stop}/src/main/java/org/test/SampleApplication.java (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/war-reactor/jar/pom.xml (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/war-reactor/pom.xml (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/war-reactor/war/pom.xml (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it/war-with-unpack/src/main/java/org/test => intTest/projects/war-reactor/war/src/main/java/com/example}/SampleApplication.java (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/war-reactor/war/src/main/webapp/index.html (100%) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war-with-unpack/pom.xml rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it/war => intTest/projects/war-with-unpack}/src/main/java/org/test/SampleApplication.java (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/war-with-unpack/src/main/webapp/index.html (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/war/pom.xml (100%) rename {spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/custom => spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war}/src/main/java/org/test/SampleApplication.java (100%) rename spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/{it => intTest/projects}/war/src/main/webapp/index.html (100%) delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-additional-properties/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-additional-properties/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-custom-build-time/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-custom-build-time/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-custom-file/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-custom-file/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-disable-build-time/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-attach-disabled/invoker.properties delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-attach-disabled/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-attach-disabled/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main-attach-disabled/invoker.properties delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main-attach-disabled/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main-attach-disabled/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main/invoker.properties delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source-attach-disabled/invoker.properties delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source-attach-disabled/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source-attach-disabled/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source/invoker.properties delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-create-dir/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-create-dir/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-dir/invoker.properties delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-dir/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-dir/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-launcher/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-launcher/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-exclude-entry/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-exclude-entry/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-exclude-group/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-exclude-group/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-executable/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-executable/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-lib-name-conflict/acme-lib/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-lib-name-conflict/test-project/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-lib-name-conflict/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-non-executable/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-non-executable/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-pom/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-skip/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-skip/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope-default/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope-default/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-test-scope/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-test-scope/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-kotlin-module/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-kotlin-module/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-layout-property/invoker.properties delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-layout-property/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-unpack/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar/invoker.properties delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/prop/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/prop/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments-commandline/invoker.properties delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments-commandline/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments-commandline/test.properties delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments-commandline/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-devtools/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-devtools/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-disable-fork/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-disable-fork/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-envargs/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-envargs/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-exclude/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-exclude/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-fork/invoker.properties delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-fork/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-jvm-system-props/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-jvm-system-props/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-jvmargs/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-jvmargs/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-profiles-fork/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-profiles-fork/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-profiles/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-profiles/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-toolchains/invoker.properties delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-toolchains/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-use-test-classpath/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-use-test-classpath/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-working-directory/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-working-directory/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/settings.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-fork/invoker.properties delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-fork/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-skip/invoker.properties delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-skip/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop/invoker.properties delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-reactor/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-with-unpack/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-with-unpack/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war/verify.groovy delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/build-info.adoc delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/getting-started.adoc delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/help.adoc delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/integration-tests.adoc delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/packaging.adoc delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/running.adoc create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/maven/resources/pom.xml delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/Verify.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/build.gradle delete mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/pom.xml create mode 100644 spring-boot-project/spring-boot/build.gradle delete mode 100644 spring-boot-project/spring-boot/pom.xml delete mode 100644 spring-boot-tests/pom.xml create mode 100644 spring-boot-tests/spring-boot-deployment-tests/build.gradle delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/pom.xml delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-glassfish/pom.xml delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-glassfish/src/main/java/sample/SampleGlassfishDeployApplication.java delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-glassfish/src/main/webapp/WEB-INF/glassfish-web.xml delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-glassfish/src/test/java/sample/SampleGlassfishDeployApplicationIT.java delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/pom.xml delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/src/main/java/sample/SampleController.java delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/src/main/java/sample/SampleTomcatDeployApplication.java delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/src/test/java/sample/SampleTomcatDeployApplicationIT.java delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomee/pom.xml delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomee/src/main/java/sample/SampleController.java delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomee/src/main/java/sample/SampleTomEEDeployApplication.java delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomee/src/test/java/sample/SampleTomEEDeployApplicationIT.java delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wildfly/pom.xml delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wildfly/src/main/java/sample/SampleController.java delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wildfly/src/main/java/sample/SampleWildFlyDeployApplication.java delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wildfly/src/main/webapp/WEB-INF/jboss-deployment-structure.xml delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wildfly/src/test/java/sample/SampleWildFlyDeployApplicationIT.java delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wlp/pom.xml delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wlp/src/main/java/sample/SampleController.java delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wlp/src/main/java/sample/SampleWlpDeployApplication.java delete mode 100644 spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wlp/src/test/java/sample/SampleWlpDeployApplicationIT.java create mode 100644 spring-boot-tests/spring-boot-deployment-tests/src/intTest/java/sample/DeploymentIntegrationTests.java create mode 100644 spring-boot-tests/spring-boot-deployment-tests/src/main/java/sample/DeploymentTestApplication.java rename spring-boot-tests/spring-boot-deployment-tests/{spring-boot-deployment-test-glassfish => }/src/main/java/sample/SampleController.java (100%) delete mode 100644 spring-boot-tests/spring-boot-integration-tests/pom.xml create mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-configuration-processor-tests/build.gradle delete mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-configuration-processor-tests/pom.xml delete mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/pom.xml delete mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/AbstractDevToolsIntegrationTests.java delete mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/DevToolsIntegrationTests.java create mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/app/build.gradle create mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/app/settings.gradle rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/{ => app}/src/main/java/org/springframework/boot/launchscript/LaunchScriptTestApplication.java (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/{ => app}/src/main/java/org/springframework/boot/launchscript/LaunchVerificationController.java (100%) create mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/build.gradle delete mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/pom.xml create mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/java/org/springframework/boot/launchscript/SysVinitLaunchScriptIntegrationTests.java create mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/conf/CentOS/6.9-a23bced6/Dockerfile create mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/conf/Ubuntu/trusty-20160914/Dockerfile create mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/conf/Ubuntu/xenial-20160914/Dockerfile rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/logback.xml (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/basic-launch.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/force-stop-when-stopped.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/launch-with-double-link-single-java-opt.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/launch-with-missing-log-folder.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/launch-with-missing-pid-folder.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/launch-with-multiple-command-line-arguments.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/launch-with-multiple-java-opts.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/launch-with-multiple-run-args.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/launch-with-relative-log-folder.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/launch-with-relative-pid-folder.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/launch-with-run-as-invalid-user.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/launch-with-run-as-user-preferred-to-jar-owner.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/launch-with-run-as-user-root-required.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/launch-with-run-as-user.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/launch-with-single-command-line-argument.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/launch-with-single-java-opt.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/launch-with-single-run-arg.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/launch-with-use-of-start-stop-daemon-disabled.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/log-file-ownership-is-changed-when-created.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/log-file-ownership-is-unchanged-when-exists.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/log-file-ownership.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/pid-file-ownership.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/pid-folder-ownership.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/restart-when-started.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/restart-when-stopped.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/start-when-started.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/start-when-stopped.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/status-when-killed.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/status-when-started.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/status-when-stopped.sh (100%) rename spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/{test => intTest}/resources/scripts/stop-when-stopped.sh (100%) create mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/test-functions.sh delete mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/java/org/springframework/boot/launchscript/SysVinitLaunchScriptIT.java delete mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/conf/CentOS/6.9-a23bced6/Dockerfile delete mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/conf/Ubuntu/trusty-20160914/Dockerfile delete mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/conf/Ubuntu/xenial-20160914/Dockerfile delete mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/test-functions.sh create mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/build.gradle delete mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/pom.xml delete mode 100644 spring-boot-tests/spring-boot-smoke-tests-invoker/pom.xml delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-activemq/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-activemq/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-custom-security/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-custom-security/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-log4j2/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-log4j2/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-noweb/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-noweb/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-ui/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-ui/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/src/main/resources/META-INF/build-info.properties create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-animated-banner/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-animated-banner/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-ant/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-ant/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-aop/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-aop/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-atmosphere/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-atmosphere/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-batch/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-batch/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-cache/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-cache/pom.xml delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/pom.xml delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/custom/pom.xml delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/custom/verify.groovy delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/default/pom.xml delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/default/src/main/java/org/test/SampleApplication.java delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/default/verify.groovy delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/settings.xml delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/test/java/smoketest/layout/Verify.java create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-couchbase/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-couchbase/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-elasticsearch/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-elasticsearch/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jdbc/build.gradle delete mode 100755 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jdbc/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jpa/build.gradle delete mode 100755 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jpa/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-ldap/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-ldap/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-mongodb/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-mongodb/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-neo4j/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-neo4j/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-redis/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-redis/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-rest/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-rest/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-solr/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-solr/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-devtools/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-devtools/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-flyway/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-flyway/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hateoas/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hateoas/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hibernate52/build.gradle delete mode 100755 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hibernate52/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-integration/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-integration/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jersey/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jersey/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty-jsp/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty-jsp/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty-ssl/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty-ssl/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jooq/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jooq/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jpa/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jpa/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jta-atomikos/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jta-atomikos/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jta-bitronix/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jta-bitronix/pom.xml delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jta-jndi/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-junit-jupiter/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-junit-jupiter/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-junit-vintage/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-junit-vintage/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-liquibase/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-liquibase/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-logback/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-logback/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-oauth2-client/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-oauth2-client/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-oauth2-resource-server/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-oauth2-resource-server/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-parent-context/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-parent-context/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-profile/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-profile/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-property-validation/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-property-validation/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-quartz/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-quartz/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-reactive-oauth2-client/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-reactive-oauth2-client/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-reactive-oauth2-resource-server/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-reactive-oauth2-resource-server/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-rsocket/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-rsocket/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-saml2-service-provider/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-saml2-service-provider/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure-jersey/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure-jersey/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure-webflux/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure-webflux/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-servlet/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-servlet/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-session-webflux/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-session-webflux/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-session/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-session/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-simple/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-simple/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test-nomockito/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test-nomockito/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-testng/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-testng/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-jsp/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-jsp/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-multi-connectors/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-multi-connectors/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-ssl/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-ssl/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-traditional/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-traditional/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-undertow-ssl/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-undertow-ssl/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-undertow/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-undertow/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-war/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-war/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-freemarker/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-freemarker/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-groovy-templates/build.gradle delete mode 100755 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-groovy-templates/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-jsp/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-jsp/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-method-security/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-method-security/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-mustache/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-mustache/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure-custom/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure-custom/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure-jdbc/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure-jdbc/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-static/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-static/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-ui/build.gradle delete mode 100755 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-ui/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webflux-coroutines/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webflux-coroutines/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webflux/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webflux/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webservices/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webservices/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-jetty/build.gradle delete mode 100755 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-jetty/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-tomcat/build.gradle delete mode 100755 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-tomcat/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-undertow/build.gradle delete mode 100755 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-undertow/pom.xml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-xml/build.gradle delete mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-xml/pom.xml diff --git a/.bomr/bomr.yaml b/.bomr/bomr.yaml deleted file mode 100644 index a9ac945f30..0000000000 --- a/.bomr/bomr.yaml +++ /dev/null @@ -1,28 +0,0 @@ -bomr: - bom: spring-boot-project/spring-boot-dependencies/pom.xml - upgrade: - github: - organization: spring-projects - repository: spring-boot - issue-labels: - - 'type: dependency-upgrade' - policy: same-major-version - prohibited: - - project: derby - versions: - # 10.15 requires Java 9 - - '[10.15,)' - verify: - ignored-dependencies: - # Avoid conflicting transitive requirements for - # io.grpc:grpc-core:jar:[1.0.1,1.0.1] (Jetty), - # io.grpc:grpc-core:jar:[1.14.0,1.14.0] (Micrometer's Azure Registry), and - # io.grpc:grpc-core:jar:[1.15.0,1.15.0] (Micrometer's Stackdriver Registry) - - 'io.micrometer:micrometer-registry-azure-monitor' - - 'org.eclipse.jetty.gcloud:jetty-gcloud-session-manager' - - 'org.eclipse.jetty:jetty-home' - repositories: - # Caffeine Simulator's dependencies - - 'https://maven.imagej.net/content/repositories/public/' - # Spring Data GemFire's GemFire dependencies - - 'https://repo.spring.io/gemstone-release-pivotal-cache' diff --git a/.gitignore b/.gitignore index 4dbf2657a9..d37eb49a80 100644 --- a/.gitignore +++ b/.gitignore @@ -22,12 +22,16 @@ MANIFEST.MF _site/ activemq-data bin +build +!/**/src/**/bin +!/**/src/**/build build.log dependency-reduced-pom.xml dump.rdb interpolated*.xml lib/ manifest.yml +out overridedb.* target transaction-logs diff --git a/.mvn/jvm.config b/.mvn/jvm.config deleted file mode 100644 index f432c96022..0000000000 --- a/.mvn/jvm.config +++ /dev/null @@ -1 +0,0 @@ --Xmx1536m \ No newline at end of file diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar deleted file mode 100755 index e89f07c229cbd97f4e39b0eddba64604d1dca9f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50709 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 Existing Gradle project` from the `File -> Import…` menu to import the code. === Importing into IntelliJ IDEA -**Please, do this first!** -Go to `Preferences | Build, Execution, Deployment | Build Tools | Maven | Importing` -and set `VM options for importer` to `-Xmx2g` to allocate sufficient memory for IDEA's -Maven import process to parse the Spring Boot project structure. _Not doing so could -mean the import fails silently, leaving the project setup incomplete._ - -For the actual import use "`File`" -> "`Open`" and select the root `pom.xml`, or the -`spring-boot-project/pom.xml` if you only want the Spring Boot project sources. +Use "`File`" -> "`Open`" and then select the root `build.gradle` file to import the code. @@ -239,16 +186,8 @@ needs to be added. === Importing into Other IDEs -Maven is well supported by most Java IDEs. Refer to your vendor documentation. - - +Gradle is well supported by most Java IDEs. Refer to your vendor documentation. -== Integration Tests -The smoke tests run as part of the build when you `./mvnw install`. -Due to the fact that they make use of the `spring-boot-maven-plugin` -they cannot be called directly, and so instead are launched via the -`maven-invoker-plugin`. If you encounter build failures running the integration tests, -check the `build.log` file in the appropriate smoke test directory. == Cloning the git repository on Windows diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000000..bc35a69d00 --- /dev/null +++ b/build.gradle @@ -0,0 +1,20 @@ +plugins { + id 'org.jetbrains.kotlin.jvm' apply false // https://youtrack.jetbrains.com/issue/KT-30276 +} + +description = 'Spring Boot Build' + +allprojects { + group 'org.springframework.boot' + + repositories { + mavenCentral() + maven { url 'https://repo.spring.io/milestone' } + maven { url 'https://repo.spring.io/snapshot' } + } + + configurations.all { + resolutionStrategy.cacheChangingModulesFor 60, 'minutes' + } + +} diff --git a/buildSrc/README.adoc b/buildSrc/README.adoc new file mode 100644 index 0000000000..44c7bc7f43 --- /dev/null +++ b/buildSrc/README.adoc @@ -0,0 +1,26 @@ += BOM Plugin + +Allows one to publish a BOM from Gradle. +Properties, dependencies, and other BOMs are applied to the `bom {}` extension. + +This plugin applies the `java-platform` and `maven-publish` plugins to the Project it's applied to. + +== Usage + +[source,groovy,indent=0] +---- +plugins { + id 'org.springframework.boot.bom' +} + +bom { + property 'logback.version', '1.2.3' + property 'junit-jupiter.version', '5.3.2' + + dependency 'ch.qos.logback', 'logback-classic', '${logback.version}' + dependency 'ch.qos.logback', 'logback-core', '${logback.version}' + + bomImport 'org.junit', 'junit-bom', '${junit-jupiter.version}' +} +---- + diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle new file mode 100644 index 0000000000..b0587d4d33 --- /dev/null +++ b/buildSrc/build.gradle @@ -0,0 +1,84 @@ +plugins { + id 'java-gradle-plugin' + id 'io.spring.javaformat' version '0.0.18-SNAPSHOT' + id 'checkstyle' +} + +repositories { + mavenCentral() + gradlePluginPortal() + maven { url 'https://repo.spring.io/release' } +} + +sourceCompatibility = 1.8 +targetCompatibility = 1.8 + +dependencies { + checkstyle 'io.spring.javaformat:spring-javaformat-checkstyle:0.0.15' + implementation 'com.fasterxml.jackson.core:jackson-databind:2.10.0' + implementation 'commons-codec:commons-codec:1.13' + implementation 'org.apache.maven:maven-embedder:3.6.2' + implementation 'org.asciidoctor:asciidoctor-gradle-jvm:2.4.0' + implementation 'org.springframework:spring-core:5.2.2.RELEASE' + implementation 'org.springframework:spring-web:5.2.2.RELEASE' + implementation 'com.google.code.gson:gson:2.8.5' + implementation 'io.spring.javaformat:spring-javaformat-gradle-plugin:0.0.15' + testImplementation 'org.assertj:assertj-core:3.11.1' + testImplementation 'org.apache.logging.log4j:log4j-core:2.12.1' + testImplementation 'org.junit.jupiter:junit-jupiter:5.5.2' +} + +checkstyle { + def archive = configurations.checkstyle.filter { it.name.startsWith('spring-javaformat-checkstyle')} + config = resources.text.fromArchiveEntry(archive, 'io/spring/javaformat/checkstyle/checkstyle.xml') + toolVersion = 8.11 +} + +gradlePlugin { + plugins { + autoConfigurationPlugin { + id = "org.springframework.boot.auto-configuration" + implementationClass = "org.springframework.boot.build.autoconfigure.AutoConfigurationPlugin" + } + bomPlugin { + id = "org.springframework.boot.bom" + implementationClass = "org.springframework.boot.build.bom.BomPlugin" + } + configurationPropertiesPlugin { + id = "org.springframework.boot.configuration-properties" + implementationClass = "org.springframework.boot.build.context.properties.ConfigurationPropertiesPlugin" + } + conventionsPlugin { + id = "org.springframework.boot.conventions" + implementationClass = "org.springframework.boot.build.ConventionsPlugin" + } + deployedPlugin { + id = "org.springframework.boot.deployed" + implementationClass = "org.springframework.boot.build.DeployedPlugin" + } + integrationTestPlugin { + id = "org.springframework.boot.integration-test" + implementationClass = "org.springframework.boot.build.test.IntegrationTestPlugin" + } + mavenPluginPlugin { + id = "org.springframework.boot.maven-plugin" + implementationClass = "org.springframework.boot.build.mavenplugin.MavenPluginPlugin" + } + mavenRepositoryPlugin { + id = "org.springframework.boot.maven-repository" + implementationClass = "org.springframework.boot.build.MavenRepositoryPlugin" + } + optionalDependenciesPlugin { + id = "org.springframework.boot.optional-dependencies" + implementationClass = "org.springframework.boot.build.optional.OptionalDependenciesPlugin" + } + starterPlugin { + id = "org.springframework.boot.starter" + implementationClass = "org.springframework.boot.build.starters.StarterPlugin" + } + } +} + +test { + useJUnitPlatform() +} diff --git a/buildSrc/settings.gradle b/buildSrc/settings.gradle new file mode 100644 index 0000000000..ce6d3a43da --- /dev/null +++ b/buildSrc/settings.gradle @@ -0,0 +1,16 @@ +pluginManagement { + repositories { + mavenCentral() + gradlePluginPortal() + maven { url 'https://repo.spring.io/snapshot' } + } + resolutionStrategy { + eachPlugin { + if (requested.id.id == 'io.spring.javaformat') { + useModule "io.spring.javaformat:spring-javaformat-gradle-plugin:${requested.version}" + } + } + } +} + +apply from: new File(settingsDir, '../gradle/build-cache-settings.gradle') diff --git a/buildSrc/src/main/java/org/springframework/boot/build/AsciidoctorConventions.java b/buildSrc/src/main/java/org/springframework/boot/build/AsciidoctorConventions.java new file mode 100644 index 0000000000..132940f685 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/AsciidoctorConventions.java @@ -0,0 +1,213 @@ +/* + * Copyright 2019 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.boot.build; + +import java.io.File; +import java.net.URI; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.asciidoctor.gradle.jvm.AbstractAsciidoctorTask; +import org.asciidoctor.gradle.jvm.AsciidoctorJExtension; +import org.asciidoctor.gradle.jvm.AsciidoctorJPlugin; +import org.asciidoctor.gradle.jvm.AsciidoctorTask; +import org.gradle.api.Action; +import org.gradle.api.DefaultTask; +import org.gradle.api.Project; +import org.gradle.api.Task; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.file.FileCollection; +import org.gradle.api.tasks.InputFiles; +import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.Sync; +import org.gradle.api.tasks.TaskAction; + +import org.springframework.util.StringUtils; + +/** + * Conventions that are applied in the presence of the {@link AsciidoctorJPlugin}. When + * the plugin is applied: + * + *
    + *
  • All warnings are made fatal. + *
  • A task is created to resolve and unzip our documentation resources (CSS and + * Javascript). + *
  • For each {@link AsciidoctorTask} (HTML only): + *
      + *
    • A task is created to sync the documentation resources to its output directory. + *
    • {@code doctype} {@link AsciidoctorTask#options(Map) option} is configured. + *
    • {@link AsciidoctorTask#attributes(Map) Attributes} are configured for syntax + * highlighting, CSS styling, docinfo, etc. + *
    + *
  • For each {@link AbstractAsciidoctorTask} (HTML and PDF): + *
      + *
    • {@link AsciidoctorTask#attributes(Map) Attributes} are configured to enable + * warnings for references to missing attributes, the GitHub tag, the Artifactory repo for + * the current version, etc. + *
    • {@link AbstractAsciidoctorTask#baseDirFollowsSourceDir() baseDirFollowsSourceDir()} + * is enabled. + *
    + *
+ * + * @author Andy Wilkinson + */ +class AsciidoctorConventions { + + void apply(Project project) { + project.getPlugins().withType(AsciidoctorJPlugin.class, (asciidoctorPlugin) -> { + configureDocResourcesRepository(project); + makeAllWarningsFatal(project); + UnzipDocumentationResources unzipResources = createUnzipDocumentationResourcesTask(project); + project.getTasks().withType(AbstractAsciidoctorTask.class, (asciidoctorTask) -> { + configureCommonAttributes(project, asciidoctorTask); + configureOptions(asciidoctorTask); + asciidoctorTask.baseDirFollowsSourceDir(); + Sync syncSource = createSyncDocumentationSourceTask(project, asciidoctorTask); + if (asciidoctorTask instanceof AsciidoctorTask) { + configureHtmlOnlyAttributes(project, asciidoctorTask); + syncSource.from(unzipResources, (resources) -> resources.into("asciidoc")); + asciidoctorTask.doFirst(new Action() { + + @Override + public void execute(Task task) { + project.copy((spec) -> { + spec.from(asciidoctorTask.getSourceDir()); + spec.into(asciidoctorTask.getOutputDir()); + spec.include("css/**", "js/**"); + }); + } + + }); + } + }); + }); + } + + private void configureDocResourcesRepository(Project project) { + project.getRepositories().maven((mavenRepo) -> { + mavenRepo.setUrl(URI.create("https://repo.spring.io/release")); + mavenRepo.mavenContent((mavenContent) -> mavenContent.includeGroup("io.spring.docresources")); + }); + } + + private void makeAllWarningsFatal(Project project) { + project.getExtensions().getByType(AsciidoctorJExtension.class).fatalWarnings(".*"); + } + + private UnzipDocumentationResources createUnzipDocumentationResourcesTask(Project project) { + Configuration documentationResources = project.getConfigurations().maybeCreate("documentationResources"); + documentationResources.getDependencies() + .add(project.getDependencies().create("io.spring.docresources:spring-doc-resources:0.1.3.RELEASE")); + UnzipDocumentationResources unzipResources = project.getTasks().create("unzipDocumentationResources", + UnzipDocumentationResources.class); + unzipResources.setResources(documentationResources); + unzipResources.setOutputDir(new File(project.getBuildDir(), "docs/resources")); + return unzipResources; + } + + private Sync createSyncDocumentationSourceTask(Project project, AbstractAsciidoctorTask asciidoctorTask) { + Sync syncDocumentationSource = project.getTasks() + .create("syncDocumentationSourceFor" + StringUtils.capitalize(asciidoctorTask.getName()), Sync.class); + File syncedSource = new File(project.getBuildDir(), "docs/src/" + asciidoctorTask.getName()); + syncDocumentationSource.setDestinationDir(syncedSource); + syncDocumentationSource.from("src/docs/"); + asciidoctorTask.dependsOn(syncDocumentationSource); + asciidoctorTask.setSourceDir(project.relativePath(new File(syncedSource, "asciidoc/"))); + return syncDocumentationSource; + } + + private void configureOptions(AbstractAsciidoctorTask asciidoctorTask) { + asciidoctorTask.options(Collections.singletonMap("doctype", "book")); + } + + private void configureHtmlOnlyAttributes(Project project, AbstractAsciidoctorTask asciidoctorTask) { + Map attributes = new HashMap<>(); + attributes.put("highlightjsdir", "js/highlight"); + attributes.put("highlightjs-theme", "github"); + attributes.put("linkcss", true); + attributes.put("icons", "font"); + attributes.put("stylesheet", "css/spring.css"); + asciidoctorTask.attributes(attributes); + } + + private void configureCommonAttributes(Project project, AbstractAsciidoctorTask asciidoctorTask) { + Map attributes = new HashMap<>(); + attributes.put("attribute-missing", "warn"); + attributes.put("github-tag", determineGitHubTag(project)); + attributes.put("spring-boot-artifactory-repo", determineArtifactoryRepo(project)); + attributes.put("version", "{gradle-project-version}"); + asciidoctorTask.attributes(attributes); + } + + private String determineArtifactoryRepo(Project project) { + String version = project.getVersion().toString(); + String type = version.substring(version.lastIndexOf('.')); + if (type.equals("RELEASE")) { + return "release"; + } + if (type.startsWith("M") || type.startsWith("RC")) { + return "milestone"; + } + return "snapshot"; + } + + private String determineGitHubTag(Project project) { + String version = "v" + project.getVersion(); + return (version.endsWith("-SNAPSHOT")) ? "master" : version; + } + + /** + * {@link Task} for unzipping the documentation resources. + */ + public static class UnzipDocumentationResources extends DefaultTask { + + private FileCollection resources; + + private File outputDir; + + @InputFiles + public FileCollection getResources() { + return this.resources; + } + + public void setResources(FileCollection resources) { + this.resources = resources; + } + + @OutputDirectory + public File getOutputDir() { + return this.outputDir; + } + + public void setOutputDir(File outputDir) { + this.outputDir = outputDir; + } + + @TaskAction + void syncDocumentationResources() { + getProject().sync((copySpec) -> { + copySpec.into(this.outputDir); + for (File resource : this.resources) { + copySpec.from(getProject().zipTree(resource)); + } + }); + } + + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/ConventionsPlugin.java b/buildSrc/src/main/java/org/springframework/boot/build/ConventionsPlugin.java new file mode 100644 index 0000000000..30aa02b726 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/ConventionsPlugin.java @@ -0,0 +1,207 @@ +/* + * Copyright 2012-2020 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.boot.build; + +import java.util.Map; +import java.util.TreeMap; + +import io.spring.javaformat.gradle.SpringJavaFormatPlugin; +import org.apache.maven.artifact.repository.MavenArtifactRepository; +import org.asciidoctor.gradle.jvm.AsciidoctorJPlugin; +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.artifacts.DependencySet; +import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.plugins.JavaPluginExtension; +import org.gradle.api.plugins.quality.CheckstyleExtension; +import org.gradle.api.plugins.quality.CheckstylePlugin; +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; +import org.gradle.api.tasks.bundling.Jar; +import org.gradle.api.tasks.compile.JavaCompile; +import org.gradle.api.tasks.javadoc.Javadoc; +import org.gradle.api.tasks.testing.Test; + +/** + * Plugin to apply conventions to projects that are part of Spring Boot's build. + * Conventions are applied in response to various plugins being applied. + * + *

+ * + * When the {@link JavaPlugin Java plugin} is applied: + * + *

    + *
  • {@code sourceCompatibility} is set to {@code 1.8} + *
  • Spring Java Format and Checkstyle plugins are applied + *
  • {@link Test} tasks are configured to use JUnit Platform and use a max heap of 1024M + *
  • {@link JavaCompile} tasks are configured to use UTF-8 encoding + *
  • {@link Javadoc} tasks are configured to use UTF-8 encoding + *
  • {@link Jar} tasks are configured to have the following manifest entries: + *
      + *
    • {@code Automatic-Module-Name} + *
    • {@code Build-Jdk-Spec} + *
    • {@code Built-By} + *
    • {@code Implementation-Title} + *
    • {@code Implementation-Version} + *
    + *
+ * + *

+ * + * When the {@link MavenPublishPlugin Maven Publish plugin} is applied: + * + *

    + *
  • If the {@code deploymentRepository} property has been set, a + * {@link MavenArtifactRepository Maven artifact repository} is configured to publish to + * it. + *
  • The poms of all {@link MavenPublication Maven publications} are customized to meet + * Maven Central's requirements. + *
  • If the {@link JavaPlugin Java plugin} has also been applied, creation of Javadoc + * and source jars is enabled. + *
+ * + *

+ * + * When the {@link AsciidoctorJPlugin} is applied, the conventions in + * {@link AsciidoctorConventions} are applied. + * + * @author Andy Wilkinson + */ +public class ConventionsPlugin implements Plugin { + + @Override + public void apply(Project project) { + applyJavaConventions(project); + applyAsciidoctorConventions(project); + applyMavenPublishingConventions(project); + } + + private void applyJavaConventions(Project project) { + project.getPlugins().withType(JavaPlugin.class, (java) -> { + configureSpringJavaFormat(project); + project.setProperty("sourceCompatibility", "1.8"); + project.getTasks().withType(JavaCompile.class, (compile) -> compile.getOptions().setEncoding("UTF-8")); + project.getTasks().withType(Javadoc.class, + (javadoc) -> javadoc.getOptions().source("1.8").encoding("UTF-8")); + project.getTasks().withType(Test.class, (test) -> { + test.useJUnitPlatform(); + test.setMaxHeapSize("1024M"); + }); + project.getTasks().withType(Jar.class, (jar) -> { + project.afterEvaluate((evaluated) -> { + jar.manifest((manifest) -> { + Map attributes = new TreeMap<>(); + attributes.put("Automatic-Module-Name", project.getName().replace("-", ".")); + attributes.put("Build-Jdk-Spec", project.property("sourceCompatibility")); + attributes.put("Built-By", "Spring"); + attributes.put("Implementation-Title", project.getDescription()); + attributes.put("Implementation-Version", project.getVersion()); + manifest.attributes(attributes); + }); + }); + }); + }); + } + + private void configureSpringJavaFormat(Project project) { + project.getPlugins().apply(SpringJavaFormatPlugin.class); + project.getPlugins().apply(CheckstylePlugin.class); + CheckstyleExtension checkstyle = project.getExtensions().getByType(CheckstyleExtension.class); + checkstyle.setToolVersion("8.22"); + checkstyle.getConfigDirectory().set(project.getRootProject().file("src/checkstyle")); + String version = SpringJavaFormatPlugin.class.getPackage().getImplementationVersion(); + DependencySet checkstyleDependencies = project.getConfigurations().getByName("checkstyle").getDependencies(); + checkstyleDependencies + .add(project.getDependencies().create("io.spring.javaformat:spring-javaformat-checkstyle:" + version)); + checkstyleDependencies + .add(project.getDependencies().create("io.spring.nohttp:nohttp-checkstyle:0.0.3.RELEASE")); + } + + private void applyAsciidoctorConventions(Project project) { + new AsciidoctorConventions().apply(project); + } + + private void applyMavenPublishingConventions(Project project) { + project.getPlugins().withType(MavenPublishPlugin.class).all((mavenPublish) -> { + PublishingExtension publishing = project.getExtensions().getByType(PublishingExtension.class); + if (project.hasProperty("deploymentRepository")) { + publishing.getRepositories().maven((mavenRepository) -> { + mavenRepository.setUrl(project.property("deploymentRepository")); + mavenRepository.setName("deployment"); + }); + } + publishing.getPublications().withType(MavenPublication.class) + .all((mavenPublication) -> customizePom(mavenPublication.getPom(), project)); + project.getPlugins().withType(JavaPlugin.class).all((javaPlugin) -> { + JavaPluginExtension extension = project.getExtensions().getByType(JavaPluginExtension.class); + extension.withJavadocJar(); + extension.withSourcesJar(); + }); + }); + } + + private void customizePom(MavenPom pom, Project project) { + pom.getUrl().set("https://projects.spring.io/spring-boot/#"); + pom.getDescription().set(project.provider(project::getDescription)); + pom.organization(this::customizeOrganization); + pom.licenses(this::customizeLicences); + pom.developers(this::customizeDevelopers); + pom.scm(this::customizeScm); + 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("http://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) { + scm.getConnection().set("scm:git:git://github.com/spring-projects/spring-boot.git"); + scm.getDeveloperConnection().set("scm:git:ssh://git@github.com/spring-projects/spring-boot.git"); + scm.getUrl().set("https://github.com/spring-projects/spring-boot"); + + } + + private void customizeIssueManagement(MavenPomIssueManagement issueManagement) { + issueManagement.getSystem().set("GitHub"); + issueManagement.getUrl().set("https://github.com/spring-projects/spring-boot/issues"); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/DeployedPlugin.java b/buildSrc/src/main/java/org/springframework/boot/build/DeployedPlugin.java new file mode 100644 index 0000000000..30dc9d3db1 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/DeployedPlugin.java @@ -0,0 +1,54 @@ +/* + * Copyright 2019 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.boot.build; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; +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; + +/** + * A plugin applied to a project that should be deployed. + * + * @author Andy Wilkinson + */ +public class DeployedPlugin implements Plugin { + + /** + * Name of the task that generates the deployed pom file. + */ + public static final String GENERATE_POM_TASK_NAME = "generatePomFileForMavenPublication"; + + @Override + public void apply(Project project) { + project.getPlugins().apply(MavenPublishPlugin.class); + project.getPlugins().apply(MavenRepositoryPlugin.class); + PublishingExtension publishing = project.getExtensions().getByType(PublishingExtension.class); + MavenPublication mavenPublication = publishing.getPublications().create("maven", MavenPublication.class); + project.getPlugins().withType(JavaPlugin.class) + .all((javaPlugin) -> project.getComponents().matching((component) -> component.getName().equals("java")) + .all((javaComponent) -> mavenPublication.from(javaComponent))); + project.getPlugins().withType(JavaPlatformPlugin.class) + .all((javaPlugin) -> project.getComponents() + .matching((component) -> component.getName().equals("javaPlatform")) + .all((javaComponent) -> mavenPublication.from(javaComponent))); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/MavenRepositoryPlugin.java b/buildSrc/src/main/java/org/springframework/boot/build/MavenRepositoryPlugin.java new file mode 100644 index 0000000000..d7fcbfdcbc --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/MavenRepositoryPlugin.java @@ -0,0 +1,111 @@ +/* + * Copyright 2012-2020 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.boot.build; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import org.gradle.api.Action; +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.Task; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.DependencySet; +import org.gradle.api.artifacts.ProjectDependency; +import org.gradle.api.plugins.JavaLibraryPlugin; +import org.gradle.api.plugins.JavaPlatformPlugin; +import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.publish.PublishingExtension; +import org.gradle.api.publish.maven.plugins.MavenPublishPlugin; + +/** + * A plugin to make a project's {@code deployment} publication available as a Maven + * repository. The repository can be consumed by depending upon the project using the + * {@code mavenRepository} configuration. + * + * @author Andy Wilkinson + */ +public class MavenRepositoryPlugin implements Plugin { + + /** + * Name of the {@code mavenRepository} configuration. + */ + public static final String MAVEN_REPOSITORY_CONFIGURATION_NAME = "mavenRepository"; + + /** + * Name of the task that publishes to the project repository. + */ + public static final String PUBLISH_TO_PROJECT_REPOSITORY_TASK_NAME = "publishMavenPublicationToProjectRepository"; + + @Override + public void apply(Project project) { + project.getPlugins().apply(MavenPublishPlugin.class); + PublishingExtension publishing = project.getExtensions().getByType(PublishingExtension.class); + File repositoryLocation = new File(project.getBuildDir(), "maven-repository"); + publishing.getRepositories().maven((mavenRepository) -> { + mavenRepository.setName("project"); + mavenRepository.setUrl(repositoryLocation.toURI()); + }); + project.getTasks().matching((task) -> task.getName().equals(PUBLISH_TO_PROJECT_REPOSITORY_TASK_NAME)) + .all((task) -> setUpProjectRepository(project, task, repositoryLocation)); + project.getTasks().matching((task) -> task.getName().equals("publishPluginMavenPublicationToProjectRepository")) + .all((task) -> setUpProjectRepository(project, task, repositoryLocation)); + } + + private void setUpProjectRepository(Project project, Task publishTask, File repositoryLocation) { + publishTask.doFirst(new CleanAction(repositoryLocation)); + Configuration projectRepository = project.getConfigurations().create(MAVEN_REPOSITORY_CONFIGURATION_NAME); + project.getArtifacts().add(projectRepository.getName(), repositoryLocation, + (artifact) -> artifact.builtBy(publishTask)); + DependencySet target = projectRepository.getDependencies(); + project.getPlugins().withType(JavaPlugin.class).all((javaPlugin) -> addMavenRepositoryDependencies(project, + JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME, target)); + project.getPlugins().withType(JavaLibraryPlugin.class) + .all((javaLibraryPlugin) -> addMavenRepositoryDependencies(project, JavaPlugin.API_CONFIGURATION_NAME, + target)); + project.getPlugins().withType(JavaPlatformPlugin.class) + .all((javaPlugin) -> addMavenRepositoryDependencies(project, JavaPlatformPlugin.API_CONFIGURATION_NAME, + target)); + } + + private void addMavenRepositoryDependencies(Project project, String sourceConfigurationName, DependencySet target) { + project.getConfigurations().getByName(sourceConfigurationName).getDependencies() + .withType(ProjectDependency.class).all((dependency) -> { + Map dependencyDescriptor = new HashMap<>(); + dependencyDescriptor.put("path", dependency.getDependencyProject().getPath()); + dependencyDescriptor.put("configuration", MAVEN_REPOSITORY_CONFIGURATION_NAME); + target.add(project.getDependencies().project(dependencyDescriptor)); + }); + } + + private static final class CleanAction implements Action { + + private final File location; + + private CleanAction(File location) { + this.location = location; + } + + @Override + public void execute(Task task) { + task.getProject().delete(this.location); + } + + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/AutoConfigurationMetadata.java b/buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/AutoConfigurationMetadata.java new file mode 100644 index 0000000000..c4664062b4 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/AutoConfigurationMetadata.java @@ -0,0 +1,93 @@ +/* + * Copyright 2012-2020 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.boot.build.autoconfigure; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Reader; +import java.util.Properties; +import java.util.concurrent.Callable; + +import org.gradle.api.Task; +import org.gradle.api.internal.AbstractTask; +import org.gradle.api.tasks.OutputFile; +import org.gradle.api.tasks.SourceSet; +import org.gradle.api.tasks.TaskAction; + +/** + * A {@link Task} for generating metadata describing a project's auto-configuration + * classes. + * + * @author Andy Wilkinson + */ +public class AutoConfigurationMetadata extends AbstractTask { + + private SourceSet sourceSet; + + private File outputFile; + + public AutoConfigurationMetadata() { + getInputs().file((Callable) () -> new File(this.sourceSet.getOutput().getResourcesDir(), + "META-INF/spring.factories")); + dependsOn((Callable) () -> this.sourceSet.getProcessResourcesTaskName()); + getProject().getConfigurations() + .maybeCreate(AutoConfigurationPlugin.AUTO_CONFIGURATION_METADATA_CONFIGURATION_NAME); + } + + public void setSourceSet(SourceSet sourceSet) { + this.sourceSet = sourceSet; + } + + @OutputFile + public File getOutputFile() { + return this.outputFile; + } + + public void setOutputFile(File outputFile) { + this.outputFile = outputFile; + } + + @TaskAction + void documentAutoConfiguration() throws IOException { + Properties autoConfiguration = readAutoConfiguration(); + getOutputFile().getParentFile().mkdirs(); + try (FileWriter writer = new FileWriter(getOutputFile())) { + autoConfiguration.store(writer, null); + } + } + + private Properties readAutoConfiguration() throws IOException { + Properties autoConfiguration = new Properties(); + Properties springFactories = readSpringFactories( + new File(this.sourceSet.getOutput().getResourcesDir(), "META-INF/spring.factories")); + autoConfiguration.setProperty("autoConfigurationClassNames", + springFactories.getProperty("org.springframework.boot.autoconfigure.EnableAutoConfiguration")); + autoConfiguration.setProperty("module", getProject().getName()); + return autoConfiguration; + } + + private Properties readSpringFactories(File file) throws IOException { + Properties springFactories = new Properties(); + try (Reader in = new FileReader(file)) { + springFactories.load(in); + } + return springFactories; + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/AutoConfigurationPlugin.java b/buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/AutoConfigurationPlugin.java new file mode 100644 index 0000000000..7c2c77b4d2 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/AutoConfigurationPlugin.java @@ -0,0 +1,78 @@ +/* + * Copyright 2019 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.boot.build.autoconfigure; + +import java.io.File; +import java.util.Collections; +import java.util.concurrent.Callable; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.plugins.JavaPluginConvention; +import org.gradle.api.tasks.SourceSet; + +import org.springframework.boot.build.DeployedPlugin; +import org.springframework.boot.build.context.properties.ConfigurationPropertiesPlugin; + +/** + * {@link Plugin} for projects that define auto-configuration. When applied, the plugin + * applies the {@link DeployedPlugin}. Additionally, it reacts to the presence of the + * {@link JavaPlugin} by: + * + *

    + *
  • Applying the {@link ConfigurationPropertiesPlugin}. + *
  • Adding a dependency on the auto-configuration annotation processor. + *
  • Defining a task that produces metadata describing the auto-configuration. The + * metadata is made available as an artifact in the + *
+ * + * @author Andy Wilkinson + */ +public class AutoConfigurationPlugin implements Plugin { + + /** + * Name of the {@link Configuration} that holds the auto-configuration metadata + * artifact. + */ + public static final String AUTO_CONFIGURATION_METADATA_CONFIGURATION_NAME = "autoConfigurationMetadata"; + + @Override + public void apply(Project project) { + project.getPlugins().apply(DeployedPlugin.class); + project.getPlugins().withType(JavaPlugin.class, (javaPlugin) -> { + project.getPlugins().apply(ConfigurationPropertiesPlugin.class); + Configuration annotationProcessors = project.getConfigurations() + .getByName(JavaPlugin.ANNOTATION_PROCESSOR_CONFIGURATION_NAME); + annotationProcessors.getDependencies() + .add(project.getDependencies().project(Collections.singletonMap("path", + ":spring-boot-project:spring-boot-tools:spring-boot-autoconfigure-processor"))); + annotationProcessors.getDependencies() + .add(project.getDependencies().project(Collections.singletonMap("path", + ":spring-boot-project:spring-boot-tools:spring-boot-configuration-processor"))); + project.getTasks().create("autoConfigurationMetadata", AutoConfigurationMetadata.class, (task) -> { + task.setSourceSet(project.getConvention().getPlugin(JavaPluginConvention.class).getSourceSets() + .getByName(SourceSet.MAIN_SOURCE_SET_NAME)); + task.setOutputFile(new File(project.getBuildDir(), "auto-configuration-metadata.properties")); + project.getArtifacts().add(AutoConfigurationPlugin.AUTO_CONFIGURATION_METADATA_CONFIGURATION_NAME, + project.provider((Callable) task::getOutputFile), (artifact) -> artifact.builtBy(task)); + }); + }); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/DocumentAutoConfigurationClasses.java b/buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/DocumentAutoConfigurationClasses.java new file mode 100644 index 0000000000..6302342dd7 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/DocumentAutoConfigurationClasses.java @@ -0,0 +1,136 @@ +/* + * Copyright 2012-2020 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.boot.build.autoconfigure; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.Reader; +import java.util.Properties; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; +import java.util.stream.Collectors; + +import org.gradle.api.Task; +import org.gradle.api.file.FileCollection; +import org.gradle.api.internal.AbstractTask; +import org.gradle.api.tasks.InputFiles; +import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.TaskAction; + +import org.springframework.util.StringUtils; + +/** + * {@link Task} used to document auto-configuration classes. + * + * @author Andy Wilkinson + */ +public class DocumentAutoConfigurationClasses extends AbstractTask { + + private FileCollection autoConfiguration; + + private File outputDir; + + @InputFiles + public FileCollection getAutoConfiguration() { + return this.autoConfiguration; + } + + public void setAutoConfiguration(FileCollection autoConfiguration) { + this.autoConfiguration = autoConfiguration; + } + + @OutputDirectory + public File getOutputDir() { + return this.outputDir; + } + + public void setOutputDir(File outputDir) { + this.outputDir = outputDir; + } + + @TaskAction + void documentAutoConfigurationClasses() throws IOException { + for (File metadataFile : this.autoConfiguration) { + Properties metadata = new Properties(); + try (Reader reader = new FileReader(metadataFile)) { + metadata.load(reader); + } + AutoConfiguration autoConfiguration = new AutoConfiguration(metadata.getProperty("module"), new TreeSet<>( + StringUtils.commaDelimitedListToSet(metadata.getProperty("autoConfigurationClassNames")))); + writeTable(autoConfiguration); + } + } + + private void writeTable(AutoConfiguration autoConfigurationClasses) throws IOException { + this.outputDir.mkdirs(); + try (PrintWriter writer = new PrintWriter( + new FileWriter(new File(this.outputDir, autoConfigurationClasses.module + ".adoc")))) { + writer.println("[cols=\"4,1\"]"); + writer.println("|==="); + writer.println("| Configuration Class | Links"); + + for (AutoConfigurationClass autoConfigurationClass : autoConfigurationClasses.classes) { + writer.println(); + writer.printf("| {spring-boot-code}/spring-boot-project/%s/src/main/java/%s.java[`%s`]%n", + autoConfigurationClasses.module, autoConfigurationClass.path, autoConfigurationClass.name); + writer.printf("| {spring-boot-api}/%s.html[javadoc]%n", autoConfigurationClass.path); + } + + writer.println("|==="); + } + } + + private static final class AutoConfiguration { + + private final String module; + + private final SortedSet classes; + + private AutoConfiguration(String module, Set classNames) { + this.module = module; + this.classes = classNames.stream().map((className) -> { + String path = className.replace('.', '/'); + String name = className.substring(className.lastIndexOf('.') + 1); + return new AutoConfigurationClass(name, path); + }).collect(Collectors.toCollection(TreeSet::new)); + } + + } + + private static final class AutoConfigurationClass implements Comparable { + + private final String name; + + private final String path; + + private AutoConfigurationClass(String name, String path) { + this.name = name; + this.path = path; + } + + @Override + public int compareTo(AutoConfigurationClass other) { + return this.name.compareTo(other.name); + } + + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/BomExtension.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/BomExtension.java new file mode 100644 index 0000000000..e524749a0d --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/BomExtension.java @@ -0,0 +1,297 @@ +/* + * Copyright 2012-2020 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.boot.build.bom; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import groovy.lang.Closure; +import groovy.lang.GroovyObjectSupport; +import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; +import org.apache.maven.artifact.versioning.VersionRange; +import org.gradle.api.InvalidUserCodeException; +import org.gradle.api.InvalidUserDataException; +import org.gradle.api.artifacts.dsl.DependencyHandler; +import org.gradle.util.ConfigureUtil; + +import org.springframework.boot.build.bom.Library.Exclusion; +import org.springframework.boot.build.bom.Library.Group; +import org.springframework.boot.build.bom.Library.Module; +import org.springframework.boot.build.bom.Library.ProhibitedVersion; +import org.springframework.boot.build.bom.bomr.version.DependencyVersion; + +/** + * DSL extensions for {@link BomPlugin}. + * + * @author Andy Wilkinson + */ +public class BomExtension { + + private final Map properties = new LinkedHashMap<>(); + + private final Map artifactVersionProperties = new HashMap<>(); + + private final List libraries = new ArrayList(); + + private final DependencyHandler dependencyHandler; + + private final UpgradeHandler upgradeHandler = new UpgradeHandler(); + + public BomExtension(DependencyHandler dependencyHandler) { + this.dependencyHandler = dependencyHandler; + } + + public List getLibraries() { + return this.libraries; + } + + public void upgrade(Closure closure) { + ConfigureUtil.configure(closure, this.upgradeHandler); + } + + public Upgrade getUpgrade() { + return new Upgrade(this.upgradeHandler.upgradePolicy, new GitHub(this.upgradeHandler.gitHub.organization, + this.upgradeHandler.gitHub.repository, this.upgradeHandler.gitHub.issueLabels)); + } + + public void library(String name, String version, Closure closure) { + LibraryHandler libraryHandler = new LibraryHandler(); + ConfigureUtil.configure(closure, libraryHandler); + addLibrary(new Library(name, DependencyVersion.parse(version), libraryHandler.groups, + libraryHandler.prohibitedVersions)); + } + + private String createDependencyNotation(String groupId, String artifactId, DependencyVersion version) { + return groupId + ":" + artifactId + ":" + version; + } + + Map getProperties() { + return this.properties; + } + + String getArtifactVersionProperty(String groupId, String artifactId) { + String coordinates = groupId + ":" + artifactId; + return this.artifactVersionProperties.get(coordinates); + } + + private void putArtifactVersionProperty(String groupId, String artifactId, String versionProperty) { + String coordinates = groupId + ":" + artifactId; + String existing = this.artifactVersionProperties.putIfAbsent(coordinates, versionProperty); + if (existing != null) { + throw new InvalidUserDataException("Cannot put version property for '" + coordinates + + "'. Version property '" + existing + "' has already been stored."); + } + } + + private void addLibrary(Library library) { + this.libraries.add(library); + this.properties.put(library.getVersionProperty(), library.getVersion()); + for (Group group : library.getGroups()) { + for (Module module : group.getModules()) { + this.putArtifactVersionProperty(group.getId(), module.getName(), library.getVersionProperty()); + this.dependencyHandler.getConstraints().add("api", + createDependencyNotation(group.getId(), module.getName(), library.getVersion())); + } + for (String bomImport : group.getBoms()) { + this.putArtifactVersionProperty(group.getId(), bomImport, library.getVersionProperty()); + this.dependencyHandler.add("api", this.dependencyHandler + .enforcedPlatform(createDependencyNotation(group.getId(), bomImport, library.getVersion()))); + } + } + } + + public static class LibraryHandler { + + private final List groups = new ArrayList<>(); + + private final List prohibitedVersions = new ArrayList<>(); + + public void group(String id, Closure closure) { + GroupHandler groupHandler = new GroupHandler(id); + ConfigureUtil.configure(closure, groupHandler); + this.groups + .add(new Group(groupHandler.id, groupHandler.modules, groupHandler.plugins, groupHandler.imports)); + } + + public void prohibit(String range, Closure closure) { + ProhibitedVersionHandler prohibitedVersionHandler = new ProhibitedVersionHandler(); + ConfigureUtil.configure(closure, prohibitedVersionHandler); + try { + this.prohibitedVersions.add(new ProhibitedVersion(VersionRange.createFromVersionSpec(range), + prohibitedVersionHandler.reason)); + } + catch (InvalidVersionSpecificationException ex) { + throw new InvalidUserCodeException("Invalid version range", ex); + } + } + + public static class ProhibitedVersionHandler { + + private String reason; + + public void because(String because) { + this.reason = because; + } + + } + + public class GroupHandler extends GroovyObjectSupport { + + private final String id; + + private List modules = new ArrayList<>(); + + private List imports = new ArrayList<>(); + + private List plugins = new ArrayList<>(); + + public GroupHandler(String id) { + this.id = id; + } + + public void setModules(List modules) { + this.modules = modules.stream() + .map((input) -> (input instanceof Module) ? (Module) input : new Module((String) input)) + .collect(Collectors.toList()); + } + + public void setImports(List imports) { + this.imports = imports; + } + + public void setPlugins(List plugins) { + this.plugins = plugins; + } + + public Object methodMissing(String name, Object args) { + if (args instanceof Object[] && ((Object[]) args).length == 1) { + Object arg = ((Object[]) args)[0]; + if (arg instanceof Closure) { + ExclusionHandler exclusionHandler = new ExclusionHandler(); + ConfigureUtil.configure((Closure) arg, exclusionHandler); + return new Module(name, exclusionHandler.exclusions); + } + } + throw new InvalidUserDataException("Invalid exclusion configuration for module '" + name + "'"); + } + + public class ExclusionHandler { + + private final List exclusions = new ArrayList<>(); + + public void exclude(Map exclusion) { + this.exclusions.add(new Exclusion(exclusion.get("group"), exclusion.get("module"))); + } + + } + + } + + } + + public static class UpgradeHandler { + + private UpgradePolicy upgradePolicy; + + private final GitHubHandler gitHub = new GitHubHandler(); + + public void setPolicy(UpgradePolicy upgradePolicy) { + this.upgradePolicy = upgradePolicy; + } + + public void gitHub(Closure closure) { + ConfigureUtil.configure(closure, this.gitHub); + } + + } + + public static final class Upgrade { + + private final UpgradePolicy upgradePolicy; + + private final GitHub gitHub; + + private Upgrade(UpgradePolicy upgradePolicy, GitHub gitHub) { + this.upgradePolicy = upgradePolicy; + this.gitHub = gitHub; + } + + public UpgradePolicy getPolicy() { + return this.upgradePolicy; + } + + public GitHub getGitHub() { + return this.gitHub; + } + + } + + public static class GitHubHandler { + + private String organization = "spring-projects"; + + private String repository = "spring-boot"; + + private List issueLabels; + + public void setOrganization(String organization) { + this.organization = organization; + } + + public void setRepository(String repository) { + this.repository = repository; + } + + public void setIssueLabels(List issueLabels) { + this.issueLabels = issueLabels; + } + + } + + public static final class GitHub { + + private String organization = "spring-projects"; + + private String repository = "spring-boot"; + + private List issueLabels; + + private GitHub(String organization, String repository, List issueLabels) { + this.organization = organization; + this.repository = repository; + this.issueLabels = issueLabels; + } + + public String getOrganization() { + return this.organization; + } + + public String getRepository() { + return this.repository; + } + + public List getIssueLabels() { + return this.issueLabels; + } + + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/BomPlugin.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/BomPlugin.java new file mode 100644 index 0000000000..9b08ede52d --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/BomPlugin.java @@ -0,0 +1,295 @@ +/* + * Copyright 2012-2020 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.boot.build.bom; + +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.stream.Collectors; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathFactory; + +import groovy.util.Node; +import groovy.xml.QName; +import org.gradle.api.Action; +import org.gradle.api.GradleException; +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.Task; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.plugins.JavaPlatformExtension; +import org.gradle.api.plugins.JavaPlatformPlugin; +import org.gradle.api.plugins.PluginContainer; +import org.gradle.api.publish.PublishingExtension; +import org.gradle.api.publish.maven.MavenPom; +import org.gradle.api.publish.maven.MavenPublication; +import org.gradle.api.publish.maven.tasks.GenerateMavenPom; +import org.gradle.api.tasks.Sync; +import org.gradle.api.tasks.TaskExecutionException; +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; + +import org.springframework.boot.build.DeployedPlugin; +import org.springframework.boot.build.MavenRepositoryPlugin; +import org.springframework.boot.build.bom.Library.Group; +import org.springframework.boot.build.bom.bomr.UpgradeBom; +import org.springframework.boot.build.mavenplugin.MavenExec; +import org.springframework.util.FileCopyUtils; + +/** + * {@link Plugin} for defining a bom. Dependencies are added as constraints in the + * {@code api} configuration. Imported boms are added as enforced platforms in the + * {@code api} configuration. + * + * @author Andy Wilkinson + */ +public class BomPlugin implements Plugin { + + @Override + public void apply(Project project) { + PluginContainer plugins = project.getPlugins(); + plugins.apply(DeployedPlugin.class); + plugins.apply(MavenRepositoryPlugin.class); + plugins.apply(JavaPlatformPlugin.class); + JavaPlatformExtension javaPlatform = project.getExtensions().getByType(JavaPlatformExtension.class); + javaPlatform.allowDependencies(); + BomExtension bom = project.getExtensions().create("bom", BomExtension.class, project.getDependencies()); + project.getTasks().create("bomrCheck", CheckBom.class, bom); + project.getTasks().create("bomrUpgrade", UpgradeBom.class, bom); + new PublishingCustomizer(project, bom).customize(); + Configuration effectiveBomConfiguration = project.getConfigurations().create("effectiveBom"); + project.getTasks().matching((task) -> task.getName().equals(DeployedPlugin.GENERATE_POM_TASK_NAME)) + .all((task) -> { + Sync syncBom = project.getTasks().create("syncBom", Sync.class); + syncBom.dependsOn(task); + File generatedBomDir = new File(project.getBuildDir(), "generated/bom"); + syncBom.setDestinationDir(generatedBomDir); + syncBom.from(((GenerateMavenPom) task).getDestination(), (pom) -> pom.rename((name) -> "pom.xml")); + try { + String settingsXmlContent = FileCopyUtils + .copyToString(new InputStreamReader( + getClass().getClassLoader().getResourceAsStream("effective-bom-settings.xml"), + StandardCharsets.UTF_8)) + .replace("localRepositoryPath", + new File(project.getBuildDir(), "local-m2-repository").getAbsolutePath()); + syncBom.from(project.getResources().getText().fromString(settingsXmlContent), + (settingsXml) -> settingsXml.rename((name) -> "settings.xml")); + } + catch (IOException ex) { + throw new GradleException("Failed to prepare settings.xml", ex); + } + MavenExec generateEffectiveBom = project.getTasks().create("generateEffectiveBom", MavenExec.class); + generateEffectiveBom.setProjectDir(generatedBomDir); + File effectiveBom = new File(project.getBuildDir(), + "generated/effective-bom/" + project.getName() + "-effective-bom.xml"); + generateEffectiveBom.args("--settings", "settings.xml", "help:effective-pom", + "-Doutput=" + effectiveBom); + generateEffectiveBom.dependsOn(syncBom); + generateEffectiveBom.getOutputs().file(effectiveBom); + generateEffectiveBom.doLast(new StripUnrepeatableOutputAction(effectiveBom)); + project.getArtifacts().add(effectiveBomConfiguration.getName(), effectiveBom, + (artifact) -> artifact.builtBy(generateEffectiveBom)); + }); + } + + private static final class PublishingCustomizer { + + private final Project project; + + private final BomExtension bom; + + private PublishingCustomizer(Project project, BomExtension bom) { + this.project = project; + this.bom = bom; + } + + private void customize() { + PublishingExtension publishing = this.project.getExtensions().getByType(PublishingExtension.class); + publishing.getPublications().withType(MavenPublication.class).all(this::configurePublication); + } + + private void configurePublication(MavenPublication publication) { + publication.pom(this::customizePom); + } + + @SuppressWarnings("unchecked") + private void customizePom(MavenPom pom) { + pom.withXml((xml) -> { + Node projectNode = xml.asNode(); + Node properties = new Node(null, "properties"); + this.bom.getProperties().forEach(properties::appendNode); + Node dependencyManagement = findChild(projectNode, "dependencyManagement"); + if (dependencyManagement != null) { + addPropertiesBeforeDependencyManagement(projectNode, properties); + replaceVersionsWithVersionPropertyReferences(dependencyManagement); + addExclusionsToManagedDependencies(dependencyManagement); + } + else { + projectNode.children().add(properties); + } + addPluginManagement(projectNode); + }); + } + + @SuppressWarnings("unchecked") + private void addPropertiesBeforeDependencyManagement(Node projectNode, Node properties) { + for (int i = 0; i < projectNode.children().size(); i++) { + if (isNodeWithName(projectNode.children().get(i), "dependencyManagement")) { + projectNode.children().add(i, properties); + break; + } + } + } + + private void replaceVersionsWithVersionPropertyReferences(Node dependencyManagement) { + Node dependencies = findChild(dependencyManagement, "dependencies"); + if (dependencies != null) { + for (Node dependency : findChildren(dependencies, "dependency")) { + String groupId = findChild(dependency, "groupId").text(); + String artifactId = findChild(dependency, "artifactId").text(); + findChild(dependency, "version") + .setValue("${" + this.bom.getArtifactVersionProperty(groupId, artifactId) + "}"); + } + } + } + + private void addExclusionsToManagedDependencies(Node dependencyManagement) { + Node dependencies = findChild(dependencyManagement, "dependencies"); + if (dependencies != null) { + for (Node dependency : findChildren(dependencies, "dependency")) { + String groupId = findChild(dependency, "groupId").text(); + String artifactId = findChild(dependency, "artifactId").text(); + this.bom.getLibraries().stream().flatMap((library) -> library.getGroups().stream()) + .filter((group) -> group.getId().equals(groupId)) + .flatMap((group) -> group.getModules().stream()) + .filter((module) -> module.getName().equals(artifactId)) + .flatMap((module) -> module.getExclusions().stream()).forEach((exclusion) -> { + Node exclusions = findOrCreateNode(dependency, "exclusions"); + Node node = new Node(exclusions, "exclusion"); + node.appendNode("groupId", exclusion.getGroupId()); + node.appendNode("artifactId", exclusion.getArtifactId()); + }); + } + } + } + + private void addPluginManagement(Node projectNode) { + for (Library library : this.bom.getLibraries()) { + for (Group group : library.getGroups()) { + Node plugins = findOrCreateNode(projectNode, "build", "pluginManagement", "plugins"); + for (String pluginName : group.getPlugins()) { + Node plugin = new Node(plugins, "plugin"); + plugin.appendNode("groupId", group.getId()); + plugin.appendNode("artifactId", pluginName); + plugin.appendNode("version", "${" + library.getVersionProperty() + "}"); + } + } + } + } + + private Node findOrCreateNode(Node parent, String... path) { + Node current = parent; + for (String nodeName : path) { + Node child = findChild(current, nodeName); + if (child == null) { + child = new Node(current, nodeName); + } + current = child; + } + return current; + } + + private Node findChild(Node parent, String name) { + for (Object child : parent.children()) { + if (child instanceof Node) { + Node node = (Node) child; + if ((node.name() instanceof QName) && name.equals(((QName) node.name()).getLocalPart())) { + return node; + } + if (name.equals(node.name())) { + return node; + } + } + } + return null; + } + + @SuppressWarnings("unchecked") + private List findChildren(Node parent, String name) { + return (List) parent.children().stream().filter((child) -> isNodeWithName(child, name)) + .collect(Collectors.toList()); + + } + + private boolean isNodeWithName(Object candidate, String name) { + if (candidate instanceof Node) { + Node node = (Node) candidate; + if ((node.name() instanceof QName) && name.equals(((QName) node.name()).getLocalPart())) { + return true; + } + if (name.equals(node.name())) { + return true; + } + } + return false; + } + + } + + private static final class StripUnrepeatableOutputAction implements Action { + + private final File effectiveBom; + + private StripUnrepeatableOutputAction(File xmlFile) { + this.effectiveBom = xmlFile; + } + + @Override + public void execute(Task task) { + try { + Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(this.effectiveBom); + XPath xpath = XPathFactory.newInstance().newXPath(); + NodeList comments = (NodeList) xpath.evaluate("//comment()", document, XPathConstants.NODESET); + for (int i = 0; i < comments.getLength(); i++) { + org.w3c.dom.Node comment = comments.item(i); + comment.getParentNode().removeChild(comment); + } + org.w3c.dom.Node build = (org.w3c.dom.Node) xpath.evaluate("/project/build", document, + XPathConstants.NODE); + build.getParentNode().removeChild(build); + org.w3c.dom.Node reporting = (org.w3c.dom.Node) xpath.evaluate("/project/reporting", document, + XPathConstants.NODE); + reporting.getParentNode().removeChild(reporting); + TransformerFactory.newInstance().newTransformer().transform(new DOMSource(document), + new StreamResult(this.effectiveBom)); + } + catch (Exception ex) { + throw new TaskExecutionException(task, ex); + } + } + + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/CheckBom.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/CheckBom.java new file mode 100644 index 0000000000..cde5d53513 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/CheckBom.java @@ -0,0 +1,86 @@ +/* + * Copyright 2012-2020 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.boot.build.bom; + +import java.util.Set; +import java.util.TreeSet; +import java.util.stream.Collectors; + +import javax.inject.Inject; + +import org.gradle.api.DefaultTask; +import org.gradle.api.InvalidUserDataException; +import org.gradle.api.tasks.TaskAction; + +import org.springframework.boot.build.bom.Library.Group; +import org.springframework.boot.build.bom.Library.Module; +import org.springframework.boot.build.bom.bomr.version.DependencyVersion; + +/** + * Checks the validity of a bom. + * + * @author Andy Wilkinson + */ +public class CheckBom extends DefaultTask { + + private final BomExtension bom; + + @Inject + public CheckBom(BomExtension bom) { + this.bom = bom; + } + + @TaskAction + void checkBom() { + for (Library library : this.bom.getLibraries()) { + for (Group group : library.getGroups()) { + for (Module module : group.getModules()) { + if (!module.getExclusions().isEmpty()) { + checkExclusions(group.getId(), module, library.getVersion()); + } + } + } + } + } + + private void checkExclusions(String groupId, Module module, DependencyVersion version) { + Set resolved = getProject().getConfigurations() + .detachedConfiguration( + getProject().getDependencies().create(groupId + ":" + module.getName() + ":" + version)) + .getResolvedConfiguration().getResolvedArtifacts().stream() + .map((artifact) -> artifact.getModuleVersion().getId()) + .map((id) -> id.getGroup() + ":" + id.getModule().getName()).collect(Collectors.toSet()); + Set exclusions = module.getExclusions().stream() + .map((exclusion) -> exclusion.getGroupId() + ":" + exclusion.getArtifactId()) + .collect(Collectors.toSet()); + Set unused = new TreeSet<>(); + for (String exclusion : exclusions) { + if (!resolved.contains(exclusion) && exclusion.endsWith(":*")) { + String group = exclusion.substring(0, exclusion.indexOf(':') + 1); + if (!resolved.stream().filter((candidate) -> candidate.startsWith(group)).findFirst().isPresent()) { + unused.add(exclusion); + } + } + } + exclusions.removeAll(resolved); + if (!unused.isEmpty()) { + throw new InvalidUserDataException( + "Unnecessary exclusions on " + groupId + ":" + module.getName() + ": " + exclusions); + } + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/Library.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/Library.java new file mode 100644 index 0000000000..e28447838c --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/Library.java @@ -0,0 +1,196 @@ +/* + * Copyright 2012-2020 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.boot.build.bom; + +import java.util.Collections; +import java.util.List; +import java.util.Locale; + +import org.apache.maven.artifact.versioning.VersionRange; + +import org.springframework.boot.build.bom.bomr.version.DependencyVersion; + +/** + * A collection of modules, Maven plugins, and Maven boms that are versioned and released + * together. + * + * @author Andy Wilkinson + */ +public class Library { + + private final String name; + + private final DependencyVersion version; + + private final List groups; + + private final String versionProperty; + + private final List prohibitedVersions; + + /** + * Create a new {@code Library} with the given {@code name}, {@code version}, and + * {@code groups}. + * @param name name of the library + * @param version version of the library + * @param groups groups in the library + * @param prohibitedVersions version of the library that are prohibited + */ + public Library(String name, DependencyVersion version, List groups, + List prohibitedVersions) { + this.name = name; + this.version = version; + this.groups = groups; + this.versionProperty = name.toLowerCase(Locale.ENGLISH).replace(' ', '-') + ".version"; + this.prohibitedVersions = prohibitedVersions; + } + + public String getName() { + return this.name; + } + + public DependencyVersion getVersion() { + return this.version; + } + + public List getGroups() { + return this.groups; + } + + public String getVersionProperty() { + return this.versionProperty; + } + + public List getProhibitedVersions() { + return this.prohibitedVersions; + } + + /** + * A version or range of versions that are prohibited from being used in a bom. + */ + public static class ProhibitedVersion { + + private final VersionRange range; + + private final String reason; + + public ProhibitedVersion(VersionRange range, String reason) { + this.range = range; + this.reason = reason; + } + + public VersionRange getRange() { + return this.range; + } + + public String getReason() { + return this.reason; + } + + } + + /** + * A collection of modules, Maven plugins, and Maven boms with the same group ID. + */ + public static class Group { + + private final String id; + + private final List modules; + + private final List plugins; + + private final List boms; + + public Group(String id, List modules, List plugins, List boms) { + this.id = id; + this.modules = modules; + this.plugins = plugins; + this.boms = boms; + } + + public String getId() { + return this.id; + } + + public List getModules() { + return this.modules; + } + + public List getPlugins() { + return this.plugins; + } + + public List getBoms() { + return this.boms; + } + + } + + /** + * A module in a group. + */ + public static class Module { + + private final String name; + + private final List exclusions; + + public Module(String name) { + this(name, Collections.emptyList()); + } + + public Module(String name, List exclusions) { + this.name = name; + this.exclusions = exclusions; + } + + public String getName() { + return this.name; + } + + public List getExclusions() { + return this.exclusions; + } + + } + + /** + * An exclusion of a dependency identified by its group ID and artifact ID. + */ + public static class Exclusion { + + private final String groupId; + + private final String artifactId; + + public Exclusion(String groupId, String artifactId) { + this.groupId = groupId; + this.artifactId = artifactId; + } + + public String getGroupId() { + return this.groupId; + } + + public String getArtifactId() { + return this.artifactId; + } + + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/UpgradePolicy.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/UpgradePolicy.java new file mode 100644 index 0000000000..831d3b4f85 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/UpgradePolicy.java @@ -0,0 +1,61 @@ +/* + * Copyright 2012-2020 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.boot.build.bom; + +import java.util.function.BiPredicate; + +import org.springframework.boot.build.bom.bomr.version.DependencyVersion; + +/** + * Policies used to decide which versions are considered as possible upgrades. + * + * @author Andy Wilkinson + */ +public enum UpgradePolicy implements BiPredicate { + + /** + * All versions more recent than the current version will be suggested as possible + * upgrades. + */ + ANY((candidate, current) -> current.compareTo(candidate) < 0), + + /** + * New minor versions of the current major version will be suggested as possible + * upgrades. For example, if the current version is 1.2.3, all 1.x.y versions after + * 1.2.3 will be suggested. 2.x versions will not be offered. + */ + SAME_MAJOR_VERSION(DependencyVersion::isSameMajorAndNewerThan), + + /** + * New patch versions of the current minor version will be offered as possible + * upgrades. For example, if the current version is 1.2.3, all 1.2.x versions after + * 1.2.3 will be suggested. 1.x versions will not be offered. + */ + SAME_MINOR_VERSION(DependencyVersion::isSameMinorAndNewerThan); + + private BiPredicate delegate; + + UpgradePolicy(BiPredicate delegate) { + this.delegate = delegate; + } + + @Override + public boolean test(DependencyVersion candidate, DependencyVersion current) { + return this.delegate.test(candidate, current); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/InteractiveUpgradeResolver.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/InteractiveUpgradeResolver.java new file mode 100644 index 0000000000..b216e9e382 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/InteractiveUpgradeResolver.java @@ -0,0 +1,142 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.SortedSet; +import java.util.stream.Collectors; + +import org.apache.maven.artifact.versioning.DefaultArtifactVersion; +import org.gradle.api.internal.tasks.userinput.UserInputHandler; + +import org.springframework.boot.build.bom.Library; +import org.springframework.boot.build.bom.Library.Group; +import org.springframework.boot.build.bom.Library.Module; +import org.springframework.boot.build.bom.Library.ProhibitedVersion; +import org.springframework.boot.build.bom.UpgradePolicy; +import org.springframework.boot.build.bom.bomr.version.DependencyVersion; +import org.springframework.util.StringUtils; + +/** + * Interactive {@link UpgradeResolver} that uses command line input to choose the upgrades + * to apply. + * + * @author Andy Wilkinson + */ +public final class InteractiveUpgradeResolver implements UpgradeResolver { + + private final VersionResolver versionResolver; + + private final UpgradePolicy upgradePolicy; + + private final UserInputHandler userInputHandler; + + InteractiveUpgradeResolver(VersionResolver versionResolver, UpgradePolicy upgradePolicy, + UserInputHandler userInputHandler) { + this.versionResolver = versionResolver; + this.upgradePolicy = upgradePolicy; + this.userInputHandler = userInputHandler; + } + + @Override + public List resolveUpgrades(Collection libraries) { + return libraries.stream().map(this::resolveUpgrade).filter((upgrade) -> upgrade != null) + .collect(Collectors.toList()); + } + + private Upgrade resolveUpgrade(Library library) { + Map> moduleVersions = new LinkedHashMap<>(); + for (Group group : library.getGroups()) { + for (Module module : group.getModules()) { + moduleVersions.put(group.getId() + ":" + module.getName(), + getLaterVersionsForModule(group.getId(), module.getName(), library.getVersion())); + } + } + List allVersions = moduleVersions.values().stream().flatMap(SortedSet::stream).distinct() + .filter((dependencyVersion) -> isPermitted(dependencyVersion, library.getProhibitedVersions())) + .collect(Collectors.toList()); + if (allVersions.isEmpty()) { + return null; + } + List versionOptions = allVersions.stream() + .map((version) -> new VersionOption(version, getMissingModules(moduleVersions, version))) + .collect(Collectors.toList()); + VersionOption current = new VersionOption(library.getVersion(), Collections.emptyList()); + VersionOption selected = this.userInputHandler.selectOption(library.getName() + " " + library.getVersion(), + versionOptions, current); + return (selected.equals(current)) ? null : new Upgrade(library, selected.version); + } + + private boolean isPermitted(DependencyVersion dependencyVersion, List prohibitedVersions) { + if (prohibitedVersions.isEmpty()) { + return true; + } + for (ProhibitedVersion prohibitedVersion : prohibitedVersions) { + if (prohibitedVersion.getRange() + .containsVersion(new DefaultArtifactVersion(dependencyVersion.toString()))) { + return false; + } + } + return true; + } + + private List getMissingModules(Map> moduleVersions, + DependencyVersion version) { + List missingModules = new ArrayList<>(); + moduleVersions.forEach((name, versions) -> { + if (!versions.contains(version)) { + missingModules.add(name); + } + }); + return missingModules; + } + + private SortedSet getLaterVersionsForModule(String groupId, String artifactId, + DependencyVersion currentVersion) { + SortedSet versions = this.versionResolver.resolveVersions(groupId, artifactId); + versions.removeIf((candidate) -> !this.upgradePolicy.test(candidate, currentVersion)); + return versions; + } + + private static final class VersionOption { + + private final DependencyVersion version; + + private final List missingModules; + + private VersionOption(DependencyVersion version, List missingModules) { + this.version = version; + this.missingModules = missingModules; + } + + @Override + public String toString() { + if (this.missingModules.isEmpty()) { + return this.version.toString(); + } + return this.version + " (some modules are missing: " + + StringUtils.collectionToDelimitedString(this.missingModules, ", ") + ")"; + } + + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/MavenMetadataVersionResolver.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/MavenMetadataVersionResolver.java new file mode 100644 index 0000000000..d29f6b0759 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/MavenMetadataVersionResolver.java @@ -0,0 +1,98 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr; + +import java.io.StringReader; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; +import java.util.stream.Collectors; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathFactory; + +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; + +import org.springframework.boot.build.bom.bomr.version.DependencyVersion; +import org.springframework.http.HttpStatus; +import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestTemplate; + +/** + * A {@link VersionResolver} that examines {@code maven-metadata.xml} to determine the + * available versions. + * + * @author Andy Wilkinson + */ +final class MavenMetadataVersionResolver implements VersionResolver { + + private final RestTemplate rest; + + private final List repositoryUrls; + + MavenMetadataVersionResolver(List repositoryUrls) { + this(new RestTemplate(Arrays.asList(new StringHttpMessageConverter())), repositoryUrls); + } + + MavenMetadataVersionResolver(RestTemplate restTemplate, List repositoryUrls) { + this.rest = restTemplate; + this.repositoryUrls = repositoryUrls; + } + + @Override + public SortedSet resolveVersions(String groupId, String artifactId) { + Set versions = new HashSet(); + for (String repositoryUrl : this.repositoryUrls) { + versions.addAll(resolveVersions(groupId, artifactId, repositoryUrl)); + } + return new TreeSet<>(versions.stream().map(DependencyVersion::parse).collect(Collectors.toSet())); + } + + private Set resolveVersions(String groupId, String artifactId, String repositoryUrl) { + Set versions = new HashSet(); + String url = repositoryUrl + "/" + groupId.replace('.', '/') + "/" + artifactId + "/maven-metadata.xml"; + try { + String metadata = this.rest.getForObject(url, String.class); + Document metadataDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder() + .parse(new InputSource(new StringReader(metadata))); + NodeList versionNodes = (NodeList) XPathFactory.newInstance().newXPath() + .evaluate("/metadata/versioning/versions/version", metadataDocument, XPathConstants.NODESET); + for (int i = 0; i < versionNodes.getLength(); i++) { + versions.add(versionNodes.item(i).getTextContent()); + } + } + catch (HttpClientErrorException ex) { + if (ex.getStatusCode() != HttpStatus.NOT_FOUND) { + System.err.println("Failed to download maven-metadata.xml for " + groupId + ":" + artifactId + " from " + + url + ": " + ex.getMessage()); + } + } + catch (Exception ex) { + System.err.println("Failed to resolve versions for module " + groupId + ":" + artifactId + " in repository " + + repositoryUrl + ": " + ex.getMessage()); + } + return versions; + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/Upgrade.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/Upgrade.java new file mode 100644 index 0000000000..e0457fe8f4 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/Upgrade.java @@ -0,0 +1,46 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr; + +import org.springframework.boot.build.bom.Library; +import org.springframework.boot.build.bom.bomr.version.DependencyVersion; + +/** + * An upgrade to change a {@link Library} to use a new version}. + * + * @author Andy Wilkinson + */ +final class Upgrade { + + private final Library library; + + private final DependencyVersion version; + + Upgrade(Library library, DependencyVersion version) { + this.library = library; + this.version = version; + } + + Library getLibrary() { + return this.library; + } + + DependencyVersion getVersion() { + return this.version; + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeBom.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeBom.java new file mode 100644 index 0000000000..7da198a5f1 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeBom.java @@ -0,0 +1,146 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.Reader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.Properties; + +import javax.inject.Inject; + +import org.gradle.api.DefaultTask; +import org.gradle.api.InvalidUserDataException; +import org.gradle.api.Task; +import org.gradle.api.internal.tasks.userinput.UserInputHandler; +import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.TaskExecutionException; +import org.gradle.api.tasks.options.Option; + +import org.springframework.boot.build.bom.BomExtension; +import org.springframework.boot.build.bom.bomr.github.GitHub; +import org.springframework.boot.build.bom.bomr.github.GitHubRepository; +import org.springframework.boot.build.bom.bomr.github.Milestone; +import org.springframework.util.StringUtils; + +/** + * {@link Task} to upgrade the libraries managed by a bom. + * + * @author Andy Wilkinson + */ +public class UpgradeBom extends DefaultTask { + + private final BomExtension bom; + + private String milestone; + + @Inject + public UpgradeBom(BomExtension bom) { + this.bom = bom; + } + + @Option(option = "milestone", description = "Milestone to which dependency upgrade issues should be assigned") + public void setMilestone(String milestone) { + this.milestone = milestone; + } + + @TaskAction + void upgradeDependencies() { + GitHubRepository repository = createGitHub().getRepository(this.bom.getUpgrade().getGitHub().getOrganization(), + this.bom.getUpgrade().getGitHub().getRepository()); + List availableLabels = repository.getLabels(); + List issueLabels = this.bom.getUpgrade().getGitHub().getIssueLabels(); + if (!availableLabels.containsAll(issueLabels)) { + List unknownLabels = new ArrayList<>(issueLabels); + unknownLabels.removeAll(availableLabels); + throw new InvalidUserDataException( + "Unknown label(s): " + StringUtils.collectionToCommaDelimitedString(unknownLabels)); + } + Milestone milestone = determineMilestone(repository); + List upgrades = new InteractiveUpgradeResolver( + new MavenMetadataVersionResolver(Arrays.asList("https://repo1.maven.org/maven2/")), + this.bom.getUpgrade().getPolicy(), getServices().get(UserInputHandler.class)) + .resolveUpgrades(this.bom.getLibraries()); + for (Upgrade upgrade : upgrades) { + String title = "Upgrade to " + upgrade.getLibrary().getName() + " " + upgrade.getVersion(); + System.out.println(title); + try { + Path buildFile = getProject().getBuildFile().toPath(); + applyChanges(upgrade, buildFile); + int issueNumber = repository.openIssue(title, issueLabels, milestone); + if (new ProcessBuilder().command("git", "add", buildFile.toFile().getAbsolutePath()).start() + .waitFor() != 0) { + throw new IllegalStateException("git add failed"); + } + if (new ProcessBuilder().command("git", "commit", "-m", title + "\n\nCloses gh-" + issueNumber).start() + .waitFor() != 0) { + throw new IllegalStateException("git commit failed"); + } + } + catch (IOException ex) { + throw new TaskExecutionException(this, ex); + } + catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + } + } + } + + private GitHub createGitHub() { + Properties bomrProperties = new Properties(); + try (Reader reader = new FileReader(new File(System.getProperty("user.home"), ".bomr.properties"))) { + bomrProperties.load(reader); + String username = bomrProperties.getProperty("bomr.github.username"); + String password = bomrProperties.getProperty("bomr.github.password"); + return GitHub.withCredentials(username, password); + } + catch (IOException ex) { + throw new InvalidUserDataException("Failed to load .bomr.properties from user home", ex); + } + } + + private void applyChanges(Upgrade upgrade, Path buildFile) throws IOException { + String contents = new String(Files.readAllBytes(buildFile), StandardCharsets.UTF_8); + String modified = contents.replace( + "library('" + upgrade.getLibrary().getName() + "', '" + upgrade.getLibrary().getVersion() + "')", + "library('" + upgrade.getLibrary().getName() + "', '" + upgrade.getVersion() + "')"); + Files.write(buildFile, modified.getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE); + } + + private Milestone determineMilestone(GitHubRepository repository) { + if (this.milestone == null) { + return null; + } + List milestones = repository.getMilestones(); + Optional matchingMilestone = milestones.stream() + .filter((milestone) -> milestone.getName().equals(this.milestone)).findFirst(); + if (!matchingMilestone.isPresent()) { + throw new InvalidUserDataException("Unknown milestone: " + this.milestone); + } + return matchingMilestone.get(); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeResolver.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeResolver.java new file mode 100644 index 0000000000..ed1805eca0 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeResolver.java @@ -0,0 +1,38 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr; + +import java.util.Collection; +import java.util.List; + +import org.springframework.boot.build.bom.Library; + +/** + * Resolves upgrades for the libraries in a bom. + * + * @author Andy Wilkinson + */ +interface UpgradeResolver { + + /** + * Resolves the upgrades to be applied to the given {@code libraries}. + * @param libraries the libraries + * @return the upgrades + */ + List resolveUpgrades(Collection libraries); + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/VersionResolver.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/VersionResolver.java new file mode 100644 index 0000000000..70b1c9298c --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/VersionResolver.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr; + +import java.util.SortedSet; + +import org.springframework.boot.build.bom.bomr.version.DependencyVersion; + +/** + * Resolves the available versions for a module. + * + * @author Andy Wilkinson + */ +interface VersionResolver { + + /** + * Resolves the available versions for the module identified by the given + * {@code groupId} and {@code artifactId}. + * @param groupId module's group ID + * @param artifactId module's artifact ID + * @return the available versions + */ + SortedSet resolveVersions(String groupId, String artifactId); + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/github/GitHub.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/github/GitHub.java new file mode 100644 index 0000000000..879caec26e --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/github/GitHub.java @@ -0,0 +1,46 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr.github; + +/** + * Minimal API for interacting with GitHub. + * + * @author Andy Wilkinson + */ +public interface GitHub { + + /** + * Returns a {@link GitHubRepository} with the given {@code name} in the given + * {@code organization}. + * @param organization the organization + * @param name the name of the repository + * @return the repository + */ + GitHubRepository getRepository(String organization, String name); + + /** + * Creates a new {@code GitHub} that will authenticate with given {@code username} and + * {@code password}. + * @param username username for authentication + * @param password password for authentication + * @return the new {@code GitHub} instance + */ + static GitHub withCredentials(String username, String password) { + return new StandardGitHub(username, password); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/github/GitHubRepository.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/github/GitHubRepository.java new file mode 100644 index 0000000000..3c49ba56d5 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/github/GitHubRepository.java @@ -0,0 +1,50 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr.github; + +import java.util.List; + +/** + * Minimal API for interacting with a GitHub repository. + * + * @author Andy Wilkinson + */ +public interface GitHubRepository { + + /** + * Opens a new issue with the given title. The given {@code labels} will be applied to + * the issue and it will be assigned to the given {@code milestone}. + * @param title the title of the issue + * @param labels the labels to apply to the issue + * @param milestone the milestone to assign the issue to + * @return the number of the new issue + */ + int openIssue(String title, List labels, Milestone milestone); + + /** + * Returns the labels in the repository. + * @return the labels + */ + List getLabels(); + + /** + * Returns the milestones in the repository. + * @return the milestones + */ + List getMilestones(); + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/github/Milestone.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/github/Milestone.java new file mode 100644 index 0000000000..f50dd28c48 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/github/Milestone.java @@ -0,0 +1,56 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr.github; + +/** + * A milestone in a {@link GitHubRepository GitHub repository}. + * + * @author Andy Wilkinson + */ +public class Milestone { + + private final String name; + + private final int number; + + Milestone(String name, int number) { + this.name = name; + this.number = number; + } + + /** + * Returns the name of the milestone. + * @return the name + */ + public String getName() { + return this.name; + } + + /** + * Returns the number of the milestone. + * @return the number + */ + public int getNumber() { + return this.number; + } + + @Override + public String toString() { + return this.name + " (" + this.number + ")"; + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/github/StandardGitHub.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/github/StandardGitHub.java new file mode 100644 index 0000000000..5be432a0ac --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/github/StandardGitHub.java @@ -0,0 +1,74 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr.github; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Base64; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.springframework.http.HttpRequest; +import org.springframework.http.MediaType; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.DefaultUriBuilderFactory; +import org.springframework.web.util.UriTemplateHandler; + +/** + * Standard implementation of {@link GitHub}. + * + * @author Andy Wilkinson + */ +final class StandardGitHub implements GitHub { + + private final String username; + + private final String password; + + StandardGitHub(String username, String password) { + this.username = username; + this.password = password; + } + + @Override + public GitHubRepository getRepository(String organization, String name) { + RestTemplate restTemplate = new RestTemplate( + Arrays.asList(new MappingJackson2HttpMessageConverter(new ObjectMapper()))); + restTemplate.getInterceptors().add(new ClientHttpRequestInterceptor() { + + @Override + public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) + throws IOException { + request.getHeaders().add("User-Agent", StandardGitHub.this.username); + request.getHeaders().add("Authorization", "Basic " + Base64.getEncoder().encodeToString( + (StandardGitHub.this.username + ":" + StandardGitHub.this.password).getBytes())); + request.getHeaders().add("Accept", MediaType.APPLICATION_JSON_VALUE); + return execution.execute(request, body); + } + + }); + UriTemplateHandler uriTemplateHandler = new DefaultUriBuilderFactory( + "https://api.github.com/repos/" + organization + "/" + name + "/"); + restTemplate.setUriTemplateHandler(uriTemplateHandler); + return new StandardGitHubRepository(restTemplate); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/github/StandardGitHubRepository.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/github/StandardGitHubRepository.java new file mode 100644 index 0000000000..6eced35271 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/github/StandardGitHubRepository.java @@ -0,0 +1,74 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr.github; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +/** + * Standard implementation of {@link GitHubRepository}. + * + * @author Andy Wilkinson + */ +final class StandardGitHubRepository implements GitHubRepository { + + private final RestTemplate rest; + + StandardGitHubRepository(RestTemplate restTemplate) { + this.rest = restTemplate; + } + + @Override + @SuppressWarnings("rawtypes") + public int openIssue(String title, List labels, Milestone milestone) { + Map body = new HashMap<>(); + body.put("title", title); + if (milestone != null) { + body.put("milestone", milestone.getNumber()); + } + if (!labels.isEmpty()) { + body.put("labels", labels); + } + ResponseEntity response = this.rest.postForEntity("issues", body, Map.class); + return (Integer) response.getBody().get("number"); + } + + @Override + public List getLabels() { + return get("labels?per_page=100", (label) -> (String) label.get("name")); + } + + @Override + public List getMilestones() { + return get("milestones?per_page=100", + (milestone) -> new Milestone((String) milestone.get("title"), (Integer) milestone.get("number"))); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private List get(String name, Function, T> mapper) { + ResponseEntity response = this.rest.getForEntity(name, List.class); + List> body = response.getBody(); + return body.stream().map(mapper).collect(Collectors.toList()); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/AbstractDependencyVersion.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/AbstractDependencyVersion.java new file mode 100644 index 0000000000..0192c64f6f --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/AbstractDependencyVersion.java @@ -0,0 +1,69 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr.version; + +import org.apache.maven.artifact.versioning.ComparableVersion; + +/** + * Base class for {@link DependencyVersion} implementations. + * + * @author Andy Wilkinson + */ +abstract class AbstractDependencyVersion implements DependencyVersion { + + private final ComparableVersion comparableVersion; + + protected AbstractDependencyVersion(ComparableVersion comparableVersion) { + this.comparableVersion = comparableVersion; + } + + @Override + public int compareTo(DependencyVersion other) { + ComparableVersion otherComparable = (other instanceof AbstractDependencyVersion) + ? ((AbstractDependencyVersion) other).comparableVersion : new ComparableVersion(other.toString()); + return this.comparableVersion.compareTo(otherComparable); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + AbstractDependencyVersion other = (AbstractDependencyVersion) obj; + if (!this.comparableVersion.equals(other.comparableVersion)) { + return false; + } + return true; + } + + @Override + public int hashCode() { + return this.comparableVersion.hashCode(); + } + + @Override + public String toString() { + return this.comparableVersion.toString(); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/ArtifactVersionDependencyVersion.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/ArtifactVersionDependencyVersion.java new file mode 100644 index 0000000000..8ff9408ef9 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/ArtifactVersionDependencyVersion.java @@ -0,0 +1,100 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr.version; + +import java.util.Optional; + +import org.apache.maven.artifact.versioning.ArtifactVersion; +import org.apache.maven.artifact.versioning.ComparableVersion; +import org.apache.maven.artifact.versioning.DefaultArtifactVersion; + +/** + * A {@link DependencyVersion} backed by an {@link ArtifactVersion}. + * + * @author Andy Wilkinson + */ +class ArtifactVersionDependencyVersion extends AbstractDependencyVersion { + + private final ArtifactVersion artifactVersion; + + protected ArtifactVersionDependencyVersion(ArtifactVersion artifactVersion) { + super(new ComparableVersion(artifactVersion.toString())); + this.artifactVersion = artifactVersion; + } + + protected ArtifactVersionDependencyVersion(ArtifactVersion artifactVersion, ComparableVersion comparableVersion) { + super(comparableVersion); + this.artifactVersion = artifactVersion; + } + + @Override + public boolean isNewerThan(DependencyVersion other) { + if (other instanceof ReleaseTrainDependencyVersion) { + return false; + } + return compareTo(other) > 0; + } + + @Override + public boolean isSameMajorAndNewerThan(DependencyVersion other) { + if (other instanceof ReleaseTrainDependencyVersion) { + return false; + } + return extractArtifactVersionDependencyVersion(other).map(this::isSameMajorAndNewerThan).orElse(true); + } + + private boolean isSameMajorAndNewerThan(ArtifactVersionDependencyVersion other) { + return this.artifactVersion.getMajorVersion() == other.artifactVersion.getMajorVersion() && isNewerThan(other); + } + + @Override + public boolean isSameMinorAndNewerThan(DependencyVersion other) { + if (other instanceof ReleaseTrainDependencyVersion) { + return false; + } + return extractArtifactVersionDependencyVersion(other).map(this::isSameMinorAndNewerThan).orElse(true); + } + + private boolean isSameMinorAndNewerThan(ArtifactVersionDependencyVersion other) { + return this.artifactVersion.getMajorVersion() == other.artifactVersion.getMajorVersion() + && this.artifactVersion.getMinorVersion() == other.artifactVersion.getMinorVersion() + && isNewerThan(other); + } + + @Override + public String toString() { + return this.artifactVersion.toString(); + } + + private Optional extractArtifactVersionDependencyVersion( + DependencyVersion other) { + ArtifactVersionDependencyVersion artifactVersion = null; + if (other instanceof ArtifactVersionDependencyVersion) { + artifactVersion = (ArtifactVersionDependencyVersion) other; + } + return Optional.ofNullable(artifactVersion); + } + + static ArtifactVersionDependencyVersion parse(String version) { + ArtifactVersion artifactVersion = new DefaultArtifactVersion(version); + if (artifactVersion.getQualifier() != null && artifactVersion.getQualifier().equals(version)) { + return null; + } + return new ArtifactVersionDependencyVersion(artifactVersion); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/CombinedPatchAndQualifierDependencyVersion.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/CombinedPatchAndQualifierDependencyVersion.java new file mode 100644 index 0000000000..8a910d6b60 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/CombinedPatchAndQualifierDependencyVersion.java @@ -0,0 +1,58 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr.version; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.maven.artifact.versioning.ArtifactVersion; +import org.apache.maven.artifact.versioning.DefaultArtifactVersion; + +/** + * A {@link DependencyVersion} where the patch and qualifier are not separated. + * + * @author Andy Wilkinson + */ +final class CombinedPatchAndQualifierDependencyVersion extends ArtifactVersionDependencyVersion { + + private static final Pattern PATTERN = Pattern.compile("([0-9]+\\.[0-9]+\\.[0-9]+)([A-Za-z][A-Za-z0-9]+)"); + + private final String original; + + private CombinedPatchAndQualifierDependencyVersion(ArtifactVersion artifactVersion, String original) { + super(artifactVersion); + this.original = original; + } + + @Override + public String toString() { + return this.original; + } + + static CombinedPatchAndQualifierDependencyVersion parse(String version) { + Matcher matcher = PATTERN.matcher(version); + if (!matcher.matches()) { + return null; + } + ArtifactVersion artifactVersion = new DefaultArtifactVersion(matcher.group(1) + "." + matcher.group(2)); + if (artifactVersion.getQualifier() != null && artifactVersion.getQualifier().equals(version)) { + return null; + } + return new CombinedPatchAndQualifierDependencyVersion(artifactVersion, version); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/DependencyVersion.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/DependencyVersion.java new file mode 100644 index 0000000000..a344a5c0e6 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/DependencyVersion.java @@ -0,0 +1,69 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr.version; + +import java.util.Arrays; +import java.util.List; +import java.util.function.Function; + +/** + * Version of a dependency. + * + * @author Andy Wilkinson + */ +public interface DependencyVersion extends Comparable { + + /** + * Returns whether this version is newer than the given {@code other} version. + * @param other version to test + * @return {@code true} if this version is newer, otherwise {@code false} + */ + boolean isNewerThan(DependencyVersion other); + + /** + * Returns whether this version has the same major versions as the {@code other} + * version while also being newer. + * @param other version to test + * @return {@code true} if this version has the same major and is newer, otherwise + * {@code false} + */ + boolean isSameMajorAndNewerThan(DependencyVersion other); + + /** + * Returns whether this version has the same major and minor versions as the + * {@code other} version while also being newer. + * @param other version to test + * @return {@code true} if this version has the same major and minor and is newer, + * otherwise {@code false} + */ + boolean isSameMinorAndNewerThan(DependencyVersion other); + + static DependencyVersion parse(String version) { + List> parsers = Arrays.asList(ArtifactVersionDependencyVersion::parse, + ReleaseTrainDependencyVersion::parse, NumericQualifierDependencyVersion::parse, + CombinedPatchAndQualifierDependencyVersion::parse, LeadingZeroesDependencyVersion::parse, + UnstructuredDependencyVersion::parse); + for (Function parser : parsers) { + DependencyVersion result = parser.apply(version); + if (result != null) { + return result; + } + } + throw new IllegalArgumentException("Version '" + version + "' could not be parsed"); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/LeadingZeroesDependencyVersion.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/LeadingZeroesDependencyVersion.java new file mode 100644 index 0000000000..5514b8b652 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/LeadingZeroesDependencyVersion.java @@ -0,0 +1,56 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr.version; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.maven.artifact.versioning.ArtifactVersion; +import org.apache.maven.artifact.versioning.DefaultArtifactVersion; + +/** + * A {@link DependencyVersion} that tolerates leading zeroes. + * + * @author Andy Wilkinson + */ +final class LeadingZeroesDependencyVersion extends ArtifactVersionDependencyVersion { + + private static final Pattern PATTERN = Pattern.compile("0*([0-9]+)\\.0*([0-9]+)\\.0*([0-9]+)"); + + private final String original; + + private LeadingZeroesDependencyVersion(ArtifactVersion artifactVersion, String original) { + super(artifactVersion); + this.original = original; + } + + @Override + public String toString() { + return this.original; + } + + static LeadingZeroesDependencyVersion parse(String input) { + Matcher matcher = PATTERN.matcher(input); + if (!matcher.matches()) { + return null; + } + ArtifactVersion artifactVersion = new DefaultArtifactVersion( + matcher.group(1) + matcher.group(2) + matcher.group(3)); + return new LeadingZeroesDependencyVersion(artifactVersion, input); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/NumericQualifierDependencyVersion.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/NumericQualifierDependencyVersion.java new file mode 100644 index 0000000000..363def7d80 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/NumericQualifierDependencyVersion.java @@ -0,0 +1,56 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr.version; + +import org.apache.maven.artifact.versioning.ArtifactVersion; +import org.apache.maven.artifact.versioning.ComparableVersion; +import org.apache.maven.artifact.versioning.DefaultArtifactVersion; + +/** + * A fallback {@link DependencyVersion} to handle versions with four components that + * cannot be handled by {@link ArtifactVersion} because the fourth component is numeric. + * + * @author Andy Wilkinson + */ +final class NumericQualifierDependencyVersion extends ArtifactVersionDependencyVersion { + + private final String original; + + private NumericQualifierDependencyVersion(ArtifactVersion artifactVersion, String original) { + super(artifactVersion, new ComparableVersion(original)); + this.original = original; + } + + @Override + public String toString() { + return this.original; + } + + static NumericQualifierDependencyVersion parse(String input) { + String[] components = input.split("\\."); + if (components.length == 4) { + ArtifactVersion artifactVersion = new DefaultArtifactVersion( + components[0] + "." + components[1] + "." + components[2]); + if (artifactVersion.getQualifier() != null && artifactVersion.getQualifier().equals(input)) { + return null; + } + return new NumericQualifierDependencyVersion(artifactVersion, input); + } + return null; + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/ReleaseTrainDependencyVersion.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/ReleaseTrainDependencyVersion.java new file mode 100644 index 0000000000..b3626d1984 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/ReleaseTrainDependencyVersion.java @@ -0,0 +1,125 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr.version; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.springframework.util.StringUtils; + +/** + * A {@link DependencyVersion} for a release train such as Spring Data. + * + * @author Andy Wilkinson + */ +final class ReleaseTrainDependencyVersion implements DependencyVersion { + + private static final Pattern VERSION_PATTERN = Pattern.compile("([A-Z][a-z]+)-([A-Z]+)([0-9]*)"); + + private final String releaseTrain; + + private final String type; + + private final int version; + + private final String original; + + private ReleaseTrainDependencyVersion(String releaseTrain, String type, int version, String original) { + this.releaseTrain = releaseTrain; + this.type = type; + this.version = version; + this.original = original; + } + + @Override + public int compareTo(DependencyVersion other) { + if (!(other instanceof ReleaseTrainDependencyVersion)) { + return 0; + } + ReleaseTrainDependencyVersion otherReleaseTrain = (ReleaseTrainDependencyVersion) other; + int comparison = this.releaseTrain.compareTo(otherReleaseTrain.releaseTrain); + if (comparison != 0) { + return comparison; + } + comparison = this.type.compareTo(otherReleaseTrain.type); + if (comparison != 0) { + return comparison; + } + return Integer.compare(this.version, otherReleaseTrain.version); + } + + @Override + public boolean isNewerThan(DependencyVersion other) { + if (!(other instanceof ReleaseTrainDependencyVersion)) { + return true; + } + ReleaseTrainDependencyVersion otherReleaseTrain = (ReleaseTrainDependencyVersion) other; + return otherReleaseTrain.compareTo(this) < 0; + } + + @Override + public boolean isSameMajorAndNewerThan(DependencyVersion other) { + return isNewerThan(other); + } + + @Override + public boolean isSameMinorAndNewerThan(DependencyVersion other) { + if (!(other instanceof ReleaseTrainDependencyVersion)) { + return true; + } + ReleaseTrainDependencyVersion otherReleaseTrain = (ReleaseTrainDependencyVersion) other; + return otherReleaseTrain.releaseTrain.equals(this.releaseTrain) && isNewerThan(other); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + ReleaseTrainDependencyVersion other = (ReleaseTrainDependencyVersion) obj; + if (!this.original.equals(other.original)) { + return false; + } + return true; + } + + @Override + public int hashCode() { + return this.original.hashCode(); + } + + @Override + public String toString() { + return this.original; + } + + static ReleaseTrainDependencyVersion parse(String input) { + Matcher matcher = VERSION_PATTERN.matcher(input); + if (!matcher.matches()) { + return null; + } + return new ReleaseTrainDependencyVersion(matcher.group(1), matcher.group(2), + (StringUtils.hasLength(matcher.group(3))) ? Integer.parseInt(matcher.group(3)) : 0, input); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/UnstructuredDependencyVersion.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/UnstructuredDependencyVersion.java new file mode 100644 index 0000000000..02822beaec --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/version/UnstructuredDependencyVersion.java @@ -0,0 +1,60 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr.version; + +import org.apache.maven.artifact.versioning.ComparableVersion; + +/** + * A {@link DependencyVersion} with no structure such that version comparisons are not + * possible. + * + * @author Andy Wilkinson + */ +final class UnstructuredDependencyVersion extends AbstractDependencyVersion implements DependencyVersion { + + private final String version; + + private UnstructuredDependencyVersion(String version) { + super(new ComparableVersion(version)); + this.version = version; + } + + @Override + public boolean isNewerThan(DependencyVersion other) { + return this.compareTo(other) > 0; + } + + @Override + public boolean isSameMajorAndNewerThan(DependencyVersion other) { + return this.compareTo(other) > 0; + } + + @Override + public boolean isSameMinorAndNewerThan(DependencyVersion other) { + return this.compareTo(other) > 0; + } + + @Override + public String toString() { + return this.version; + } + + static UnstructuredDependencyVersion parse(String version) { + return new UnstructuredDependencyVersion(version); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/classpath/CheckClasspathForConflicts.java b/buildSrc/src/main/java/org/springframework/boot/build/classpath/CheckClasspathForConflicts.java new file mode 100644 index 0000000000..b5096ed115 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/classpath/CheckClasspathForConflicts.java @@ -0,0 +1,135 @@ +/* + * Copyright 2012-2020 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.boot.build.classpath; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.TreeMap; +import java.util.function.Predicate; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.stream.Collectors; + +import org.gradle.api.DefaultTask; +import org.gradle.api.GradleException; +import org.gradle.api.Task; +import org.gradle.api.file.FileCollection; +import org.gradle.api.tasks.Classpath; +import org.gradle.api.tasks.TaskAction; + +/** + * A {@link Task} for checking the classpath for conflicting classes and resources. + * + * @author Andy Wilkinson + */ +public class CheckClasspathForConflicts extends DefaultTask { + + private final List> ignores = new ArrayList<>(); + + private FileCollection classpath; + + public void setClasspath(FileCollection classpath) { + this.classpath = classpath; + } + + @Classpath + public FileCollection getClasspath() { + return this.classpath; + } + + @TaskAction + public void checkForConflicts() throws IOException { + ClasspathContents classpathContents = new ClasspathContents(); + for (File file : this.classpath) { + if (file.isDirectory()) { + Path root = file.toPath(); + Files.walk(root).filter((path) -> Files.isRegularFile(path)) + .forEach((entry) -> classpathContents.add(root.relativize(entry).toString(), root.toString())); + } + else { + try (JarFile jar = new JarFile(file)) { + for (JarEntry entry : Collections.list(jar.entries())) { + if (!entry.isDirectory()) { + classpathContents.add(entry.getName(), file.getAbsolutePath()); + } + } + } + } + } + Map> conflicts = classpathContents.getConflicts(this.ignores); + if (!conflicts.isEmpty()) { + StringBuilder message = new StringBuilder(String.format("Found classpath conflicts:%n")); + conflicts.forEach((entry, locations) -> { + message.append(String.format(" %s%n", entry)); + locations.forEach((location) -> message.append(String.format(" %s%n", location))); + }); + throw new GradleException(message.toString()); + } + } + + public void ignore(Predicate predicate) { + this.ignores.add(predicate); + } + + private static final class ClasspathContents { + + private static final Set IGNORED_NAMES = new HashSet<>(Arrays.asList("about.html", "changelog.txt", + "LICENSE", "license.txt", "module-info.class", "notice.txt", "readme.txt")); + + private final Map> classpathContents = new HashMap<>(); + + private void add(String name, String source) { + this.classpathContents.computeIfAbsent(name, (key) -> new ArrayList<>()).add(source); + } + + private Map> getConflicts(List> ignores) { + return this.classpathContents.entrySet().stream().filter((entry) -> entry.getValue().size() > 1) + .filter((entry) -> canConflict(entry.getKey(), ignores)) + .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (v1, v2) -> v1, TreeMap::new)); + } + + private boolean canConflict(String name, List> ignores) { + if (name.startsWith("META-INF/")) { + return false; + } + for (String ignoredName : IGNORED_NAMES) { + if (name.equals(ignoredName)) { + return false; + } + } + for (Predicate ignore : ignores) { + if (ignore.test(name)) { + return false; + } + } + return true; + } + + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/classpath/CheckClasspathForProhibitedDependencies.java b/buildSrc/src/main/java/org/springframework/boot/build/classpath/CheckClasspathForProhibitedDependencies.java new file mode 100644 index 0000000000..301304deb7 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/classpath/CheckClasspathForProhibitedDependencies.java @@ -0,0 +1,85 @@ +/* + * Copyright 2012-2020 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.boot.build.classpath; + +import java.io.IOException; +import java.util.TreeSet; +import java.util.stream.Collectors; + +import org.gradle.api.DefaultTask; +import org.gradle.api.GradleException; +import org.gradle.api.Task; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.ModuleVersionIdentifier; +import org.gradle.api.file.FileCollection; +import org.gradle.api.tasks.Classpath; +import org.gradle.api.tasks.TaskAction; + +/** + * A {@link Task} for checking the classpath for prohibited dependencies. + * + * @author Andy Wilkinson + */ +public class CheckClasspathForProhibitedDependencies extends DefaultTask { + + private Configuration classpath; + + public CheckClasspathForProhibitedDependencies() { + getOutputs().upToDateWhen((task) -> true); + } + + public void setClasspath(Configuration classpath) { + this.classpath = classpath; + } + + @Classpath + public FileCollection getClasspath() { + return this.classpath; + } + + @TaskAction + public void checkForProhibitedDependencies() throws IOException { + TreeSet prohibited = this.classpath.getResolvedConfiguration().getResolvedArtifacts().stream() + .map((artifact) -> artifact.getModuleVersion().getId()).filter(this::prohibited) + .map((id) -> id.getGroup() + ":" + id.getName()).collect(Collectors.toCollection(TreeSet::new)); + if (!prohibited.isEmpty()) { + StringBuilder message = new StringBuilder(String.format("Found prohibited dependencies:%n")); + for (String dependency : prohibited) { + message.append(String.format(" %s%n", dependency)); + } + throw new GradleException(message.toString()); + } + } + + private boolean prohibited(ModuleVersionIdentifier id) { + String group = id.getGroup(); + if (group.equals("javax.batch")) { + return false; + } + if (group.startsWith("javax")) { + return true; + } + if (group.equals("commons-logging")) { + return true; + } + if (group.equals("org.slf4j") && id.getName().equals("jcl-over-slf4j")) { + return true; + } + return false; + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/cli/AbstractPackageManagerDefinitionTask.java b/buildSrc/src/main/java/org/springframework/boot/build/cli/AbstractPackageManagerDefinitionTask.java new file mode 100644 index 0000000000..f0592979d3 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/cli/AbstractPackageManagerDefinitionTask.java @@ -0,0 +1,112 @@ +/* + * Copyright 2019 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.boot.build.cli; + +import java.io.File; +import java.security.MessageDigest; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.codec.digest.DigestUtils; +import org.gradle.api.DefaultTask; +import org.gradle.api.Project; +import org.gradle.api.file.RegularFile; +import org.gradle.api.provider.Provider; +import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.TaskExecutionException; + +/** + * Base class for generating a package manager definition file such as a Scoop manifest or + * a Homebrew formula. + * + * @author Andy Wilkinson + */ +public abstract class AbstractPackageManagerDefinitionTask extends DefaultTask { + + private Provider archive; + + private File template; + + private File outputDir; + + public AbstractPackageManagerDefinitionTask() { + getInputs().property("version", getProject().provider(getProject()::getVersion)); + } + + @InputFile + public RegularFile getArchive() { + return this.archive.get(); + } + + public void setArchive(Provider archive) { + this.archive = archive; + } + + @InputFile + public File getTemplate() { + return this.template; + } + + public void setTemplate(File template) { + this.template = template; + } + + @OutputDirectory + public File getOutputDir() { + return this.outputDir; + } + + public void setOutputDir(File outputDir) { + this.outputDir = outputDir; + } + + protected void createDescriptor(Map additionalProperties) { + getProject().copy((copy) -> { + copy.from(this.template); + copy.into(this.outputDir); + Map properties = new HashMap<>(additionalProperties); + properties.put("hash", sha256(this.archive.get().getAsFile())); + properties.put("repo", determineArtifactoryRepo(getProject())); + properties.put("project", getProject()); + copy.expand(properties); + }); + } + + private String sha256(File file) { + try { + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + return new DigestUtils(digest).digestAsHex(file); + } + catch (Exception ex) { + throw new TaskExecutionException(this, ex); + } + } + + private String determineArtifactoryRepo(Project project) { + String version = project.getVersion().toString(); + String type = version.substring(version.lastIndexOf('.')); + if (type.equals("RELEASE")) { + return "release"; + } + if (type.startsWith("M") || type.startsWith("RC")) { + return "milestone"; + } + return "snapshot"; + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/cli/HomebrewFormula.java b/buildSrc/src/main/java/org/springframework/boot/build/cli/HomebrewFormula.java new file mode 100644 index 0000000000..5592d30617 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/cli/HomebrewFormula.java @@ -0,0 +1,35 @@ +/* + * Copyright 2012-2020 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.boot.build.cli; + +import java.util.Collections; + +import org.gradle.api.tasks.TaskAction; + +/** + * A {@Task} for creating a Homebrew formula manifest. + * + * @author Andy Wilkinson + */ +public class HomebrewFormula extends AbstractPackageManagerDefinitionTask { + + @TaskAction + void createFormula() { + createDescriptor(Collections.emptyMap()); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/cli/ScoopManifest.java b/buildSrc/src/main/java/org/springframework/boot/build/cli/ScoopManifest.java new file mode 100644 index 0000000000..de671c8da1 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/cli/ScoopManifest.java @@ -0,0 +1,36 @@ +/* + * Copyright 2012-2020 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.boot.build.cli; + +import java.util.Collections; + +import org.gradle.api.tasks.TaskAction; + +/** + * A {@Task} for creating a Scoop manifest. + * + * @author Andy Wilkinson + */ +public class ScoopManifest extends AbstractPackageManagerDefinitionTask { + + @TaskAction + void createManifest() { + String version = getProject().getVersion().toString(); + createDescriptor(Collections.singletonMap("scoopVersion", version.substring(0, version.lastIndexOf('.')))); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/constraints/DocumentConstrainedVersions.java b/buildSrc/src/main/java/org/springframework/boot/build/constraints/DocumentConstrainedVersions.java new file mode 100644 index 0000000000..101039e9fd --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/constraints/DocumentConstrainedVersions.java @@ -0,0 +1,81 @@ +/* + * Copyright 2019 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.boot.build.constraints; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; + +import javax.inject.Inject; + +import org.gradle.api.DefaultTask; +import org.gradle.api.model.ObjectFactory; +import org.gradle.api.provider.SetProperty; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.OutputFile; +import org.gradle.api.tasks.TaskAction; + +import org.springframework.boot.build.constraints.ExtractVersionConstraints.ConstrainedVersion; + +/** + * Task for documenting a platform's constrained versions. + * + * @author Andy Wilkinson + */ +public class DocumentConstrainedVersions extends DefaultTask { + + private final SetProperty constrainedVersions; + + private File outputFile; + + @Inject + public DocumentConstrainedVersions(ObjectFactory objectFactory) { + this.constrainedVersions = objectFactory.setProperty(ConstrainedVersion.class); + } + + @Input + public SetProperty getConstrainedVersions() { + return this.constrainedVersions; + } + + @OutputFile + public File getOutputFile() { + return this.outputFile; + } + + public void setOutputFile(File outputFile) { + this.outputFile = outputFile; + } + + @TaskAction + public void documentConstrainedVersions() throws IOException { + this.outputFile.getParentFile().mkdirs(); + try (PrintWriter writer = new PrintWriter(new FileWriter(this.outputFile))) { + writer.println("|==="); + writer.println("| Group ID | Artifact ID | Version"); + for (ConstrainedVersion constrainedVersion : this.constrainedVersions.get()) { + writer.println(); + writer.printf("| `%s`%n", constrainedVersion.getGroup()); + writer.printf("| `%s`%n", constrainedVersion.getArtifact()); + writer.printf("| `%s`%n", constrainedVersion.getVersion()); + } + writer.println("|==="); + } + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/constraints/ExtractVersionConstraints.java b/buildSrc/src/main/java/org/springframework/boot/build/constraints/ExtractVersionConstraints.java new file mode 100644 index 0000000000..3151560b7f --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/constraints/ExtractVersionConstraints.java @@ -0,0 +1,139 @@ +/* + * Copyright 2019 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.boot.build.constraints; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; + +import org.gradle.api.Task; +import org.gradle.api.artifacts.ComponentMetadataDetails; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.DependencyConstraint; +import org.gradle.api.artifacts.DependencyConstraintMetadata; +import org.gradle.api.artifacts.dsl.DependencyHandler; +import org.gradle.api.internal.AbstractTask; +import org.gradle.api.tasks.Internal; +import org.gradle.api.tasks.TaskAction; +import org.gradle.platform.base.Platform; + +/** + * {@link Task} to extract constraints from a {@link Platform}. The platform's own + * constraints and those in any boms upon which it depends are extracted. + * + * @author Andy Wilkinson + */ +public class ExtractVersionConstraints extends AbstractTask { + + private final Configuration configuration; + + private final Map versionConstraints = new TreeMap<>(); + + private final Set constrainedVersions = new TreeSet<>(); + + private final List projectPaths = new ArrayList(); + + public ExtractVersionConstraints() { + DependencyHandler dependencies = getProject().getDependencies(); + this.configuration = getProject().getConfigurations().create(getName()); + dependencies.getComponents().all(this::processMetadataDetails); + } + + public void enforcedPlatform(String projectPath) { + this.configuration.getDependencies().add(getProject().getDependencies().enforcedPlatform( + getProject().getDependencies().project(Collections.singletonMap("path", projectPath)))); + this.projectPaths.add(projectPath); + } + + @Internal + public Map getVersionConstraints() { + return Collections.unmodifiableMap(this.versionConstraints); + } + + @Internal + public Set getConstrainedVersions() { + return this.constrainedVersions; + } + + @TaskAction + void extractVersionConstraints() { + this.configuration.resolve(); + for (String projectPath : this.projectPaths) { + for (DependencyConstraint constraint : getProject().project(projectPath).getConfigurations() + .getByName("apiElements").getAllDependencyConstraints()) { + this.versionConstraints.put(constraint.getGroup() + ":" + constraint.getName(), + constraint.getVersionConstraint().toString()); + this.constrainedVersions.add(new ConstrainedVersion(constraint.getGroup(), constraint.getName(), + constraint.getVersionConstraint().toString())); + } + } + } + + private void processMetadataDetails(ComponentMetadataDetails details) { + details.allVariants((variantMetadata) -> variantMetadata.withDependencyConstraints((dependencyConstraints) -> { + for (DependencyConstraintMetadata constraint : dependencyConstraints) { + this.versionConstraints.put(constraint.getGroup() + ":" + constraint.getName(), + constraint.getVersionConstraint().toString()); + this.constrainedVersions.add(new ConstrainedVersion(constraint.getGroup(), constraint.getName(), + constraint.getVersionConstraint().toString())); + } + })); + } + + public static final class ConstrainedVersion implements Comparable, Serializable { + + private final String group; + + private final String artifact; + + private final String version; + + private ConstrainedVersion(String group, String artifact, String version) { + this.group = group; + this.artifact = artifact; + this.version = version; + } + + public String getGroup() { + return this.group; + } + + public String getArtifact() { + return this.artifact; + } + + public String getVersion() { + return this.version; + } + + @Override + public int compareTo(ConstrainedVersion other) { + int groupComparison = this.group.compareTo(other.group); + if (groupComparison != 0) { + return groupComparison; + } + return this.artifact.compareTo(other.artifact); + } + + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/AsciidocBuilder.java b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/AsciidocBuilder.java new file mode 100644 index 0000000000..305da3abcf --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/AsciidocBuilder.java @@ -0,0 +1,59 @@ +/* + * Copyright 2012-2020 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.boot.build.context.properties; + +/** + * Simple builder to help construct Asciidoc markup. + * + * @author Phillip Webb + */ +class AsciidocBuilder { + + private final StringBuilder content; + + AsciidocBuilder() { + this.content = new StringBuilder(); + } + + AsciidocBuilder appendKey(Object... items) { + for (Object item : items) { + appendln("`+", item, "+` +"); + } + return this; + } + + AsciidocBuilder newLine() { + return append(System.lineSeparator()); + } + + AsciidocBuilder appendln(Object... items) { + return append(items).newLine(); + } + + AsciidocBuilder append(Object... items) { + for (Object item : items) { + this.content.append(item); + } + return this; + } + + @Override + public String toString() { + return this.content.toString(); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/CompoundConfigurationTableEntry.java b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/CompoundConfigurationTableEntry.java new file mode 100644 index 0000000000..f045b5d730 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/CompoundConfigurationTableEntry.java @@ -0,0 +1,51 @@ +/* + * Copyright 2012-2020 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.boot.build.context.properties; + +import java.util.Set; +import java.util.TreeSet; +import java.util.stream.Stream; + +/** + * Table entry regrouping a list of configuration properties sharing the same description. + * + * @author Brian Clozel + */ +class CompoundConfigurationTableEntry extends ConfigurationTableEntry { + + private Set configurationKeys; + + private String description; + + CompoundConfigurationTableEntry(String key, String description) { + this.key = key; + this.description = description; + this.configurationKeys = new TreeSet<>(); + } + + void addConfigurationKeys(ConfigurationProperty... properties) { + Stream.of(properties).map(ConfigurationProperty::getName).forEach(this.configurationKeys::add); + } + + @Override + void write(AsciidocBuilder builder) { + builder.append("|"); + this.configurationKeys.forEach(builder::appendKey); + builder.newLine().appendln("|").appendln("|+++", this.description, "+++"); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationMetadataDocumentWriter.java b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationMetadataDocumentWriter.java new file mode 100644 index 0000000000..f566107322 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationMetadataDocumentWriter.java @@ -0,0 +1,125 @@ +/* + * Copyright 2012-2020 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.boot.build.context.properties; + +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.gradle.api.file.FileCollection; + +/** + * Write Asciidoc documents with configuration properties listings. + * + * @author Brian Clozel + * @since 2.0.0 + */ +public class ConfigurationMetadataDocumentWriter { + + public void writeDocument(Path outputDirectory, DocumentOptions options, FileCollection metadataFiles) + throws IOException { + assertValidOutputDirectory(outputDirectory); + if (!Files.exists(outputDirectory)) { + Files.createDirectory(outputDirectory); + } + List tables = createConfigTables(ConfigurationProperties.fromFiles(metadataFiles), options); + for (ConfigurationTable table : tables) { + writeConfigurationTable(table, outputDirectory); + } + } + + private void assertValidOutputDirectory(Path outputDirPath) { + if (outputDirPath == null) { + throw new IllegalArgumentException("output path should not be null"); + } + if (Files.exists(outputDirPath) && !Files.isDirectory(outputDirPath)) { + throw new IllegalArgumentException("output path already exists and is not a directory"); + } + } + + private List createConfigTables(Map metadataProperties, + DocumentOptions options) { + List tables = new ArrayList<>(); + List unmappedKeys = metadataProperties.values().stream().filter((property) -> !property.isDeprecated()) + .map(ConfigurationProperty::getName).collect(Collectors.toList()); + Map overrides = getOverrides(metadataProperties, unmappedKeys, + options); + options.getMetadataSections().forEach((id, keyPrefixes) -> tables + .add(createConfigTable(metadataProperties, unmappedKeys, overrides, id, keyPrefixes))); + if (!unmappedKeys.isEmpty()) { + throw new IllegalStateException( + "The following keys were not written to the documentation: " + String.join(", ", unmappedKeys)); + } + if (!overrides.isEmpty()) { + throw new IllegalStateException("The following keys were not written to the documentation: " + + String.join(", ", overrides.keySet())); + } + return tables; + } + + private Map getOverrides( + Map metadataProperties, List unmappedKeys, DocumentOptions options) { + Map overrides = new HashMap<>(); + options.getOverrides().forEach((keyPrefix, description) -> { + CompoundConfigurationTableEntry entry = new CompoundConfigurationTableEntry(keyPrefix, description); + List matchingKeys = unmappedKeys.stream().filter((key) -> key.startsWith(keyPrefix)) + .collect(Collectors.toList()); + for (String matchingKey : matchingKeys) { + entry.addConfigurationKeys(metadataProperties.get(matchingKey)); + } + overrides.put(keyPrefix, entry); + unmappedKeys.removeAll(matchingKeys); + }); + return overrides; + } + + private ConfigurationTable createConfigTable(Map metadataProperties, + List unmappedKeys, Map overrides, String id, + List keyPrefixes) { + ConfigurationTable table = new ConfigurationTable(id); + for (String keyPrefix : keyPrefixes) { + List matchingOverrides = overrides.keySet().stream() + .filter((overrideKey) -> overrideKey.startsWith(keyPrefix)).collect(Collectors.toList()); + matchingOverrides.forEach((match) -> table.addEntry(overrides.remove(match))); + } + List matchingKeys = unmappedKeys.stream() + .filter((key) -> keyPrefixes.stream().anyMatch(key::startsWith)).collect(Collectors.toList()); + for (String matchingKey : matchingKeys) { + ConfigurationProperty property = metadataProperties.get(matchingKey); + table.addEntry(new SingleConfigurationTableEntry(property)); + } + unmappedKeys.removeAll(matchingKeys); + return table; + } + + private void writeConfigurationTable(ConfigurationTable table, Path outputDirectory) throws IOException { + Path outputFilePath = outputDirectory.resolve(table.getId() + ".adoc"); + Files.deleteIfExists(outputFilePath); + Files.createFile(outputFilePath); + try (OutputStream outputStream = Files.newOutputStream(outputFilePath)) { + outputStream.write(table.toAsciidocTable().getBytes(StandardCharsets.UTF_8)); + } + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationProperties.java b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationProperties.java new file mode 100644 index 0000000000..5fa43adee1 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationProperties.java @@ -0,0 +1,81 @@ +/* + * Copyright 2012-2020 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.boot.build.context.properties; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.Reader; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import org.gradle.api.file.FileCollection; + +/** + * Configuration properties read from one or more + * {@code META-INF/spring-configuration-metadata.json} files. + * + * @author Andy Wilkinson + */ +final class ConfigurationProperties { + + private static final Type MAP_TYPE = new MapTypeToken().getType(); + + private ConfigurationProperties() { + + } + + @SuppressWarnings("unchecked") + static Map fromFiles(FileCollection files) { + List configurationProperties = new ArrayList<>(); + try { + Gson gson = new GsonBuilder().create(); + for (File file : files) { + try (Reader reader = new FileReader(file)) { + Map json = gson.fromJson(reader, MAP_TYPE); + List> properties = (List>) json.get("properties"); + for (Map property : properties) { + String name = (String) property.get("name"); + String type = (String) property.get("type"); + Object defaultValue = property.get("defaultValue"); + String description = (String) property.get("description"); + boolean deprecated = property.containsKey("deprecated"); + configurationProperties + .add(new ConfigurationProperty(name, type, defaultValue, description, deprecated)); + } + } + } + return configurationProperties.stream() + .collect(Collectors.toMap(ConfigurationProperty::getName, Function.identity())); + } + catch (IOException ex) { + throw new RuntimeException("Failed to load configuration metadata", ex); + } + } + + private static final class MapTypeToken extends TypeToken> { + + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationPropertiesPlugin.java b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationPropertiesPlugin.java new file mode 100644 index 0000000000..81f51281fb --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationPropertiesPlugin.java @@ -0,0 +1,94 @@ +/* + * Copyright 2012-2020 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.boot.build.context.properties; + +import java.io.File; +import java.util.Collections; +import java.util.concurrent.Callable; +import java.util.stream.Collectors; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.plugins.JavaPluginConvention; +import org.gradle.api.tasks.SourceSet; +import org.gradle.api.tasks.compile.JavaCompile; + +import org.springframework.util.StringUtils; + +/** + * {@link Plugin} for projects that define {@code @ConfigurationProperties}. When applied, + * the plugin reacts to the presence of the {@link JavaPlugin} by: + * + *
    + *
  • Adding a dependency on the configuration properties annotation processor. + *
  • Configure the additional metadata locations annotation processor compiler argument + *
  • Defining an artifact for the resulting configuration property metadata so that it + * can be consumed by downstream projects. + *
+ * + * @author Andy Wilkinson + */ +public class ConfigurationPropertiesPlugin implements Plugin { + + /** + * Name of the {@link Configuration} that holds the configuration property metadata + * artifact. + */ + public static final String CONFIGURATION_PROPERTIES_METADATA_CONFIGURATION_NAME = "configurationPropertiesMetadata"; + + @Override + public void apply(Project project) { + project.getPlugins().withType(JavaPlugin.class, (javaPlugin) -> { + addConfigurationProcessorDependency(project); + configureAdditionalMetadataLocationsCompilerArgument(project); + addMetadataArtifact(project); + }); + } + + private void addConfigurationProcessorDependency(Project project) { + Configuration annotationProcessors = project.getConfigurations() + .getByName(JavaPlugin.ANNOTATION_PROCESSOR_CONFIGURATION_NAME); + annotationProcessors.getDependencies().add(project.getDependencies().project(Collections.singletonMap("path", + ":spring-boot-project:spring-boot-tools:spring-boot-configuration-processor"))); + } + + private void addMetadataArtifact(Project project) { + SourceSet mainSourceSet = project.getConvention().getPlugin(JavaPluginConvention.class).getSourceSets() + .getByName(SourceSet.MAIN_SOURCE_SET_NAME); + project.getConfigurations().maybeCreate(CONFIGURATION_PROPERTIES_METADATA_CONFIGURATION_NAME); + project.afterEvaluate((evaluatedProject) -> evaluatedProject.getArtifacts().add( + CONFIGURATION_PROPERTIES_METADATA_CONFIGURATION_NAME, + evaluatedProject.provider((Callable) () -> new File(mainSourceSet.getJava().getOutputDir(), + "META-INF/spring-configuration-metadata.json")), + (artifact) -> artifact + .builtBy(evaluatedProject.getTasks().getByName(mainSourceSet.getClassesTaskName())))); + } + + private void configureAdditionalMetadataLocationsCompilerArgument(Project project) { + JavaCompile compileJava = project.getTasks().withType(JavaCompile.class) + .getByName(JavaPlugin.COMPILE_JAVA_TASK_NAME); + SourceSet mainSourceSet = project.getConvention().getPlugin(JavaPluginConvention.class).getSourceSets() + .getByName(SourceSet.MAIN_SOURCE_SET_NAME); + compileJava.getOptions().getCompilerArgs() + .add("-Aorg.springframework.boot.configurationprocessor.additionalMetadataLocations=" + StringUtils + .collectionToCommaDelimitedString(mainSourceSet.getResources().getSourceDirectories().getFiles() + .stream().map(project.getRootProject()::relativePath).collect(Collectors.toSet()))); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationProperty.java b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationProperty.java new file mode 100644 index 0000000000..e66c236f47 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationProperty.java @@ -0,0 +1,68 @@ +/* + * Copyright 2019 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.boot.build.context.properties; + +/** + * A configuration property. + * + * @author Andy Wilkinson + */ +public class ConfigurationProperty { + + private final String name; + + private final String type; + + private final Object defaultValue; + + private final String description; + + private final boolean deprecated; + + ConfigurationProperty(String name, String type) { + this(name, type, null, null, false); + } + + ConfigurationProperty(String name, String type, Object defaultValue, String description, boolean deprecated) { + this.name = name; + this.type = type; + this.defaultValue = defaultValue; + this.description = description; + this.deprecated = deprecated; + } + + public String getName() { + return this.name; + } + + public String getType() { + return this.type; + } + + public Object getDefaultValue() { + return this.defaultValue; + } + + public String getDescription() { + return this.description; + } + + public boolean isDeprecated() { + return this.deprecated; + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationTable.java b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationTable.java new file mode 100644 index 0000000000..533c0b8365 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationTable.java @@ -0,0 +1,60 @@ +/* + * Copyright 2012-2020 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.boot.build.context.properties; + +import java.util.Arrays; +import java.util.Set; +import java.util.TreeSet; + +/** + * Asciidoctor table listing configuration properties sharing to a common theme. + * + * @author Brian Clozel + */ +class ConfigurationTable { + + private final String id; + + private final Set entries; + + ConfigurationTable(String id) { + this.id = id; + this.entries = new TreeSet<>(); + } + + String getId() { + return this.id; + } + + void addEntry(ConfigurationTableEntry... entries) { + this.entries.addAll(Arrays.asList(entries)); + } + + String toAsciidocTable() { + AsciidocBuilder builder = new AsciidocBuilder(); + builder.appendln("[cols=\"1,1,2\", options=\"header\"]"); + builder.appendln("|==="); + builder.appendln("|Key|Default Value|Description"); + builder.appendln(); + this.entries.forEach((entry) -> { + entry.write(builder); + builder.appendln(); + }); + return builder.appendln("|===").toString(); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationTableEntry.java b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationTableEntry.java new file mode 100644 index 0000000000..a0ebc3361b --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationTableEntry.java @@ -0,0 +1,56 @@ +/* + * Copyright 2012-2020 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.boot.build.context.properties; + +/** + * Abstract class for entries in {@link ConfigurationTable}. + * + * @author Brian Clozel + */ +abstract class ConfigurationTableEntry implements Comparable { + + protected String key; + + String getKey() { + return this.key; + } + + abstract void write(AsciidocBuilder builder); + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + ConfigurationTableEntry other = (ConfigurationTableEntry) obj; + return this.key.equals(other.key); + } + + @Override + public int hashCode() { + return this.key.hashCode(); + } + + @Override + public int compareTo(ConfigurationTableEntry other) { + return this.key.compareTo(other.getKey()); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/DocumentConfigurationProperties.java b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/DocumentConfigurationProperties.java new file mode 100644 index 0000000000..bb38138e2c --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/DocumentConfigurationProperties.java @@ -0,0 +1,95 @@ +/* + * Copyright 2012-2020 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.boot.build.context.properties; + +import java.io.File; +import java.io.IOException; + +import org.gradle.api.Task; +import org.gradle.api.file.FileCollection; +import org.gradle.api.internal.AbstractTask; +import org.gradle.api.tasks.InputFiles; +import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.TaskAction; + +import org.springframework.boot.build.context.properties.DocumentOptions.Builder; + +/** + * {@link Task} used to document auto-configuration classes. + * + * @author Andy Wilkinson + */ +public class DocumentConfigurationProperties extends AbstractTask { + + private FileCollection configurationPropertyMetadata; + + private File outputDir; + + @InputFiles + public FileCollection getConfigurationPropertyMetadata() { + return this.configurationPropertyMetadata; + } + + public void setConfigurationPropertyMetadata(FileCollection configurationPropertyMetadata) { + this.configurationPropertyMetadata = configurationPropertyMetadata; + } + + @OutputDirectory + public File getOutputDir() { + return this.outputDir; + } + + public void setOutputDir(File outputDir) { + this.outputDir = outputDir; + } + + @TaskAction + void documentConfigurationProperties() throws IOException { + Builder builder = DocumentOptions.builder(); + builder.addSection("core") + .withKeyPrefixes("debug", "trace", "logging", "spring.aop", "spring.application", + "spring.autoconfigure", "spring.banner", "spring.beaninfo", "spring.codec", "spring.config", + "spring.info", "spring.jmx", "spring.main", "spring.messages", "spring.pid", "spring.profiles", + "spring.quartz", "spring.reactor", "spring.task", "spring.mandatory-file-encoding", "info", + "spring.output.ansi.enabled") + .addSection("mail").withKeyPrefixes("spring.mail", "spring.sendgrid").addSection("cache") + .withKeyPrefixes("spring.cache").addSection("server").withKeyPrefixes("server").addSection("web") + .withKeyPrefixes("spring.hateoas", "spring.http", "spring.servlet", "spring.jersey", "spring.mvc", + "spring.resources", "spring.webflux") + .addSection("json").withKeyPrefixes("spring.jackson", "spring.gson").addSection("rsocket") + .withKeyPrefixes("spring.rsocket").addSection("templating") + .withKeyPrefixes("spring.freemarker", "spring.groovy", "spring.mustache", "spring.thymeleaf") + .addOverride("spring.groovy.template.configuration", "See GroovyMarkupConfigurer") + .addSection("security").withKeyPrefixes("spring.security", "spring.ldap", "spring.session") + .addSection("data-migration").withKeyPrefixes("spring.flyway", "spring.liquibase").addSection("data") + .withKeyPrefixes("spring.couchbase", "spring.elasticsearch", "spring.h2", "spring.influx", + "spring.mongodb", "spring.redis", "spring.dao", "spring.data", "spring.datasource", + "spring.jooq", "spring.jdbc", "spring.jpa") + .addOverride("spring.datasource.dbcp2", "Commons DBCP2 specific settings") + .addOverride("spring.datasource.tomcat", "Tomcat datasource specific settings") + .addOverride("spring.datasource.hikari", "Hikari specific settings").addSection("transaction") + .withKeyPrefixes("spring.jta", "spring.transaction").addSection("integration") + .withKeyPrefixes("spring.activemq", "spring.artemis", "spring.batch", "spring.integration", + "spring.jms", "spring.kafka", "spring.rabbitmq", "spring.hazelcast", "spring.webservices") + .addSection("actuator").withKeyPrefixes("management").addSection("devtools") + .withKeyPrefixes("spring.devtools").addSection("testing").withKeyPrefixes("spring.test"); + DocumentOptions options = builder.build(); + new ConfigurationMetadataDocumentWriter().writeDocument(this.outputDir.toPath(), options, + this.configurationPropertyMetadata); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/DocumentOptions.java b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/DocumentOptions.java new file mode 100644 index 0000000000..53fc4adec3 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/DocumentOptions.java @@ -0,0 +1,98 @@ +/* + * Copyright 2012-2020 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.boot.build.context.properties; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Options for generating documentation for configuration properties. + * + * @author Brian Clozel + * @since 2.0.0 + */ +public final class DocumentOptions { + + private final Map> metadataSections; + + private final Map overrides; + + private DocumentOptions(Map> metadataSections, Map overrides) { + this.metadataSections = metadataSections; + this.overrides = overrides; + } + + Map> getMetadataSections() { + return this.metadataSections; + } + + Map getOverrides() { + return this.overrides; + } + + static Builder builder() { + return new Builder(); + } + + /** + * Builder for DocumentOptions. + */ + public static class Builder { + + Map> metadataSections = new HashMap<>(); + + Map overrides = new HashMap<>(); + + SectionSpec addSection(String name) { + return new SectionSpec(this, name); + } + + Builder addOverride(String keyPrefix, String description) { + this.overrides.put(keyPrefix, description); + return this; + } + + DocumentOptions build() { + return new DocumentOptions(this.metadataSections, this.overrides); + } + + } + + /** + * Configuration for a documentation section listing properties for a specific theme. + */ + public static class SectionSpec { + + private final String name; + + private final Builder builder; + + SectionSpec(Builder builder, String name) { + this.builder = builder; + this.name = name; + } + + Builder withKeyPrefixes(String... keyPrefixes) { + this.builder.metadataSections.put(this.name, Arrays.asList(keyPrefixes)); + return this.builder; + } + + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/SingleConfigurationTableEntry.java b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/SingleConfigurationTableEntry.java new file mode 100644 index 0000000000..a269281843 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/SingleConfigurationTableEntry.java @@ -0,0 +1,82 @@ +/* + * Copyright 2012-2020 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.boot.build.context.properties; + +import java.util.Arrays; +import java.util.stream.Collectors; + +/** + * Table entry containing a single configuration property. + * + * @author Brian Clozel + */ +class SingleConfigurationTableEntry extends ConfigurationTableEntry { + + private final String description; + + private final String defaultValue; + + SingleConfigurationTableEntry(ConfigurationProperty property) { + this.key = property.getName(); + if (property.getType() != null && property.getType().startsWith("java.util.Map")) { + this.key += ".*"; + } + this.description = property.getDescription(); + this.defaultValue = getDefaultValue(property.getDefaultValue()); + } + + private String getDefaultValue(Object defaultValue) { + if (defaultValue == null) { + return null; + } + if (defaultValue.getClass().isArray()) { + return Arrays.stream((Object[]) defaultValue).map(Object::toString) + .collect(Collectors.joining("," + System.lineSeparator())); + } + return defaultValue.toString(); + } + + @Override + void write(AsciidocBuilder builder) { + builder.appendln("|`+", this.key, "+`"); + writeDefaultValue(builder); + writeDescription(builder); + builder.appendln(); + } + + private void writeDefaultValue(AsciidocBuilder builder) { + String defaultValue = (this.defaultValue != null) ? this.defaultValue : ""; + if (defaultValue.isEmpty()) { + builder.appendln("|"); + } + else { + defaultValue = defaultValue.replace("\\", "\\\\").replace("|", "\\|"); + builder.appendln("|`+", defaultValue, "+`"); + } + } + + private void writeDescription(AsciidocBuilder builder) { + if (this.description == null || this.description.isEmpty()) { + builder.append("|"); + } + else { + String cleanedDescription = this.description.replace("|", "\\|"); + builder.append("|+++", cleanedDescription, "+++"); + } + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/log4j2/ReproducibleLog4j2PluginsDatAction.java b/buildSrc/src/main/java/org/springframework/boot/build/log4j2/ReproducibleLog4j2PluginsDatAction.java new file mode 100644 index 0000000000..0414fb1cbb --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/log4j2/ReproducibleLog4j2PluginsDatAction.java @@ -0,0 +1,111 @@ +/* + * Copyright 2012-2020 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.boot.build.log4j2; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Map; +import java.util.Map.Entry; +import java.util.TreeMap; + +import org.gradle.api.Action; +import org.gradle.api.InvalidUserDataException; +import org.gradle.api.tasks.TaskExecutionException; +import org.gradle.api.tasks.compile.JavaCompile; + +/** + * An {@Action} to post-process a {@code Log4j2Plugins.dat} and re-order its content so + * that it is reproducible. + * + * @author Andy Wilkinson + */ +public class ReproducibleLog4j2PluginsDatAction implements Action { + + @Override + public void execute(JavaCompile javaCompile) { + File datFile = new File(javaCompile.getDestinationDir(), + "META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat"); + try { + postProcess(datFile); + } + catch (IOException ex) { + throw new TaskExecutionException(javaCompile, ex); + } + } + + void postProcess(File datFile) throws IOException { + if (!datFile.isFile()) { + throw new InvalidUserDataException( + "META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat not found"); + } + Map> categories = new TreeMap<>(); + try (DataInputStream input = new DataInputStream(new FileInputStream(datFile))) { + int categoryCount = input.readInt(); + for (int i = 0; i < categoryCount; i++) { + String categoryName = input.readUTF(); + int pluginCount = input.readInt(); + Map category = categories.computeIfAbsent(categoryName, (c) -> new TreeMap<>()); + for (int j = 0; j < pluginCount; j++) { + Plugin plugin = new Plugin(input.readUTF(), input.readUTF(), input.readUTF(), input.readBoolean(), + input.readBoolean()); + category.putIfAbsent(plugin.key, plugin); + } + } + } + try (DataOutputStream output = new DataOutputStream(new FileOutputStream(datFile))) { + output.writeInt(categories.size()); + for (Entry> category : categories.entrySet()) { + output.writeUTF(category.getKey()); + output.writeInt(category.getValue().size()); + for (Plugin plugin : category.getValue().values()) { + output.writeUTF(plugin.key); + output.writeUTF(plugin.className); + output.writeUTF(plugin.name); + output.writeBoolean(plugin.printable); + output.writeBoolean(plugin.defer); + } + } + } + } + + private static final class Plugin { + + private final String key; + + private final String className; + + private final String name; + + private final boolean printable; + + private final boolean defer; + + private Plugin(String key, String className, String name, boolean printable, boolean defer) { + this.key = key; + this.className = className; + this.name = name; + this.printable = printable; + this.defer = defer; + } + + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/DocumentPluginGoals.java b/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/DocumentPluginGoals.java new file mode 100644 index 0000000000..2a16072dbb --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/DocumentPluginGoals.java @@ -0,0 +1,194 @@ +/* + * Copyright 2012-2020 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.boot.build.mavenplugin; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.List; +import java.util.stream.Collectors; + +import org.gradle.api.DefaultTask; +import org.gradle.api.Task; +import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.TaskAction; + +import org.springframework.boot.build.mavenplugin.PluginXmlParser.Mojo; +import org.springframework.boot.build.mavenplugin.PluginXmlParser.Parameter; +import org.springframework.boot.build.mavenplugin.PluginXmlParser.Plugin; + +/** + * A {@link Task} to document the plugin's goals. + * + * @author Andy Wilkinson + */ +public class DocumentPluginGoals extends DefaultTask { + + private final PluginXmlParser parser = new PluginXmlParser(); + + private File pluginXml; + + private File outputDir; + + @OutputDirectory + public File getOutputDir() { + return this.outputDir; + } + + public void setOutputDir(File outputDir) { + this.outputDir = outputDir; + } + + @InputFile + public File getPluginXml() { + return this.pluginXml; + } + + public void setPluginXml(File pluginXml) { + this.pluginXml = pluginXml; + } + + @TaskAction + public void documentPluginGoals() throws IOException { + Plugin plugin = this.parser.parse(this.pluginXml); + writeOverview(plugin); + for (Mojo mojo : plugin.getMojos()) { + documentMojo(plugin, mojo); + } + } + + private void writeOverview(Plugin plugin) throws IOException { + try (PrintWriter writer = new PrintWriter(new FileWriter(new File(this.outputDir, "overview.adoc")))) { + writer.println("[cols=\"1,3\"]"); + writer.println("|==="); + writer.println("| Goal | Description"); + writer.println(); + for (Mojo mojo : plugin.getMojos()) { + writer.printf("| <>%n", mojo.getGoal(), plugin.getGoalPrefix(), mojo.getGoal()); + writer.printf("| %s%n", mojo.getDescription()); + writer.println(); + } + writer.println("|==="); + } + } + + private void documentMojo(Plugin plugin, Mojo mojo) throws IOException { + try (PrintWriter writer = new PrintWriter(new FileWriter(new File(this.outputDir, mojo.getGoal() + ".adoc")))) { + String sectionId = "goals-" + mojo.getGoal(); + writer.println(); + writer.println(); + writer.printf("[[%s]]%n", sectionId); + writer.printf("== `%s:%s`%n", plugin.getGoalPrefix(), mojo.getGoal()); + writer.printf("`%s:%s:%s`%n", plugin.getGroupId(), plugin.getArtifactId(), plugin.getVersion()); + writer.println(); + writer.println(mojo.getDescription()); + List parameters = mojo.getParameters().stream().filter(Parameter::isEditable) + .collect(Collectors.toList()); + List requiredParameters = parameters.stream().filter(Parameter::isRequired) + .collect(Collectors.toList()); + String parametersSectionId = sectionId + "-parameters"; + String detailsSectionId = parametersSectionId + "-details"; + if (!requiredParameters.isEmpty()) { + writer.println(); + writer.println(); + writer.printf("[[%s-required]]%n", parametersSectionId); + writer.println("=== Required parameters"); + writeParametersTable(writer, mojo.getGoal(), requiredParameters); + } + List optionalParameters = parameters.stream().filter((parameter) -> !parameter.isRequired()) + .collect(Collectors.toList()); + if (!optionalParameters.isEmpty()) { + writer.println(); + writer.println(); + writer.printf("[[%s-optional]]%n", parametersSectionId); + writer.println("=== Optional parameters"); + writeParametersTable(writer, detailsSectionId, optionalParameters); + } + writer.println(); + writer.println(); + writer.printf("[[%s]]%n", detailsSectionId); + writer.println("=== Parameter details"); + writeParameterDetails(writer, parameters, detailsSectionId); + } + } + + private void writeParametersTable(PrintWriter writer, String detailsSectionId, List parameters) { + writer.println("[cols=\"3,2,3\"]"); + writer.println("|==="); + writer.println("| Name | Type | Default"); + writer.println(); + for (Parameter parameter : parameters) { + String name = parameter.getName(); + writer.printf("| <<%s-%s,%s>>%n", detailsSectionId, name, name); + String type = parameter.getType(); + if (type.lastIndexOf('.') >= 0) { + type = type.substring(type.lastIndexOf('.') + 1); + } + writer.printf("| `%s`%n", type); + String defaultValue = parameter.getDefaultValue(); + if (defaultValue != null) { + writer.printf("| `%s`%n", defaultValue); + } + else { + writer.println("|"); + } + writer.println(); + } + writer.println("|==="); + } + + private void writeParameterDetails(PrintWriter writer, List parameters, String sectionId) { + for (Parameter parameter : parameters) { + String name = parameter.getName(); + writer.println(); + writer.println(); + writer.printf("[[%s-%s]]%n", sectionId, name); + writer.printf("==== `%s`%n", name); + writer.println(parameter.getDescription()); + writer.println(); + writer.println("[cols=\"10h,90\"]"); + writer.println("|==="); + writer.println(); + writeDetail(writer, "Name", name); + writeDetail(writer, "Type", parameter.getType()); + writeOptionalDetail(writer, "Default value", parameter.getDefaultValue()); + writeOptionalDetail(writer, "User property", parameter.getUserProperty()); + writeOptionalDetail(writer, "Since", parameter.getSince()); + writer.println("|==="); + } + } + + private void writeDetail(PrintWriter writer, String name, String value) { + writer.printf("| %s%n", name); + writer.printf("| `%s`%n", value); + writer.println(); + } + + private void writeOptionalDetail(PrintWriter writer, String name, String value) { + writer.printf("| %s%n", name); + if (value != null) { + writer.printf("| `%s`%n", value); + } + else { + writer.println("|"); + } + writer.println(); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/MavenExec.java b/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/MavenExec.java new file mode 100644 index 0000000000..17694f11d1 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/MavenExec.java @@ -0,0 +1,101 @@ +/* + * Copyright 2012-2020 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.boot.build.mavenplugin; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.gradle.api.Project; +import org.gradle.api.Task; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.tasks.Internal; +import org.gradle.api.tasks.JavaExec; +import org.gradle.api.tasks.TaskExecutionException; +import org.gradle.process.internal.ExecException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A custom {@link JavaExec} {@link Task task} for running Maven. + * + * @author Andy Wilkinson + */ +public class MavenExec extends JavaExec { + + private Logger log = LoggerFactory.getLogger(MavenExec.class); + + private File projectDir; + + public MavenExec() throws IOException { + setClasspath(mavenConfiguration(getProject())); + args("--batch-mode"); + setMain("org.apache.maven.cli.MavenCli"); + } + + public void setProjectDir(File projectDir) { + this.projectDir = projectDir; + getInputs().file(new File(projectDir, "pom.xml")); + } + + @Override + public void exec() { + workingDir(this.projectDir); + systemProperty("maven.multiModuleProjectDirectory", this.projectDir.getAbsolutePath()); + try { + Path logFile = Files.createTempFile(getName(), ".log"); + try { + args("--log-file", logFile.toFile().getAbsolutePath()); + super.exec(); + if (this.log.isInfoEnabled()) { + Files.readAllLines(logFile).forEach(this.log::info); + } + } + catch (ExecException ex) { + System.out.println("Exec exception! Dumping log"); + Files.readAllLines(logFile).forEach(System.out::println); + throw ex; + } + } + catch (IOException ex) { + throw new TaskExecutionException(this, ex); + } + } + + private Configuration mavenConfiguration(Project project) { + Configuration existing = project.getConfigurations().findByName("maven"); + if (existing != null) { + return existing; + } + return project.getConfigurations().create("maven", (maven) -> { + maven.getDependencies().add(project.getDependencies().create("org.apache.maven:maven-embedder:3.6.2")); + maven.getDependencies().add(project.getDependencies().create("org.apache.maven:maven-compat:3.6.2")); + maven.getDependencies().add(project.getDependencies().create("org.slf4j:slf4j-simple:1.7.5")); + maven.getDependencies().add( + project.getDependencies().create("org.apache.maven.resolver:maven-resolver-connector-basic:1.4.1")); + maven.getDependencies().add( + project.getDependencies().create("org.apache.maven.resolver:maven-resolver-transport-http:1.4.1")); + }); + } + + @Internal + public File getProjectDir() { + return this.projectDir; + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/MavenPluginPlugin.java b/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/MavenPluginPlugin.java new file mode 100644 index 0000000000..08874b11aa --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/MavenPluginPlugin.java @@ -0,0 +1,211 @@ +/* + * Copyright 2019 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.boot.build.mavenplugin; + +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; + +import io.spring.javaformat.formatter.FileFormatter; +import org.gradle.api.DefaultTask; +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.Task; +import org.gradle.api.plugins.JavaLibraryPlugin; +import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.plugins.JavaPluginConvention; +import org.gradle.api.publish.PublishingExtension; +import org.gradle.api.publish.maven.MavenPublication; +import org.gradle.api.publish.maven.plugins.MavenPublishPlugin; +import org.gradle.api.tasks.Copy; +import org.gradle.api.tasks.JavaExec; +import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.SourceSet; +import org.gradle.api.tasks.SourceSetContainer; +import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.TaskExecutionException; +import org.gradle.api.tasks.bundling.Jar; +import org.gradle.api.tasks.javadoc.Javadoc; +import org.gradle.external.javadoc.StandardJavadocDocletOptions; + +import org.springframework.boot.build.DeployedPlugin; +import org.springframework.boot.build.MavenRepositoryPlugin; +import org.springframework.boot.build.test.IntegrationTestPlugin; + +/** + * Plugin for building Spring Boot's Maven Plugin. + * + * @author Andy Wilkinson + */ +public class MavenPluginPlugin implements Plugin { + + @Override + public void apply(Project project) { + project.getPlugins().apply(JavaLibraryPlugin.class); + project.getPlugins().apply(MavenPublishPlugin.class); + project.getPlugins().apply(DeployedPlugin.class); + project.getPlugins().apply(MavenRepositoryPlugin.class); + project.getPlugins().apply(IntegrationTestPlugin.class); + Copy populateIntTestMavenRepository = project.getTasks().create("populateIntTestMavenRepository", Copy.class); + populateIntTestMavenRepository.setDestinationDir(project.getBuildDir()); + populateIntTestMavenRepository.into("int-test-maven-repository", (copy) -> { + copy.from(project.getConfigurations().getByName(MavenRepositoryPlugin.MAVEN_REPOSITORY_CONFIGURATION_NAME)); + copy.from(new File(project.getBuildDir(), "maven-repository")); + }); + populateIntTestMavenRepository + .dependsOn(project.getTasks().getByName(MavenRepositoryPlugin.PUBLISH_TO_PROJECT_REPOSITORY_TASK_NAME)); + configurePomPackaging(project); + MavenExec generateHelpMojo = configureMojoGenerationTasks(project); + MavenExec generatePluginDescriptor = configurePluginDescriptorGenerationTasks(project, generateHelpMojo); + DocumentPluginGoals documentPluginGoals = project.getTasks().create("documentPluginGoals", + DocumentPluginGoals.class); + documentPluginGoals.setPluginXml(generatePluginDescriptor.getOutputs().getFiles().getSingleFile()); + documentPluginGoals.setOutputDir(new File(project.getBuildDir(), "docs/generated/goals/")); + documentPluginGoals.dependsOn(generatePluginDescriptor); + Jar jar = (Jar) project.getTasks().getByName(JavaPlugin.JAR_TASK_NAME); + includeDescriptorInJar(jar, generatePluginDescriptor); + includeHelpMojoInJar(jar, generateHelpMojo); + PrepareMavenBinaries prepareMavenBinaries = project.getTasks().create("prepareMavenBinaries", + PrepareMavenBinaries.class); + prepareMavenBinaries.setOutputDir(new File(project.getBuildDir(), "maven-binaries")); + project.getTasks().getByName(IntegrationTestPlugin.INT_TEST_TASK_NAME).dependsOn(populateIntTestMavenRepository, + prepareMavenBinaries); + } + + private void configurePomPackaging(Project project) { + PublishingExtension publishing = project.getExtensions().getByType(PublishingExtension.class); + publishing.getPublications().withType(MavenPublication.class, + (mavenPublication) -> mavenPublication.pom((pom) -> pom.setPackaging("maven-plugin"))); + } + + private MavenExec configureMojoGenerationTasks(Project project) { + File helpMojoDir = new File(project.getBuildDir(), "help-mojo"); + Copy helpMojoInputs = createCopyHelpMojoInputs(project, helpMojoDir); + MavenExec generateHelpMojo = createGenerateHelpMojo(project, helpMojoDir); + generateHelpMojo.dependsOn(helpMojoInputs); + return generateHelpMojo; + } + + private Copy createCopyHelpMojoInputs(Project project, File mavenDir) { + Copy mojoInputs = project.getTasks().create("copyHelpMojoInputs", Copy.class); + mojoInputs.setDestinationDir(mavenDir); + mojoInputs.from(new File(project.getProjectDir(), "src/maven/resources/pom.xml"), + (sync) -> sync.filter((input) -> input.replace("{{version}}", project.getVersion().toString()))); + return mojoInputs; + } + + private MavenExec createGenerateHelpMojo(Project project, File mavenDir) { + MavenExec generateHelpMojo = project.getTasks().create("generateHelpMojo", MavenExec.class); + generateHelpMojo.setProjectDir(mavenDir); + generateHelpMojo.args("org.apache.maven.plugins:maven-plugin-plugin:3.6.0:helpmojo"); + generateHelpMojo.getOutputs().dir(new File(mavenDir, "target/generated-sources/plugin")); + return generateHelpMojo; + } + + private MavenExec configurePluginDescriptorGenerationTasks(Project project, MavenExec generateHelpMojo) { + File pluginDescriptorDir = new File(project.getBuildDir(), "plugin-descriptor"); + SourceSetContainer sourceSets = project.getConvention().getPlugin(JavaPluginConvention.class).getSourceSets(); + SourceSet mainSourceSet = sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME); + File generatedHelpMojoDir = new File(project.getBuildDir(), "generated/sources/helpMojo"); + project.getTasks().withType(Javadoc.class, + (javadoc) -> ((StandardJavadocDocletOptions) javadoc.getOptions()).addMultilineStringsOption("tag") + .setValue(Arrays.asList("goal:X", "requiresProject:X", "threadSafe:X"))); + FormatHelpMojoSource copyFormattedHelpMojoSource = project.getTasks().create("copyFormattedHelpMojoSource", + FormatHelpMojoSource.class); + copyFormattedHelpMojoSource.setGenerator(generateHelpMojo); + copyFormattedHelpMojoSource.setOutputDir(generatedHelpMojoDir); + mainSourceSet.getAllJava().srcDir(generatedHelpMojoDir); + project.getTasks().getByName(mainSourceSet.getCompileJavaTaskName()).dependsOn(copyFormattedHelpMojoSource); + Copy pluginDescriptorInputs = createCopyPluginDescriptorInputs(project, pluginDescriptorDir, mainSourceSet); + pluginDescriptorInputs.dependsOn(mainSourceSet.getClassesTaskName()); + MavenExec generatePluginDescriptor = createGeneratePluginDescriptor(project, pluginDescriptorDir); + generatePluginDescriptor.dependsOn(pluginDescriptorInputs); + return generatePluginDescriptor; + } + + private Copy createCopyPluginDescriptorInputs(Project project, File destination, SourceSet sourceSet) { + Copy pluginDescriptorInputs = project.getTasks().create("copyPluginDescriptorInputs", Copy.class); + pluginDescriptorInputs.setDestinationDir(destination); + pluginDescriptorInputs.from(new File(project.getProjectDir(), "src/maven/resources/pom.xml"), + (sync) -> sync.filter((input) -> input.replace("{{version}}", project.getVersion().toString()))); + pluginDescriptorInputs.from(sourceSet.getOutput().getClassesDirs(), (sync) -> sync.into("target/classes")); + pluginDescriptorInputs.from(sourceSet.getAllJava().getSrcDirs(), (sync) -> sync.into("src/main/java")); + return pluginDescriptorInputs; + } + + private MavenExec createGeneratePluginDescriptor(Project project, File mavenDir) { + MavenExec generatePluginDescriptor = project.getTasks().create("generatePluginDescriptor", MavenExec.class); + generatePluginDescriptor.args("org.apache.maven.plugins:maven-plugin-plugin:3.6.0:descriptor"); + generatePluginDescriptor.getOutputs().file(new File(mavenDir, "target/classes/META-INF/maven/plugin.xml")); + generatePluginDescriptor.getInputs().dir(new File(mavenDir, "target/classes/org")); + generatePluginDescriptor.setProjectDir(mavenDir); + return generatePluginDescriptor; + } + + private void includeDescriptorInJar(Jar jar, JavaExec generatePluginDescriptor) { + jar.from(generatePluginDescriptor, (copy) -> copy.into("META-INF/maven/")); + jar.dependsOn(generatePluginDescriptor); + } + + private void includeHelpMojoInJar(Jar jar, JavaExec generateHelpMojo) { + jar.from(generateHelpMojo); + jar.dependsOn(generateHelpMojo); + } + + public static class FormatHelpMojoSource extends DefaultTask { + + private Task generator; + + private File outputDir; + + void setGenerator(Task generator) { + this.generator = generator; + getInputs().files(this.generator); + } + + @OutputDirectory + public File getOutputDir() { + return this.outputDir; + } + + void setOutputDir(File outputDir) { + this.outputDir = outputDir; + } + + @TaskAction + void syncAndFormat() { + FileFormatter fileFormatter = new FileFormatter(); + for (File output : this.generator.getOutputs().getFiles()) { + fileFormatter.formatFiles(getProject().fileTree(output), StandardCharsets.UTF_8).forEach((fileEdit) -> { + Path relativePath = output.toPath().relativize(fileEdit.getFile().toPath()); + Path outputLocation = this.outputDir.toPath().resolve(relativePath); + try { + Files.createDirectories(outputLocation.getParent()); + Files.write(outputLocation, fileEdit.getFormattedContent().getBytes(StandardCharsets.UTF_8)); + } + catch (Exception ex) { + throw new TaskExecutionException(this, ex); + } + }); + } + } + + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/PluginXmlParser.java b/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/PluginXmlParser.java new file mode 100644 index 0000000000..6269923df2 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/PluginXmlParser.java @@ -0,0 +1,287 @@ +/* + * Copyright 2019 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.boot.build.mavenplugin; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +/** + * A parser for a Maven plugin's {@code plugin.xml} file. + * + * @author Andy Wilkinson + */ +class PluginXmlParser { + + private final XPath xpath; + + PluginXmlParser() { + this.xpath = XPathFactory.newInstance().newXPath(); + } + + Plugin parse(File pluginXml) { + try { + Node root = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(pluginXml); + List mojos = parseMojos(root); + return new Plugin(textAt("//plugin/groupId", root), textAt("//plugin/artifactId", root), + textAt("//plugin/version", root), textAt("//plugin/goalPrefix", root), mojos); + } + catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + private String textAt(String path, Node source) throws XPathExpressionException { + String text = this.xpath.evaluate(path + "/text()", source); + return (text.length() == 0) ? null : text; + } + + private List parseMojos(Node plugin) throws XPathExpressionException { + List mojos = new ArrayList(); + for (Node mojoNode : nodesAt("//plugin/mojos/mojo", plugin)) { + mojos.add(new Mojo(textAt("goal", mojoNode), format(textAt("description", mojoNode)), + parseParameters(mojoNode))); + } + return mojos; + } + + private Iterable nodesAt(String path, Node source) throws XPathExpressionException { + return IterableNodeList.of((NodeList) this.xpath.evaluate(path, source, XPathConstants.NODESET)); + } + + private List parseParameters(Node mojoNode) throws XPathExpressionException { + Map defaultValues = new HashMap<>(); + Map userProperties = new HashMap<>(); + for (Node parameterConfigurationNode : nodesAt("configuration/*", mojoNode)) { + String userProperty = parameterConfigurationNode.getTextContent(); + if (userProperty != null && userProperty.length() > 0) { + userProperties.put(parameterConfigurationNode.getNodeName(), + userProperty.replace("${", "`").replace("}", "`")); + } + Node defaultValueAttribute = parameterConfigurationNode.getAttributes().getNamedItem("default-value"); + if (defaultValueAttribute != null && defaultValueAttribute.getTextContent().length() > 0) { + defaultValues.put(parameterConfigurationNode.getNodeName(), defaultValueAttribute.getTextContent()); + } + } + List parameters = new ArrayList<>(); + for (Node parameterNode : nodesAt("parameters/parameter", mojoNode)) { + parameters.add(parseParameter(parameterNode, defaultValues, userProperties)); + } + return parameters; + } + + private Parameter parseParameter(Node parameterNode, Map defaultValues, + Map userProperties) throws XPathExpressionException { + Parameter parameter = new Parameter(textAt("name", parameterNode), textAt("type", parameterNode), + booleanAt("required", parameterNode), booleanAt("editable", parameterNode), + format(textAt("description", parameterNode)), defaultValues.get(textAt("name", parameterNode)), + userProperties.get(textAt("name", parameterNode)), textAt("since", parameterNode)); + return parameter; + } + + private boolean booleanAt(String path, Node node) throws XPathExpressionException { + return Boolean.valueOf(textAt(path, node)); + } + + private String format(String input) { + return input.replace("", "`").replace("", "`").replace("<", "<").replace(">", ">") + .replace("
", " ").replace("\n", " ").replace(""", "\"").replaceAll("\\{@code (.*?)\\}", "`$1`") + .replaceAll("\\{@link (.*?)\\}", "`$1`").replaceAll("\\{@literal (.*?)\\}", "`$1`") + .replaceAll("(.*?)", "\\$1[\\$2]"); + } + + private static final class IterableNodeList implements Iterable { + + private final NodeList nodeList; + + private IterableNodeList(NodeList nodeList) { + this.nodeList = nodeList; + } + + private static Iterable of(NodeList nodeList) { + return new IterableNodeList(nodeList); + } + + @Override + public Iterator iterator() { + + return new Iterator() { + + private int index = 0; + + @Override + public boolean hasNext() { + return this.index < IterableNodeList.this.nodeList.getLength(); + } + + @Override + public Node next() { + return IterableNodeList.this.nodeList.item(this.index++); + } + + }; + } + + } + + static final class Plugin { + + private final String groupId; + + private final String artifactId; + + private final String version; + + private final String goalPrefix; + + private final List mojos; + + private Plugin(String groupId, String artifactId, String version, String goalPrefix, List mojos) { + this.groupId = groupId; + this.artifactId = artifactId; + this.version = version; + this.goalPrefix = goalPrefix; + this.mojos = mojos; + } + + String getGroupId() { + return this.groupId; + } + + String getArtifactId() { + return this.artifactId; + } + + String getVersion() { + return this.version; + } + + String getGoalPrefix() { + return this.goalPrefix; + } + + List getMojos() { + return this.mojos; + } + + } + + static final class Mojo { + + private final String goal; + + private final String description; + + private final List parameters; + + private Mojo(String goal, String description, List parameters) { + this.goal = goal; + this.description = description; + this.parameters = parameters; + } + + String getGoal() { + return this.goal; + } + + String getDescription() { + return this.description; + } + + List getParameters() { + return this.parameters; + } + + } + + static final class Parameter { + + private final String name; + + private final String type; + + private final boolean required; + + private final boolean editable; + + private final String description; + + private final String defaultValue; + + private final String userProperty; + + private final String since; + + private Parameter(String name, String type, boolean required, boolean editable, String description, + String defaultValue, String userProperty, String since) { + this.name = name; + this.type = type; + this.required = required; + this.editable = editable; + this.description = description; + this.defaultValue = defaultValue; + this.userProperty = userProperty; + this.since = since; + } + + String getName() { + return this.name; + } + + String getType() { + return this.type; + } + + boolean isRequired() { + return this.required; + } + + boolean isEditable() { + return this.editable; + } + + String getDescription() { + return this.description; + } + + String getDefaultValue() { + return this.defaultValue; + } + + String getUserProperty() { + return this.userProperty; + } + + String getSince() { + return this.since; + } + + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/PrepareMavenBinaries.java b/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/PrepareMavenBinaries.java new file mode 100644 index 0000000000..e4f18ece6b --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/PrepareMavenBinaries.java @@ -0,0 +1,70 @@ +/* + * Copyright 2019 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.boot.build.mavenplugin; + +import java.io.File; +import java.util.Arrays; +import java.util.LinkedHashSet; +import java.util.Set; + +import org.gradle.api.DefaultTask; +import org.gradle.api.Task; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.TaskAction; + +/** + * {@link Task} to make Maven binaries available for integration testing. + * + * @author Andy Wilkinson + */ +public class PrepareMavenBinaries extends DefaultTask { + + private Set versions = new LinkedHashSet<>(); + + private File outputDir; + + @OutputDirectory + public File getOutputDir() { + return this.outputDir; + } + + public void setOutputDir(File outputDir) { + this.outputDir = outputDir; + } + + @Input + public Set getVersions() { + return this.versions; + } + + public void versions(String... versions) { + this.versions.addAll(Arrays.asList(versions)); + } + + @TaskAction + public void prepareBinaries() { + for (String version : this.versions) { + Configuration configuration = getProject().getConfigurations().detachedConfiguration( + getProject().getDependencies().create("org.apache.maven:apache-maven:" + version + ":bin@zip")); + getProject().copy( + (copy) -> copy.into(this.outputDir).from(getProject().zipTree(configuration.getSingleFile()))); + } + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/optional/OptionalDependenciesPlugin.java b/buildSrc/src/main/java/org/springframework/boot/build/optional/OptionalDependenciesPlugin.java new file mode 100644 index 0000000000..0f622fcee8 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/optional/OptionalDependenciesPlugin.java @@ -0,0 +1,65 @@ +/* + * Copyright 2012-2020 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.boot.build.optional; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.attributes.Usage; +import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.plugins.JavaPluginConvention; +import org.gradle.api.tasks.SourceSetContainer; +import org.gradle.api.tasks.javadoc.Javadoc; +import org.gradle.plugins.ide.eclipse.EclipsePlugin; +import org.gradle.plugins.ide.eclipse.model.EclipseModel; + +/** + * A {@code Plugin} that adds support for Maven-style optional dependencies. Creates a new + * {@code optional} configuration. The {@code optional} configuration is part of the + * project's compile and runtime classpath's but does not affect the classpath of + * dependent projects. + * + * @author Andy Wilkinson + */ +public class OptionalDependenciesPlugin implements Plugin { + + /** + * Name of the {@code optional} configuration. + */ + public static final String OPTIONAL_CONFIGURATION_NAME = "optional"; + + @Override + public void apply(Project project) { + Configuration optional = project.getConfigurations().create("optional"); + optional.attributes((attributes) -> attributes.attribute(Usage.USAGE_ATTRIBUTE, + project.getObjects().named(Usage.class, Usage.JAVA_RUNTIME))); + project.getPlugins().withType(JavaPlugin.class, (javaPlugin) -> { + SourceSetContainer sourceSets = project.getConvention().getPlugin(JavaPluginConvention.class) + .getSourceSets(); + sourceSets.all((sourceSet) -> { + sourceSet.setCompileClasspath(sourceSet.getCompileClasspath().plus(optional)); + sourceSet.setRuntimeClasspath(sourceSet.getRuntimeClasspath().plus(optional)); + }); + project.getTasks().withType(Javadoc.class) + .all((javadoc) -> javadoc.setClasspath(javadoc.getClasspath().plus(optional))); + }); + project.getPlugins().withType(EclipsePlugin.class, + (eclipePlugin) -> project.getExtensions().getByType(EclipseModel.class) + .classpath((classpath) -> classpath.getPlusConfigurations().add(optional))); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/starters/DocumentStarters.java b/buildSrc/src/main/java/org/springframework/boot/build/starters/DocumentStarters.java new file mode 100644 index 0000000000..a5cdf124d4 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/starters/DocumentStarters.java @@ -0,0 +1,163 @@ +/* + * Copyright 2019 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.boot.build.starters; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import java.util.TreeSet; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.gradle.api.Task; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.file.FileCollection; +import org.gradle.api.internal.AbstractTask; +import org.gradle.api.tasks.InputFiles; +import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.TaskAction; + +import org.springframework.util.StringUtils; + +/** + * {@link Task} to document all starter projects. + * + * @author Andy Wilkinson + */ +public class DocumentStarters extends AbstractTask { + + private final Configuration starters; + + private File outputDir; + + public DocumentStarters() { + this.starters = getProject().getConfigurations().create("starters"); + getProject().getGradle().projectsEvaluated((gradle) -> { + gradle.allprojects((project) -> { + if (project.getPlugins().hasPlugin(StarterPlugin.class)) { + Map dependency = new HashMap<>(); + dependency.put("path", project.getPath()); + dependency.put("configuration", "starterMetadata"); + this.starters.getDependencies().add(project.getDependencies().project(dependency)); + } + }); + }); + } + + @OutputDirectory + public File getOutputDir() { + return this.outputDir; + } + + public void setOutputDir(File outputDir) { + this.outputDir = outputDir; + } + + @InputFiles + public FileCollection getStarters() { + return this.starters; + } + + @TaskAction + void documentStarters() { + Set starters = this.starters.getFiles().stream().map(this::loadStarter) + .collect(Collectors.toCollection(TreeSet::new)); + writeTable("application-starters", starters.stream().filter(Starter::isApplication)); + writeTable("production-starters", starters.stream().filter(Starter::isProduction)); + writeTable("technical-starters", starters.stream().filter(Starter::isTechnical)); + } + + private Starter loadStarter(File metadata) { + Properties properties = new Properties(); + try (FileReader reader = new FileReader(metadata)) { + properties.load(reader); + return new Starter(properties.getProperty("name"), properties.getProperty("description"), + StringUtils.commaDelimitedListToSet(properties.getProperty("dependencies"))); + } + catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + private void writeTable(String name, Stream starters) { + File output = new File(this.outputDir, name + ".adoc"); + output.getParentFile().mkdirs(); + try (PrintWriter writer = new PrintWriter(new FileWriter(output))) { + writer.println("|==="); + writer.println("| Name | Description"); + starters.forEach((starter) -> { + writer.println(); + writer.printf("| [[%s]]`%s`%n", starter.name, starter.name); + writer.printf("| %s%n", postProcessDescription(starter.description)); + }); + writer.println("|==="); + } + catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + private String postProcessDescription(String description) { + return addStarterCrossLinks(description); + } + + private String addStarterCrossLinks(String input) { + return input.replaceAll("(spring-boot-starter[A-Za-z-]*)", "<<$1,`$1`>>"); + } + + private static final class Starter implements Comparable { + + private final String name; + + private final String description; + + private final Set dependencies; + + private Starter(String name, String description, Set dependencies) { + this.name = name; + this.description = description; + this.dependencies = dependencies; + } + + private boolean isProduction() { + return this.name.equals("spring-boot-starter-actuator"); + } + + private boolean isTechnical() { + return !Arrays.asList("spring-boot-starter", "spring-boot-starter-test").contains(this.name) + && !isProduction() && !this.dependencies.contains("spring-boot-starter"); + } + + private boolean isApplication() { + return !isProduction() && !isTechnical(); + } + + @Override + public int compareTo(Starter other) { + return this.name.compareTo(other.name); + } + + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/starters/StarterMetadata.java b/buildSrc/src/main/java/org/springframework/boot/build/starters/StarterMetadata.java new file mode 100644 index 0000000000..75e09c1273 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/starters/StarterMetadata.java @@ -0,0 +1,82 @@ +/* + * Copyright 2012-2020 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.boot.build.starters; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Properties; +import java.util.concurrent.Callable; +import java.util.stream.Collectors; + +import org.gradle.api.Task; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.ResolvedArtifact; +import org.gradle.api.file.FileCollection; +import org.gradle.api.internal.AbstractTask; +import org.gradle.api.tasks.InputFiles; +import org.gradle.api.tasks.OutputFile; +import org.gradle.api.tasks.TaskAction; + +/** + * A {@link Task} for generating metadata that describes a starter. + * + * @author Andy Wilkinson + */ +public class StarterMetadata extends AbstractTask { + + private Configuration dependencies; + + private File destination; + + public StarterMetadata() { + getInputs().property("name", (Callable) () -> getProject().getName()); + getInputs().property("description", (Callable) () -> getProject().getDescription()); + } + + @InputFiles + public FileCollection getDependencies() { + return this.dependencies; + } + + public void setDependencies(Configuration dependencies) { + this.dependencies = dependencies; + } + + @OutputFile + public File getDestination() { + return this.destination; + } + + public void setDestination(File destination) { + this.destination = destination; + } + + @TaskAction + void generateMetadata() throws IOException { + Properties properties = new Properties(); + properties.setProperty("name", getProject().getName()); + properties.setProperty("description", getProject().getDescription()); + properties.setProperty("dependencies", String.join(",", this.dependencies.getResolvedConfiguration() + .getResolvedArtifacts().stream().map(ResolvedArtifact::getName).collect(Collectors.toSet()))); + this.destination.getParentFile().mkdirs(); + try (FileWriter writer = new FileWriter(this.destination)) { + properties.store(writer, null); + } + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/starters/StarterPlugin.java b/buildSrc/src/main/java/org/springframework/boot/build/starters/StarterPlugin.java new file mode 100644 index 0000000000..3ad6a3f714 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/starters/StarterPlugin.java @@ -0,0 +1,78 @@ +/* + * Copyright 2019 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.boot.build.starters; + +import java.io.File; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.ConfigurationContainer; +import org.gradle.api.plugins.JavaBasePlugin; +import org.gradle.api.plugins.JavaLibraryPlugin; +import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.plugins.PluginContainer; + +import org.springframework.boot.build.ConventionsPlugin; +import org.springframework.boot.build.DeployedPlugin; +import org.springframework.boot.build.classpath.CheckClasspathForConflicts; +import org.springframework.boot.build.classpath.CheckClasspathForProhibitedDependencies; +import org.springframework.util.StringUtils; + +/** + * A {@link Plugin} for a starter project. + * + * @author Andy Wilkinson + */ +public class StarterPlugin implements Plugin { + + @Override + public void apply(Project project) { + PluginContainer plugins = project.getPlugins(); + plugins.apply(DeployedPlugin.class); + plugins.apply(JavaLibraryPlugin.class); + plugins.apply(ConventionsPlugin.class); + StarterMetadata starterMetadata = project.getTasks().create("starterMetadata", StarterMetadata.class); + ConfigurationContainer configurations = project.getConfigurations(); + Configuration runtimeClasspath = configurations.getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME); + starterMetadata.setDependencies(runtimeClasspath); + File destination = new File(project.getBuildDir(), "starter-metadata.properties"); + starterMetadata.setDestination(destination); + configurations.create("starterMetadata"); + project.getArtifacts().add("starterMetadata", project.provider(starterMetadata::getDestination), + (artifact) -> artifact.builtBy(starterMetadata)); + createClasspathConflictsCheck(runtimeClasspath, project); + createProhibitedDependenciesCheck(runtimeClasspath, project); + } + + private void createClasspathConflictsCheck(Configuration classpath, Project project) { + CheckClasspathForConflicts checkClasspathForConflicts = project.getTasks().create( + "check" + StringUtils.capitalize(classpath.getName() + "ForConflicts"), + CheckClasspathForConflicts.class); + checkClasspathForConflicts.setClasspath(classpath); + project.getTasks().getByName(JavaBasePlugin.CHECK_TASK_NAME).dependsOn(checkClasspathForConflicts); + } + + private void createProhibitedDependenciesCheck(Configuration classpath, Project project) { + CheckClasspathForProhibitedDependencies checkClasspathForProhibitedDependencies = project.getTasks().create( + "check" + StringUtils.capitalize(classpath.getName() + "ForProhibitedDependencies"), + CheckClasspathForProhibitedDependencies.class); + checkClasspathForProhibitedDependencies.setClasspath(classpath); + project.getTasks().getByName(JavaBasePlugin.CHECK_TASK_NAME).dependsOn(checkClasspathForProhibitedDependencies); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/test/IntegrationTestPlugin.java b/buildSrc/src/main/java/org/springframework/boot/build/test/IntegrationTestPlugin.java new file mode 100644 index 0000000000..58ac2fb33f --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/test/IntegrationTestPlugin.java @@ -0,0 +1,82 @@ +/* + * Copyright 2012-2020 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.boot.build.test; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.plugins.JavaPluginConvention; +import org.gradle.api.tasks.SourceSet; +import org.gradle.api.tasks.SourceSetContainer; +import org.gradle.api.tasks.testing.Test; +import org.gradle.language.base.plugins.LifecycleBasePlugin; +import org.gradle.plugins.ide.eclipse.EclipsePlugin; +import org.gradle.plugins.ide.eclipse.model.EclipseModel; + +/** + * A {@Plugin} to configure integration testing support in a {@link Project}. + * + * @author Andy Wilkinson + */ +public class IntegrationTestPlugin implements Plugin { + + /** + * Name of the {@code intTest} task. + */ + public static String INT_TEST_TASK_NAME = "intTest"; + + /** + * Name of the {@code intTest} source set. + */ + public static String INT_TEST_SOURCE_SET_NAME = "intTest"; + + @Override + public void apply(Project project) { + project.getPlugins().withType(JavaPlugin.class, (javaPlugin) -> this.configureIntegrationTesting(project)); + } + + private void configureIntegrationTesting(Project project) { + SourceSet intTestSourceSet = createSourceSet(project); + Test intTest = createTestTask(project, intTestSourceSet); + project.getTasks().getByName(LifecycleBasePlugin.CHECK_TASK_NAME).dependsOn(intTest); + project.getPlugins().withType(EclipsePlugin.class, (eclipsePlugin) -> { + EclipseModel eclipse = project.getExtensions().getByType(EclipseModel.class); + eclipse.classpath((classpath) -> classpath.getPlusConfigurations().add( + project.getConfigurations().getByName(intTestSourceSet.getRuntimeClasspathConfigurationName()))); + }); + } + + private SourceSet createSourceSet(Project project) { + SourceSetContainer sourceSets = project.getConvention().getPlugin(JavaPluginConvention.class).getSourceSets(); + SourceSet intTestSourceSet = sourceSets.create(INT_TEST_SOURCE_SET_NAME); + SourceSet main = sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME); + intTestSourceSet.setCompileClasspath(intTestSourceSet.getCompileClasspath().plus(main.getOutput())); + intTestSourceSet.setRuntimeClasspath(intTestSourceSet.getRuntimeClasspath().plus(main.getOutput())); + return intTestSourceSet; + } + + private Test createTestTask(Project project, SourceSet intTestSourceSet) { + Test intTest = project.getTasks().create(INT_TEST_TASK_NAME, Test.class); + intTest.setGroup(LifecycleBasePlugin.VERIFICATION_GROUP); + intTest.setDescription("Runs integration tests."); + intTest.setTestClassesDirs(intTestSourceSet.getOutput().getClassesDirs()); + intTest.setClasspath(intTestSourceSet.getRuntimeClasspath()); + intTest.shouldRunAfter(JavaPlugin.TEST_TASK_NAME); + return intTest; + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/test/autoconfigure/DocumentTestSlices.java b/buildSrc/src/main/java/org/springframework/boot/build/test/autoconfigure/DocumentTestSlices.java new file mode 100644 index 0000000000..6643b9fcf1 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/test/autoconfigure/DocumentTestSlices.java @@ -0,0 +1,129 @@ +/* + * Copyright 2012-2020 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.boot.build.test.autoconfigure; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.Reader; +import java.util.Collections; +import java.util.Enumeration; +import java.util.Properties; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; + +import org.gradle.api.Task; +import org.gradle.api.file.FileCollection; +import org.gradle.api.internal.AbstractTask; +import org.gradle.api.tasks.InputFiles; +import org.gradle.api.tasks.OutputFile; +import org.gradle.api.tasks.TaskAction; + +import org.springframework.util.ClassUtils; +import org.springframework.util.StringUtils; + +/** + * {@link Task} used to document test slices. + * + * @author Andy Wilkinson + */ +public class DocumentTestSlices extends AbstractTask { + + private FileCollection testSlices; + + private File outputFile; + + @InputFiles + public FileCollection getTestSlices() { + return this.testSlices; + } + + public void setTestSlices(FileCollection testSlices) { + this.testSlices = testSlices; + } + + @OutputFile + public File getOutputFile() { + return this.outputFile; + } + + public void setOutputFile(File outputFile) { + this.outputFile = outputFile; + } + + @TaskAction + void documentTestSlices() throws IOException { + Set testSlices = readTestSlices(); + writeTable(testSlices); + } + + @SuppressWarnings("unchecked") + private Set readTestSlices() throws IOException { + Set testSlices = new TreeSet<>(); + for (File metadataFile : this.testSlices) { + Properties metadata = new Properties(); + try (Reader reader = new FileReader(metadataFile)) { + metadata.load(reader); + } + for (String name : Collections.list((Enumeration) metadata.propertyNames())) { + testSlices.add(new TestSlice(name, + new TreeSet<>(StringUtils.commaDelimitedListToSet(metadata.getProperty(name))))); + } + } + return testSlices; + } + + private void writeTable(Set testSlices) throws IOException { + this.outputFile.getParentFile().mkdirs(); + try (PrintWriter writer = new PrintWriter(new FileWriter(this.outputFile))) { + writer.println("[cols=\"d,a\"]"); + writer.println("|==="); + writer.println("| Test slice | Imported auto-configuration"); + for (TestSlice testSlice : testSlices) { + writer.println(); + writer.printf("| `@%s`%n", testSlice.className); + writer.println("| "); + for (String importedAutoConfiguration : testSlice.importedAutoConfigurations) { + writer.printf("`%s`%n", importedAutoConfiguration); + } + } + writer.println("|==="); + } + } + + private static final class TestSlice implements Comparable { + + private final String className; + + private final SortedSet importedAutoConfigurations; + + private TestSlice(String className, SortedSet importedAutoConfigurations) { + this.className = ClassUtils.getShortName(className); + this.importedAutoConfigurations = importedAutoConfigurations; + } + + @Override + public int compareTo(TestSlice other) { + return this.className.compareTo(other.className); + } + + } + +} diff --git a/buildSrc/src/main/java/org/springframework/boot/build/test/autoconfigure/TestSliceMetadata.java b/buildSrc/src/main/java/org/springframework/boot/build/test/autoconfigure/TestSliceMetadata.java new file mode 100644 index 0000000000..1a1c5ab9de --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/boot/build/test/autoconfigure/TestSliceMetadata.java @@ -0,0 +1,172 @@ +/* + * Copyright 2012-2020 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.boot.build.test.autoconfigure; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Reader; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Properties; +import java.util.SortedSet; +import java.util.TreeSet; +import java.util.concurrent.Callable; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +import org.gradle.api.Task; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.file.FileCollection; +import org.gradle.api.internal.AbstractTask; +import org.gradle.api.tasks.OutputFile; +import org.gradle.api.tasks.SourceSet; +import org.gradle.api.tasks.TaskAction; + +import org.springframework.core.io.FileSystemResource; +import org.springframework.core.type.AnnotationMetadata; +import org.springframework.core.type.classreading.MetadataReader; +import org.springframework.core.type.classreading.MetadataReaderFactory; +import org.springframework.core.type.classreading.SimpleMetadataReaderFactory; +import org.springframework.util.StringUtils; + +/** + * A {@link Task} for generating metadata describing a project's test slices. + * + * @author Andy Wilkinson + */ +public class TestSliceMetadata extends AbstractTask { + + private SourceSet sourceSet; + + private File outputFile; + + public TestSliceMetadata() { + getInputs().dir((Callable) () -> this.sourceSet.getOutput().getResourcesDir()); + getInputs().files((Callable) () -> this.sourceSet.getOutput().getClassesDirs()); + } + + public void setSourceSet(SourceSet sourceSet) { + this.sourceSet = sourceSet; + } + + @OutputFile + public File getOutputFile() { + return this.outputFile; + } + + public void setOutputFile(File outputFile) { + this.outputFile = outputFile; + Configuration testSliceMetadata = getProject().getConfigurations().maybeCreate("testSliceMetadata"); + getProject().getArtifacts().add(testSliceMetadata.getName(), + getProject().provider((Callable) this::getOutputFile), (artifact) -> artifact.builtBy(this)); + } + + @TaskAction + void documentTestSlices() throws IOException { + Properties testSlices = readTestSlices(); + getOutputFile().getParentFile().mkdirs(); + try (FileWriter writer = new FileWriter(getOutputFile())) { + testSlices.store(writer, null); + } + } + + private Properties readTestSlices() throws IOException { + Properties testSlices = new Properties(); + try (URLClassLoader classLoader = new URLClassLoader( + StreamSupport.stream(this.sourceSet.getRuntimeClasspath().spliterator(), false).map(this::toURL) + .toArray(URL[]::new))) { + MetadataReaderFactory metadataReaderFactory = new SimpleMetadataReaderFactory(classLoader); + Properties springFactories = readSpringFactories( + new File(this.sourceSet.getOutput().getResourcesDir(), "META-INF/spring.factories")); + for (File classesDir : this.sourceSet.getOutput().getClassesDirs()) { + addTestSlices(testSlices, classesDir, metadataReaderFactory, springFactories); + } + } + return testSlices; + } + + private URL toURL(File file) { + try { + return file.toURI().toURL(); + } + catch (MalformedURLException ex) { + throw new RuntimeException(ex); + } + } + + private Properties readSpringFactories(File file) throws IOException { + Properties springFactories = new Properties(); + try (Reader in = new FileReader(file)) { + springFactories.load(in); + } + return springFactories; + } + + private void addTestSlices(Properties testSlices, File classesDir, MetadataReaderFactory metadataReaderFactory, + Properties springFactories) throws IOException { + try (Stream classes = Files.walk(classesDir.toPath())) { + classes.filter((path) -> path.toString().endsWith("Test.class")) + .map((path) -> getMetadataReader(path, metadataReaderFactory)) + .filter((metadataReader) -> metadataReader.getClassMetadata().isAnnotation()) + .forEach((metadataReader) -> addTestSlice(testSlices, springFactories, metadataReader)); + } + + } + + private MetadataReader getMetadataReader(Path path, MetadataReaderFactory metadataReaderFactory) { + try { + return metadataReaderFactory.getMetadataReader(new FileSystemResource(path)); + } + catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + private void addTestSlice(Properties testSlices, Properties springFactories, MetadataReader metadataReader) { + testSlices.setProperty(metadataReader.getClassMetadata().getClassName(), + StringUtils.collectionToCommaDelimitedString( + getImportedAutoConfiguration(springFactories, metadataReader.getAnnotationMetadata()))); + } + + private SortedSet getImportedAutoConfiguration(Properties springFactories, + AnnotationMetadata annotationMetadata) { + Stream importers = findMetaImporters(annotationMetadata); + if (annotationMetadata.isAnnotated("org.springframework.boot.autoconfigure.ImportAutoConfiguration")) { + importers = Stream.concat(importers, Stream.of(annotationMetadata.getClassName())); + } + return importers.flatMap( + (importer) -> StringUtils.commaDelimitedListToSet(springFactories.getProperty(importer)).stream()) + .collect(Collectors.toCollection(TreeSet::new)); + } + + private Stream findMetaImporters(AnnotationMetadata annotationMetadata) { + return annotationMetadata.getAnnotationTypes().stream() + .filter((annotationType) -> isAutoConfigurationImporter(annotationType, annotationMetadata)); + } + + private boolean isAutoConfigurationImporter(String annotationType, AnnotationMetadata metadata) { + return metadata.getMetaAnnotationTypes(annotationType) + .contains("org.springframework.boot.autoconfigure.ImportAutoConfiguration"); + } + +} diff --git a/buildSrc/src/main/resources/effective-bom-settings.xml b/buildSrc/src/main/resources/effective-bom-settings.xml new file mode 100644 index 0000000000..d67307453c --- /dev/null +++ b/buildSrc/src/main/resources/effective-bom-settings.xml @@ -0,0 +1,24 @@ + + localRepositoryPath + + + spring-repositories + + true + + + + spring-snapshot + https://repo.spring.io/snapshot + + true + + + + spring-milestone + https://repo.spring.io/milestone + + + + + diff --git a/buildSrc/src/test/java/org/springframework/boot/build/assertj/NodeAssert.java b/buildSrc/src/test/java/org/springframework/boot/build/assertj/NodeAssert.java new file mode 100644 index 0000000000..452fafaf6f --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/assertj/NodeAssert.java @@ -0,0 +1,87 @@ +/* + * Copyright 2012-2020 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.boot.build.assertj; + +import java.io.File; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +import org.assertj.core.api.AbstractAssert; +import org.assertj.core.api.AssertProvider; +import org.assertj.core.api.StringAssert; +import org.w3c.dom.Document; +import org.w3c.dom.Node; + +/** + * AssertJ {@link AssertProvider} for {@link Node} assertions. + * + * @author Andy Wilkinson + */ +public class NodeAssert extends AbstractAssert implements AssertProvider { + + private static final DocumentBuilderFactory FACTORY = DocumentBuilderFactory.newInstance(); + + private final XPathFactory xpathFactory = XPathFactory.newInstance(); + + private final XPath xpath = this.xpathFactory.newXPath(); + + public NodeAssert(File xmlFile) { + this(read(xmlFile)); + } + + public NodeAssert(Node actual) { + super(actual, NodeAssert.class); + } + + private static Document read(File xmlFile) { + try { + return FACTORY.newDocumentBuilder().parse(xmlFile); + } + catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + public NodeAssert nodeAtPath(String xpath) { + try { + return new NodeAssert((Node) this.xpath.evaluate(xpath, this.actual, XPathConstants.NODE)); + } + catch (XPathExpressionException ex) { + throw new RuntimeException(ex); + } + } + + public StringAssert textAtPath(String xpath) { + try { + return new StringAssert( + (String) this.xpath.evaluate(xpath + "/text()", this.actual, XPathConstants.STRING)); + } + catch (XPathExpressionException ex) { + throw new RuntimeException(ex); + } + } + + @Override + public NodeAssert assertThat() { + return this; + } + +} diff --git a/buildSrc/src/test/java/org/springframework/boot/build/bom/BomPluginIntegrationTests.java b/buildSrc/src/test/java/org/springframework/boot/build/bom/BomPluginIntegrationTests.java new file mode 100644 index 0000000000..3bd1c2bb4a --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/bom/BomPluginIntegrationTests.java @@ -0,0 +1,193 @@ +/* + * Copyright 2012-2020 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.boot.build.bom; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.Reader; +import java.util.function.Consumer; + +import org.gradle.testkit.runner.BuildResult; +import org.gradle.testkit.runner.GradleRunner; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import org.springframework.boot.build.DeployedPlugin; +import org.springframework.boot.build.assertj.NodeAssert; +import org.springframework.util.FileCopyUtils; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link BomPlugin}. + * + * @author Andy Wilkinson + */ +public class BomPluginIntegrationTests { + + private File projectDir; + + private File buildFile; + + @BeforeEach + public void setup(@TempDir File projectDir) throws IOException { + this.projectDir = projectDir; + this.buildFile = new File(this.projectDir, "build.gradle"); + } + + @Test + void libraryModulesAreIncludedInDependencyManagementOfGeneratedPom() throws IOException { + try (PrintWriter out = new PrintWriter(new FileWriter(this.buildFile))) { + out.println("plugins {"); + out.println(" id 'org.springframework.boot.bom'"); + out.println("}"); + out.println("bom {"); + out.println(" library('ActiveMQ', '5.15.10') {"); + out.println(" group('org.apache.activemq') {"); + out.println(" modules = ["); + out.println(" 'activemq-amqp',"); + out.println(" 'activemq-blueprint'"); + out.println(" ]"); + out.println(" }"); + out.println(" }"); + out.println("}"); + } + generatePom((pom) -> { + assertThat(pom).textAtPath("//properties/activemq.version").isEqualTo("5.15.10"); + NodeAssert dependency = pom.nodeAtPath("//dependencyManagement/dependencies/dependency[1]"); + assertThat(dependency).textAtPath("groupId").isEqualTo("org.apache.activemq"); + assertThat(dependency).textAtPath("artifactId").isEqualTo("activemq-amqp"); + assertThat(dependency).textAtPath("version").isEqualTo("${activemq.version}"); + assertThat(dependency).textAtPath("scope").isNullOrEmpty(); + assertThat(dependency).textAtPath("type").isNullOrEmpty(); + dependency = pom.nodeAtPath("//dependencyManagement/dependencies/dependency[2]"); + assertThat(dependency).textAtPath("groupId").isEqualTo("org.apache.activemq"); + assertThat(dependency).textAtPath("artifactId").isEqualTo("activemq-blueprint"); + assertThat(dependency).textAtPath("version").isEqualTo("${activemq.version}"); + assertThat(dependency).textAtPath("scope").isNullOrEmpty(); + assertThat(dependency).textAtPath("type").isNullOrEmpty(); + }); + } + + @Test + void libraryPluginsAreIncludedInPluginManagementOfGeneratedPom() throws IOException { + try (PrintWriter out = new PrintWriter(new FileWriter(this.buildFile))) { + out.println("plugins {"); + out.println(" id 'org.springframework.boot.bom'"); + out.println("}"); + out.println("bom {"); + out.println(" library('Flyway', '6.0.8') {"); + out.println(" group('org.flywaydb') {"); + out.println(" plugins = ["); + out.println(" 'flyway-maven-plugin'"); + out.println(" ]"); + out.println(" }"); + out.println(" }"); + out.println("}"); + } + generatePom((pom) -> { + assertThat(pom).textAtPath("//properties/flyway.version").isEqualTo("6.0.8"); + NodeAssert plugin = pom.nodeAtPath("//pluginManagement/plugins/plugin"); + assertThat(plugin).textAtPath("groupId").isEqualTo("org.flywaydb"); + assertThat(plugin).textAtPath("artifactId").isEqualTo("flyway-maven-plugin"); + assertThat(plugin).textAtPath("version").isEqualTo("${flyway.version}"); + assertThat(plugin).textAtPath("scope").isNullOrEmpty(); + assertThat(plugin).textAtPath("type").isNullOrEmpty(); + }); + } + + @Test + void libraryImportsAreIncludedInDependencyManagementOfGeneratedPom() throws Exception { + try (PrintWriter out = new PrintWriter(new FileWriter(this.buildFile))) { + out.println("plugins {"); + out.println(" id 'org.springframework.boot.bom'"); + out.println("}"); + out.println("bom {"); + out.println(" library('Jackson Bom', '2.10.0') {"); + out.println(" group('com.fasterxml.jackson') {"); + out.println(" imports = ["); + out.println(" 'jackson-bom'"); + out.println(" ]"); + out.println(" }"); + out.println(" }"); + out.println("}"); + } + generatePom((pom) -> { + assertThat(pom).textAtPath("//properties/jackson-bom.version").isEqualTo("2.10.0"); + NodeAssert dependency = pom.nodeAtPath("//dependencyManagement/dependencies/dependency"); + assertThat(dependency).textAtPath("groupId").isEqualTo("com.fasterxml.jackson"); + assertThat(dependency).textAtPath("artifactId").isEqualTo("jackson-bom"); + assertThat(dependency).textAtPath("version").isEqualTo("${jackson-bom.version}"); + assertThat(dependency).textAtPath("scope").isEqualTo("import"); + assertThat(dependency).textAtPath("type").isEqualTo("pom"); + }); + } + + @Test + void moduleExclusionsAreIncludedInDependencyManagementOfGeneratedPom() throws IOException { + try (PrintWriter out = new PrintWriter(new FileWriter(this.buildFile))) { + out.println("plugins {"); + out.println(" id 'org.springframework.boot.bom'"); + out.println("}"); + out.println("bom {"); + out.println(" library('MySQL', '8.0.18') {"); + out.println(" group('mysql') {"); + out.println(" modules = ["); + out.println(" 'mysql-connector-java' {"); + out.println(" exclude group: 'com.google.protobuf', module: 'protobuf-java'"); + out.println(" }"); + out.println(" ]"); + out.println(" }"); + out.println(" }"); + out.println("}"); + } + generatePom((pom) -> { + assertThat(pom).textAtPath("//properties/mysql.version").isEqualTo("8.0.18"); + NodeAssert dependency = pom.nodeAtPath("//dependencyManagement/dependencies/dependency"); + assertThat(dependency).textAtPath("groupId").isEqualTo("mysql"); + assertThat(dependency).textAtPath("artifactId").isEqualTo("mysql-connector-java"); + assertThat(dependency).textAtPath("version").isEqualTo("${mysql.version}"); + assertThat(dependency).textAtPath("scope").isNullOrEmpty(); + assertThat(dependency).textAtPath("type").isNullOrEmpty(); + NodeAssert exclusion = dependency.nodeAtPath("exclusions/exclusion"); + assertThat(exclusion).textAtPath("groupId").isEqualTo("com.google.protobuf"); + assertThat(exclusion).textAtPath("artifactId").isEqualTo("protobuf-java"); + }); + } + + private BuildResult runGradle(String... args) { + return GradleRunner.create().withDebug(true).withProjectDir(this.projectDir).withArguments(args) + .withPluginClasspath().build(); + } + + private void generatePom(Consumer consumer) { + runGradle(DeployedPlugin.GENERATE_POM_TASK_NAME, "-s"); + File generatedPomXml = new File(this.projectDir, "build/publications/maven/pom-default.xml"); + try (Reader reader = new FileReader(generatedPomXml)) { + System.out.println(FileCopyUtils.copyToString(reader)); + } + catch (IOException ex) { + + } + assertThat(generatedPomXml).isFile(); + consumer.accept(new NodeAssert(generatedPomXml)); + } + +} diff --git a/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/ArtifactVersionDependencyVersionTests.java b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/ArtifactVersionDependencyVersionTests.java new file mode 100644 index 0000000000..643baa2219 --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/ArtifactVersionDependencyVersionTests.java @@ -0,0 +1,119 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr.version; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link ArtifactVersionDependencyVersion}. + * + * @author Andy Wilkinson + */ +public class ArtifactVersionDependencyVersionTests { + + @Test + void parseWhenVersionIsNotAMavenVersionShouldReturnNull() { + assertThat(version("1.2.3.1")).isNull(); + } + + @Test + void parseWhenVersionIsAMavenVersionShouldReturnAVersion() { + assertThat(version("1.2.3")).isNotNull(); + } + + @Test + void isNewerThanWhenInputIsOlderMajorShouldReturnTrue() { + assertThat(version("2.1.2").isNewerThan(version("1.9.0"))).isTrue(); + } + + @Test + void isNewerThanWhenInputIsOlderMinorShouldReturnTrue() { + assertThat(version("2.1.2").isNewerThan(version("2.0.2"))).isTrue(); + } + + @Test + void isNewerThanWhenInputIsOlderPatchShouldReturnTrue() { + assertThat(version("2.1.2").isNewerThan(version("2.1.1"))).isTrue(); + } + + @Test + void isNewerThanWhenInputIsNewerMajorShouldReturnFalse() { + assertThat(version("2.1.2").isNewerThan(version("3.2.1"))).isFalse(); + } + + @Test + void isSameMajorAndNewerThanWhenMinorIsOlderShouldReturnTrue() { + assertThat(version("1.10.2").isSameMajorAndNewerThan(version("1.9.0"))).isTrue(); + } + + @Test + void isSameMajorAndNewerThanWhenMajorIsOlderShouldReturnFalse() { + assertThat(version("2.0.2").isSameMajorAndNewerThan(version("1.9.0"))).isFalse(); + } + + @Test + void isSameMajorAndNewerThanWhenPatchIsNewerShouldReturnTrue() { + assertThat(version("2.1.2").isSameMajorAndNewerThan(version("2.1.1"))).isTrue(); + } + + @Test + void isSameMajorAndNewerThanWhenMinorIsNewerShouldReturnFalse() { + assertThat(version("2.1.2").isSameMajorAndNewerThan(version("2.2.1"))).isFalse(); + } + + @Test + void isSameMajorAndNewerThanWhenMajorIsNewerShouldReturnFalse() { + assertThat(version("2.1.2").isSameMajorAndNewerThan(version("3.0.1"))).isFalse(); + } + + @Test + void isSameMinorAndNewerThanWhenPatchIsOlderShouldReturnTrue() { + assertThat(version("1.10.2").isSameMinorAndNewerThan(version("1.10.1"))).isTrue(); + } + + @Test + void isSameMinorAndNewerThanWhenMinorIsOlderShouldReturnFalse() { + assertThat(version("2.1.2").isSameMinorAndNewerThan(version("2.0.1"))).isFalse(); + } + + @Test + void isSameMinorAndNewerThanWhenVersionsAreTheSameShouldReturnFalse() { + assertThat(version("2.1.2").isSameMinorAndNewerThan(version("2.1.2"))).isFalse(); + } + + @Test + void isSameMinorAndNewerThanWhenPatchIsNewerShouldReturnFalse() { + assertThat(version("2.1.2").isSameMinorAndNewerThan(version("2.1.3"))).isFalse(); + } + + @Test + void isSameMinorAndNewerThanWhenMinorIsNewerShouldReturnFalse() { + assertThat(version("2.1.2").isSameMinorAndNewerThan(version("2.0.1"))).isFalse(); + } + + @Test + void isSameMinorAndNewerThanWhenMajorIsNewerShouldReturnFalse() { + assertThat(version("3.1.2").isSameMinorAndNewerThan(version("2.0.1"))).isFalse(); + } + + private ArtifactVersionDependencyVersion version(String version) { + return ArtifactVersionDependencyVersion.parse(version); + } + +} diff --git a/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/DependencyVersionTests.java b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/DependencyVersionTests.java new file mode 100644 index 0000000000..2e0b16d7f0 --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/DependencyVersionTests.java @@ -0,0 +1,55 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr.version; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link DependencyVersion}. + * + * @author Andy Wilkinson + */ +public class DependencyVersionTests { + + @Test + void parseWhenValidMavenVersionShouldReturnArtifactVersionDependencyVersion() { + assertThat(DependencyVersion.parse("1.2.3.Final")).isInstanceOf(ArtifactVersionDependencyVersion.class); + } + + @Test + void parseWhenReleaseTrainShouldReturnReleaseTrainDependencyVersion() { + assertThat(DependencyVersion.parse("Ingalls-SR5")).isInstanceOf(ReleaseTrainDependencyVersion.class); + } + + @Test + void parseWhenMavenLikeVersionWithNumericQualifieShouldReturnNumericQualifierDependencyVersion() { + assertThat(DependencyVersion.parse("1.2.3.4")).isInstanceOf(NumericQualifierDependencyVersion.class); + } + + @Test + void parseWhenVersionWithLeadingZeroesShouldReturnLeadingZeroesDependencyVersion() { + assertThat(DependencyVersion.parse("1.4.01")).isInstanceOf(LeadingZeroesDependencyVersion.class); + } + + @Test + void parseWhenVersionWithCombinedPatchAndQualifierShouldReturnCombinedPatchAndQualifierDependencyVersion() { + assertThat(DependencyVersion.parse("4.0.0M4")).isInstanceOf(CombinedPatchAndQualifierDependencyVersion.class); + } + +} diff --git a/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/NumericQualifierDependencyVersionTests.java b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/NumericQualifierDependencyVersionTests.java new file mode 100644 index 0000000000..5e58d3a99c --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/NumericQualifierDependencyVersionTests.java @@ -0,0 +1,54 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr.version; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link NumericQualifierDependencyVersion}. + * + * @author Andy Wilkinson + */ +public class NumericQualifierDependencyVersionTests { + + @Test + void isNewerThanOnVersionWithNumericQualifierWhenInputHasNoQualifierShouldReturnTrue() { + assertThat(version("2.9.9.20190806").isNewerThan(DependencyVersion.parse("2.9.9"))).isTrue(); + } + + @Test + void isNewerThanOnVersionWithNumericQualifierWhenInputHasOlderQualifierShouldReturnTrue() { + assertThat(version("2.9.9.20190806").isNewerThan(version("2.9.9.20190805"))).isTrue(); + } + + @Test + void isNewerThanOnVersionWithNumericQualifierWhenInputHasNewerQualifierShouldReturnFalse() { + assertThat(version("2.9.9.20190806").isNewerThan(version("2.9.9.20190807"))).isFalse(); + } + + @Test + void isNewerThanOnVersionWithNumericQualifierWhenInputHasSameQualifierShouldReturnFalse() { + assertThat(version("2.9.9.20190806").isNewerThan(version("2.9.9.20190806"))).isFalse(); + } + + private NumericQualifierDependencyVersion version(String version) { + return NumericQualifierDependencyVersion.parse(version); + } + +} diff --git a/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/ReleaseTrainDependencyVersionTests.java b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/ReleaseTrainDependencyVersionTests.java new file mode 100644 index 0000000000..6010bfd075 --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/version/ReleaseTrainDependencyVersionTests.java @@ -0,0 +1,99 @@ +/* + * Copyright 2012-2020 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.boot.build.bom.bomr.version; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link ReleaseTrainDependencyVersion}. + * + * @author Andy Wilkinson + */ +public class ReleaseTrainDependencyVersionTests { + + @Test + void parsingOfANonReleaseTrainVersionReturnsNull() { + assertThat(version("5.1.4.RELEASE")).isNull(); + } + + @Test + void parsingOfAReleaseTrainVersionReturnsVersion() { + assertThat(version("Lovelace-SR3")).isNotNull(); + } + + @Test + void isNewerThanWhenReleaseTrainIsNewerShouldReturnTrue() { + assertThat(version("Lovelace-RELEASE").isNewerThan(version("Kay-SR5"))).isTrue(); + } + + @Test + void isNewerThanWhenVersionIsNewerShouldReturnTrue() { + assertThat(version("Kay-SR10").isNewerThan(version("Kay-SR5"))).isTrue(); + } + + @Test + void isNewerThanWhenVersionIsOlderShouldReturnFalse() { + assertThat(version("Kay-RELEASE").isNewerThan(version("Kay-SR5"))).isFalse(); + } + + @Test + void isNewerThanWhenReleaseTrainIsOlderShouldReturnFalse() { + assertThat(version("Ingalls-RELEASE").isNewerThan(version("Kay-SR5"))).isFalse(); + } + + @Test + void isSameMajorAndNewerWhenWhenReleaseTrainIsNewerShouldReturnTrue() { + assertThat(version("Lovelace-RELEASE").isSameMajorAndNewerThan(version("Kay-SR5"))).isTrue(); + } + + @Test + void isSameMajorAndNewerThanWhenReleaseTrainIsOlderShouldReturnFalse() { + assertThat(version("Ingalls-RELEASE").isSameMajorAndNewerThan(version("Kay-SR5"))).isFalse(); + } + + @Test + void isSameMajorAndNewerThanWhenVersionIsNewerShouldReturnTrue() { + assertThat(version("Kay-SR6").isSameMajorAndNewerThan(version("Kay-SR5"))).isTrue(); + } + + @Test + void isSameMinorAndNewerThanWhenReleaseTrainIsNewerShouldReturnFalse() { + assertThat(version("Lovelace-RELEASE").isSameMinorAndNewerThan(version("Kay-SR5"))).isFalse(); + } + + @Test + void isSameMinorAndNewerThanWhenReleaseTrainIsTheSameAndVersionIsNewerShouldReturnTrue() { + assertThat(version("Kay-SR6").isSameMinorAndNewerThan(version("Kay-SR5"))).isTrue(); + } + + @Test + void isSameMinorAndNewerThanWhenReleaseTrainAndVersionAreTheSameShouldReturnFalse() { + assertThat(version("Kay-SR6").isSameMinorAndNewerThan(version("Kay-SR6"))).isFalse(); + } + + @Test + void isSameMinorAndNewerThanWhenReleaseTrainIsTheSameAndVersionIsOlderShouldReturnFalse() { + assertThat(version("Kay-SR6").isSameMinorAndNewerThan(version("Kay-SR7"))).isFalse(); + } + + private static ReleaseTrainDependencyVersion version(String input) { + return ReleaseTrainDependencyVersion.parse(input); + } + +} diff --git a/buildSrc/src/test/java/org/springframework/boot/build/context/properties/CompoundConfigurationTableEntryTests.java b/buildSrc/src/test/java/org/springframework/boot/build/context/properties/CompoundConfigurationTableEntryTests.java new file mode 100644 index 0000000000..2f229b93b7 --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/context/properties/CompoundConfigurationTableEntryTests.java @@ -0,0 +1,47 @@ +/* + * Copyright 2012-2020 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.boot.build.context.properties; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link CompoundConfigurationTableEntry}. + * + * @author Brian Clozel + */ +public class CompoundConfigurationTableEntryTests { + + private static String NEWLINE = System.lineSeparator(); + + @Test + void simpleProperty() { + ConfigurationProperty firstProp = new ConfigurationProperty("spring.test.first", "java.lang.String"); + ConfigurationProperty secondProp = new ConfigurationProperty("spring.test.second", "java.lang.String"); + ConfigurationProperty thirdProp = new ConfigurationProperty("spring.test.third", "java.lang.String"); + CompoundConfigurationTableEntry entry = new CompoundConfigurationTableEntry("spring.test", + "This is a description."); + entry.addConfigurationKeys(firstProp, secondProp, thirdProp); + AsciidocBuilder builder = new AsciidocBuilder(); + entry.write(builder); + assertThat(builder.toString()).isEqualTo( + "|`+spring.test.first+` +" + NEWLINE + "`+spring.test.second+` +" + NEWLINE + "`+spring.test.third+` +" + + NEWLINE + NEWLINE + "|" + NEWLINE + "|+++This is a description.+++" + NEWLINE); + } + +} diff --git a/buildSrc/src/test/java/org/springframework/boot/build/context/properties/ConfigurationTableTests.java b/buildSrc/src/test/java/org/springframework/boot/build/context/properties/ConfigurationTableTests.java new file mode 100644 index 0000000000..c757c73f16 --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/context/properties/ConfigurationTableTests.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012-2020 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.boot.build.context.properties; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link ConfigurationTable}. + * + * @author Brian Clozel + */ +public class ConfigurationTableTests { + + private static String NEWLINE = System.lineSeparator(); + + @Test + void simpleTable() { + ConfigurationTable table = new ConfigurationTable("test"); + ConfigurationProperty first = new ConfigurationProperty("spring.test.prop", "java.lang.String", "something", + "This is a description.", false); + ConfigurationProperty second = new ConfigurationProperty("spring.test.other", "java.lang.String", "other value", + "This is another description.", false); + table.addEntry(new SingleConfigurationTableEntry(first)); + table.addEntry(new SingleConfigurationTableEntry(second)); + assertThat(table.toAsciidocTable()).isEqualTo("[cols=\"1,1,2\", options=\"header\"]" + NEWLINE + "|===" + + NEWLINE + "|Key|Default Value|Description" + NEWLINE + NEWLINE + "|`+spring.test.other+`" + NEWLINE + + "|`+other value+`" + NEWLINE + "|+++This is another description.+++" + NEWLINE + NEWLINE + + "|`+spring.test.prop+`" + NEWLINE + "|`+something+`" + NEWLINE + "|+++This is a description.+++" + + NEWLINE + NEWLINE + "|===" + NEWLINE); + } + +} diff --git a/buildSrc/src/test/java/org/springframework/boot/build/context/properties/SingleConfigurationTableEntryTests.java b/buildSrc/src/test/java/org/springframework/boot/build/context/properties/SingleConfigurationTableEntryTests.java new file mode 100644 index 0000000000..615cdca6ae --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/context/properties/SingleConfigurationTableEntryTests.java @@ -0,0 +1,110 @@ +/* + * Copyright 2012-2020 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.boot.build.context.properties; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SingleConfigurationTableEntry}. + * + * @author Brian Clozel + */ +public class SingleConfigurationTableEntryTests { + + private static String NEWLINE = System.lineSeparator(); + + @Test + void simpleProperty() { + ConfigurationProperty property = new ConfigurationProperty("spring.test.prop", "java.lang.String", "something", + "This is a description.", false); + SingleConfigurationTableEntry entry = new SingleConfigurationTableEntry(property); + AsciidocBuilder builder = new AsciidocBuilder(); + entry.write(builder); + assertThat(builder.toString()).isEqualTo("|`+spring.test.prop+`" + NEWLINE + "|`+something+`" + NEWLINE + + "|+++This is a description.+++" + NEWLINE); + } + + @Test + void noDefaultValue() { + ConfigurationProperty property = new ConfigurationProperty("spring.test.prop", "java.lang.String", null, + "This is a description.", false); + SingleConfigurationTableEntry entry = new SingleConfigurationTableEntry(property); + AsciidocBuilder builder = new AsciidocBuilder(); + entry.write(builder); + assertThat(builder.toString()).isEqualTo( + "|`+spring.test.prop+`" + NEWLINE + "|" + NEWLINE + "|+++This is a description.+++" + NEWLINE); + } + + @Test + void defaultValueWithPipes() { + ConfigurationProperty property = new ConfigurationProperty("spring.test.prop", "java.lang.String", + "first|second", "This is a description.", false); + SingleConfigurationTableEntry entry = new SingleConfigurationTableEntry(property); + AsciidocBuilder builder = new AsciidocBuilder(); + entry.write(builder); + assertThat(builder.toString()).isEqualTo("|`+spring.test.prop+`" + NEWLINE + "|`+first\\|second+`" + NEWLINE + + "|+++This is a description.+++" + NEWLINE); + } + + @Test + void defaultValueWithBackslash() { + ConfigurationProperty property = new ConfigurationProperty("spring.test.prop", "java.lang.String", + "first\\second", "This is a description.", false); + SingleConfigurationTableEntry entry = new SingleConfigurationTableEntry(property); + AsciidocBuilder builder = new AsciidocBuilder(); + entry.write(builder); + assertThat(builder.toString()).isEqualTo("|`+spring.test.prop+`" + NEWLINE + "|`+first\\\\second+`" + NEWLINE + + "|+++This is a description.+++" + NEWLINE); + } + + @Test + void descriptionWithPipe() { + ConfigurationProperty property = new ConfigurationProperty("spring.test.prop", "java.lang.String", null, + "This is a description with a | pipe.", false); + SingleConfigurationTableEntry entry = new SingleConfigurationTableEntry(property); + AsciidocBuilder builder = new AsciidocBuilder(); + entry.write(builder); + assertThat(builder.toString()).isEqualTo("|`+spring.test.prop+`" + NEWLINE + "|" + NEWLINE + + "|+++This is a description with a \\| pipe.+++" + NEWLINE); + } + + @Test + void mapProperty() { + ConfigurationProperty property = new ConfigurationProperty("spring.test.prop", + "java.util.Map", null, "This is a description.", false); + SingleConfigurationTableEntry entry = new SingleConfigurationTableEntry(property); + AsciidocBuilder builder = new AsciidocBuilder(); + entry.write(builder); + assertThat(builder.toString()).isEqualTo( + "|`+spring.test.prop.*+`" + NEWLINE + "|" + NEWLINE + "|+++This is a description.+++" + NEWLINE); + } + + @Test + void listProperty() { + String[] defaultValue = new String[] { "first", "second", "third" }; + ConfigurationProperty property = new ConfigurationProperty("spring.test.prop", + "java.util.List", defaultValue, "This is a description.", false); + SingleConfigurationTableEntry entry = new SingleConfigurationTableEntry(property); + AsciidocBuilder builder = new AsciidocBuilder(); + entry.write(builder); + assertThat(builder.toString()).isEqualTo("|`+spring.test.prop+`" + NEWLINE + "|`+first," + NEWLINE + "second," + + NEWLINE + "third+`" + NEWLINE + "|+++This is a description.+++" + NEWLINE); + } + +} diff --git a/buildSrc/src/test/java/org/springframework/boot/build/log4j2/ReproduciblePluginsDatActionTests.java b/buildSrc/src/test/java/org/springframework/boot/build/log4j2/ReproduciblePluginsDatActionTests.java new file mode 100644 index 0000000000..f482f5353e --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/log4j2/ReproduciblePluginsDatActionTests.java @@ -0,0 +1,80 @@ +/* + * Copyright 2019 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.boot.build.log4j2; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Vector; + +import org.apache.logging.log4j.core.config.plugins.processor.PluginCache; +import org.apache.logging.log4j.core.config.plugins.processor.PluginEntry; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link ReproducibleLog4j2PluginsDatAction} + * + * @author Andy Wilkinson + */ +public class ReproduciblePluginsDatActionTests { + + @Test + void postProcessingOrdersCategoriesAndPlugins() throws IOException { + Path datFile = Files.createTempFile("Log4j2Plugins", "dat"); + try { + write(datFile); + PluginCache cache = new PluginCache(); + cache.loadCacheFiles(new Vector<>(Arrays.asList(datFile.toUri().toURL())).elements()); + assertThat(cache.getAllCategories().keySet()).containsExactly("one", "two"); + assertThat(cache.getCategory("one").keySet()).containsExactly("alpha", "bravo", "charlie"); + assertThat(cache.getCategory("two").keySet()).containsExactly("delta", "echo", "foxtrot"); + } + finally { + Files.delete(datFile); + } + } + + private void write(Path datFile) throws IOException { + PluginCache cache = new PluginCache(); + createCategory(cache, "two", Arrays.asList("delta", "foxtrot", "echo")); + createCategory(cache, "one", Arrays.asList("bravo", "alpha", "charlie")); + try (OutputStream output = new FileOutputStream(datFile.toFile())) { + cache.writeCache(output); + new ReproducibleLog4j2PluginsDatAction().postProcess(datFile.toFile()); + } + } + + private void createCategory(PluginCache cache, String categoryName, List entryNames) { + Map category = cache.getCategory(categoryName); + for (String entryName : entryNames) { + PluginEntry entry = new PluginEntry(); + entry.setKey(entryName); + entry.setClassName("com.example.Plugin"); + entry.setName("name"); + entry.setCategory(categoryName); + category.put(entryName, entry); + } + } + +} diff --git a/buildSrc/src/test/java/org/springframework/boot/build/mavenplugin/PluginXmlParserTests.java b/buildSrc/src/test/java/org/springframework/boot/build/mavenplugin/PluginXmlParserTests.java new file mode 100644 index 0000000000..b5a4f83820 --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/mavenplugin/PluginXmlParserTests.java @@ -0,0 +1,40 @@ +/* + * Copyright 2019 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.boot.build.mavenplugin; + +import java.io.File; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.build.mavenplugin.PluginXmlParser.Plugin; + +/** + * Tests for {@link PluginXmlParser}. + * + * @author Andy Wilkinson + */ +public class PluginXmlParserTests { + + private final PluginXmlParser parser = new PluginXmlParser(); + + @Test + void dunno() { + Plugin plugin = this.parser.parse(new File("src/test/resources/plugin.xml")); + System.out.println(plugin); + } + +} diff --git a/buildSrc/src/test/java/org/springframework/boot/build/optional/OptionalDependenciesPluginIntegrationTests.java b/buildSrc/src/test/java/org/springframework/boot/build/optional/OptionalDependenciesPluginIntegrationTests.java new file mode 100644 index 0000000000..d5585ee9e6 --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/optional/OptionalDependenciesPluginIntegrationTests.java @@ -0,0 +1,110 @@ +/* + * Copyright 2012-2020 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.boot.build.optional; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; + +import org.gradle.testkit.runner.BuildResult; +import org.gradle.testkit.runner.GradleRunner; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Integration tests for {@link OptionalDependenciesPlugin}. + * + * @author Andy Wilkinson + */ +public class OptionalDependenciesPluginIntegrationTests { + + private File projectDir; + + private File buildFile; + + @BeforeEach + public void setup(@TempDir File projectDir) throws IOException { + this.projectDir = projectDir; + this.buildFile = new File(this.projectDir, "build.gradle"); + } + + @Test + void optionalConfigurationIsCreated() throws IOException { + try (PrintWriter out = new PrintWriter(new FileWriter(this.buildFile))) { + out.println("plugins { id 'org.springframework.boot.optional-dependencies' }"); + out.println("task printConfigurations {"); + out.println(" doLast {"); + out.println(" configurations.all { println it.name }"); + out.println(" }"); + out.println("}"); + } + BuildResult buildResult = runGradle("printConfigurations"); + assertThat(buildResult.getOutput()).contains("optional"); + } + + @Test + void optionalDependenciesAreAddedToMainSourceSetsCompileClasspath() throws IOException { + optionalDependenciesAreAddedToSourceSetClasspath("main", "compileClasspath"); + } + + @Test + void optionalDependenciesAreAddedToMainSourceSetsRuntimeClasspath() throws IOException { + optionalDependenciesAreAddedToSourceSetClasspath("main", "runtimeClasspath"); + } + + @Test + void optionalDependenciesAreAddedToTestSourceSetsCompileClasspath() throws IOException { + optionalDependenciesAreAddedToSourceSetClasspath("test", "compileClasspath"); + } + + @Test + void optionalDependenciesAreAddedToTestSourceSetsRuntimeClasspath() throws IOException { + optionalDependenciesAreAddedToSourceSetClasspath("test", "runtimeClasspath"); + } + + public void optionalDependenciesAreAddedToSourceSetClasspath(String sourceSet, String classpath) + throws IOException { + try (PrintWriter out = new PrintWriter(new FileWriter(this.buildFile))) { + out.println("plugins {"); + out.println(" id 'org.springframework.boot.optional-dependencies'"); + out.println(" id 'java'"); + out.println("}"); + out.println("repositories {"); + out.println(" mavenCentral()"); + out.println("}"); + out.println("dependencies {"); + out.println(" optional 'org.springframework:spring-jcl:5.1.2.RELEASE'"); + out.println("}"); + out.println("task printClasspath {"); + out.println(" doLast {"); + out.println(" println sourceSets." + sourceSet + "." + classpath + ".files"); + out.println(" }"); + out.println("}"); + } + BuildResult buildResult = runGradle("printClasspath"); + assertThat(buildResult.getOutput()).contains("spring-jcl"); + } + + private BuildResult runGradle(String... args) { + return GradleRunner.create().withProjectDir(this.projectDir).withArguments(args).withPluginClasspath().build(); + } + +} diff --git a/buildSrc/src/test/resources/plugin.xml b/buildSrc/src/test/resources/plugin.xml new file mode 100644 index 0000000000..f9464b5a5d --- /dev/null +++ b/buildSrc/src/test/resources/plugin.xml @@ -0,0 +1,911 @@ + + + + + + Spring Boot Maven Plugin + + org.springframework.boot + spring-boot-maven-plugin + 2.2.0.GRADLE-SNAPSHOT + spring-boot + false + true + + + build-info + Generate a {@code build-info.properties} file based the content of the current +{@link MavenProject}. + false + true + false + false + false + true + generate-resources + org.springframework.boot.maven.BuildInfoMojo + java + per-lookup + once-per-session + 1.4.0 + true + + + additionalProperties + java.util.Map + false + true + Additional properties to store in the build-info.properties. Each entry is prefixed +by {@code build.} in the generated build-info.properties. + + + outputFile + java.io.File + false + true + The location of the generated build-info.properties. + + + project + org.apache.maven.project.MavenProject + true + false + The Maven project. + + + session + org.apache.maven.execution.MavenSession + true + false + The Maven session. + + + time + java.lang.String + 2.2.0 + false + true + The value used for the {@code build.time} property in a form suitable for +{@link Instant#parse(CharSequence)}. Defaults to {@code session.request.startTime}. +To disable the {@code build.time} property entirely, use {@code 'off'}. + + + + + + + + + + org.sonatype.plexus.build.incremental.BuildContext + buildContext + + + + + help + Display help information on spring-boot-maven-plugin.<br> +Call <code>mvn spring-boot:help -Ddetail=true -Dgoal=&lt;goal-name&gt;</code> to display parameter details. + false + false + false + false + false + true + org.springframework.boot.maven.HelpMojo + java + per-lookup + once-per-session + true + + + detail + boolean + false + true + If <code>true</code>, display all settable properties for each goal. + + + goal + java.lang.String + false + true + The name of the goal for which to show help. If unspecified, all goals will be displayed. + + + indentSize + int + false + true + The number of spaces per indentation level, should be positive. + + + lineLength + int + false + true + The maximum length of a display line, should be positive. + + + + ${detail} + ${goal} + ${indentSize} + ${lineLength} + + + + repackage + Repackages existing JAR and WAR archives so that they can be executed from the command +line using {@literal java -jar}. With <code>layout=NONE</code> can also be used simply +to package a JAR with nested dependencies (and no main class, so not executable). + compile+runtime + false + true + false + false + false + true + package + org.springframework.boot.maven.RepackageMojo + java + per-lookup + once-per-session + 1.0.0 + compile+runtime + true + + + attach + boolean + 1.4.0 + false + true + Attach the repackaged archive to be installed and deployed. + + + classifier + java.lang.String + 1.0.0 + false + true + Classifier to add to the repackaged archive. If not given, the main artifact will +be replaced by the repackaged archive. If given, the classifier will also be used +to determine the source archive to repackage: if an artifact with that classifier +already exists, it will be used as source and replaced. If no such artifact exists, +the main artifact will be used as source and the repackaged archive will be +attached as a supplemental artifact with that classifier. Attaching the artifact +allows to deploy it alongside to the original one, see <a href= +"https://maven.apache.org/plugins/maven-deploy-plugin/examples/deploying-with-classifiers.html" +>the Maven documentation for more details</a>. + + + embeddedLaunchScript + java.io.File + 1.3.0 + false + true + The embedded launch script to prepend to the front of the jar if it is fully +executable. If not specified the 'Spring Boot' default script will be used. + + + embeddedLaunchScriptProperties + java.util.Properties + 1.3.0 + false + true + Properties that should be expanded in the embedded launch script. + + + excludeDevtools + boolean + 1.3.0 + false + true + Exclude Spring Boot devtools from the repackaged archive. + + + excludeGroupIds + java.lang.String + 1.1.0 + false + true + Comma separated list of groupId names to exclude (exact match). + + + excludes + java.util.List + 1.1.0 + false + true + Collection of artifact definitions to exclude. The {@link Exclude} element defines +a {@code groupId} and {@code artifactId} mandatory properties and an optional +{@code classifier} property. + + + executable + boolean + 1.3.0 + false + true + Make a fully executable jar for *nix machines by prepending a launch script to the +jar. +<p> +Currently, some tools do not accept this format so you may not always be able to +use this technique. For example, {@code jar -xf} may silently fail to extract a jar +or war that has been made fully-executable. It is recommended that you only enable +this option if you intend to execute it directly, rather than running it with +{@code java -jar} or deploying it to a servlet container. + + + finalName + java.lang.String + 1.0.0 + false + false + Name of the generated archive. + + + includeSystemScope + boolean + 1.4.0 + false + true + Include system scoped dependencies. + + + includes + java.util.List + 1.2.0 + false + true + Collection of artifact definitions to include. The {@link Include} element defines +a {@code groupId} and {@code artifactId} mandatory properties and an optional +{@code classifier} property. + + + layout + org.springframework.boot.maven.RepackageMojo$LayoutType + 1.0.0 + false + true + The type of archive (which corresponds to how the dependencies are laid out inside +it). Possible values are JAR, WAR, ZIP, DIR, NONE. Defaults to a guess based on the +archive type. + + + layoutFactory + org.springframework.boot.loader.tools.LayoutFactory + 1.5.0 + false + true + The layout factory that will be used to create the executable archive if no +explicit layout is set. Alternative layouts implementations can be provided by 3rd +parties. + + + mainClass + java.lang.String + 1.0.0 + false + true + The name of the main class. If not specified the first compiled class found that +contains a 'main' method will be used. + + + outputDirectory + java.io.File + 1.0.0 + true + true + Directory containing the generated archive. + + + project + org.apache.maven.project.MavenProject + 1.0.0 + true + false + The Maven project. + + + requiresUnpack + java.util.List + 1.1.0 + false + true + A list of the libraries that must be unpacked from fat jars in order to run. +Specify each library as a {@code <dependency>} with a {@code <groupId>} and a +{@code <artifactId>} and they will be unpacked at runtime. + + + skip + boolean + 1.2.0 + false + true + Skip the execution. + + + + + ${spring-boot.repackage.excludeDevtools} + ${spring-boot.excludeGroupIds} + ${spring-boot.excludes} + + + + ${spring-boot.includes} + ${spring-boot.repackage.layout} + + + ${spring-boot.repackage.skip} + + + + org.apache.maven.project.MavenProjectHelper + projectHelper + + + + + run + Run an executable archive application. + test + false + true + false + false + false + true + validate + test-compile + org.springframework.boot.maven.RunMojo + java + per-lookup + once-per-session + 1.0.0 + false + + + addResources + boolean + 1.0.0 + false + true + Add maven resources to the classpath directly, this allows live in-place editing of +resources. Duplicate resources are removed from {@code target/classes} to prevent +them to appear twice if {@code ClassLoader.getResources()} is called. Please +consider adding {@code spring-boot-devtools} to your project instead as it provides +this feature and many more. + + + agent + java.io.File[] + 1.0.0 + since 2.2.0 in favor of {@code agents} + false + true + Path to agent jar. NOTE: a forked process is required to use this feature. + + + agents + java.io.File[] + 2.2.0 + false + true + Path to agent jars. NOTE: a forked process is required to use this feature. + + + arguments + java.lang.String[] + 1.0.0 + false + true + Arguments that should be passed to the application. On command line use commas to +separate multiple arguments. + + + classesDirectory + java.io.File + 1.0.0 + true + true + Directory containing the classes and resource files that should be packaged into +the archive. + + + environmentVariables + java.util.Map + 2.1.0 + false + true + List of Environment variables that should be associated with the forked process +used to run the application. NOTE: a forked process is required to use this +feature. + + + excludeGroupIds + java.lang.String + 1.1.0 + false + true + Comma separated list of groupId names to exclude (exact match). + + + excludes + java.util.List + 1.1.0 + false + true + Collection of artifact definitions to exclude. The {@link Exclude} element defines +a {@code groupId} and {@code artifactId} mandatory properties and an optional +{@code classifier} property. + + + folders + java.lang.String[] + 1.0.0 + false + true + Additional folders besides the classes directory that should be added to the +classpath. + + + fork + boolean + 1.2.0 + false + true + Flag to indicate if the run processes should be forked. Disabling forking will +disable some features such as an agent, custom JVM arguments, devtools or +specifying the working directory to use. + + + includes + java.util.List + 1.2.0 + false + true + Collection of artifact definitions to include. The {@link Include} element defines +a {@code groupId} and {@code artifactId} mandatory properties and an optional +{@code classifier} property. + + + jvmArguments + java.lang.String + 1.1.0 + false + true + JVM arguments that should be associated with the forked process used to run the +application. On command line, make sure to wrap multiple values between quotes. +NOTE: a forked process is required to use this feature. + + + mainClass + java.lang.String + 1.0.0 + false + true + The name of the main class. If not specified the first compiled class found that +contains a 'main' method will be used. + + + noverify + boolean + 1.0.0 + false + true + Flag to say that the agent requires -noverify. + + + optimizedLaunch + boolean + 2.2.0 + false + true + Whether the JVM's launch should be optimized. + + + profiles + java.lang.String[] + 1.3.0 + false + true + The spring profiles to activate. Convenience shortcut of specifying the +'spring.profiles.active' argument. On command line use commas to separate multiple +profiles. + + + project + org.apache.maven.project.MavenProject + 1.0.0 + true + false + The Maven project. + + + skip + boolean + 1.3.2 + false + true + Skip the execution. + + + systemPropertyVariables + java.util.Map + 2.1.0 + false + true + List of JVM system properties to pass to the process. NOTE: a forked process is +required to use this feature. + + + useTestClasspath + java.lang.Boolean + 1.3.0 + false + true + Flag to include the test classpath when running. + + + workingDirectory + java.io.File + 1.5.0 + false + true + Current working directory to use for the application. If not specified, basedir +will be used. NOTE: a forked process is required to use this feature. + + + + ${spring-boot.run.addResources} + ${spring-boot.run.agent} + ${spring-boot.run.agents} + ${spring-boot.run.arguments} + + ${spring-boot.excludeGroupIds} + ${spring-boot.excludes} + ${spring-boot.run.folders} + ${spring-boot.run.fork} + ${spring-boot.includes} + ${spring-boot.run.jvmArguments} + ${spring-boot.run.main-class} + ${spring-boot.run.noverify} + ${spring-boot.run.optimizedLaunch} + ${spring-boot.run.profiles} + + ${spring-boot.run.skip} + ${spring-boot.run.useTestClasspath} + ${spring-boot.run.workingDirectory} + + + + start + Start a spring application. Contrary to the {@code run} goal, this does not block and +allows other goal to operate on the application. This goal is typically used in +integration test scenario where the application is started before a test suite and +stopped after. + test + false + true + false + false + false + true + pre-integration-test + org.springframework.boot.maven.StartMojo + java + per-lookup + once-per-session + 1.3.0 + false + + + addResources + boolean + 1.0.0 + false + true + Add maven resources to the classpath directly, this allows live in-place editing of +resources. Duplicate resources are removed from {@code target/classes} to prevent +them to appear twice if {@code ClassLoader.getResources()} is called. Please +consider adding {@code spring-boot-devtools} to your project instead as it provides +this feature and many more. + + + agent + java.io.File[] + 1.0.0 + since 2.2.0 in favor of {@code agents} + false + true + Path to agent jar. NOTE: a forked process is required to use this feature. + + + agents + java.io.File[] + 2.2.0 + false + true + Path to agent jars. NOTE: a forked process is required to use this feature. + + + arguments + java.lang.String[] + 1.0.0 + false + true + Arguments that should be passed to the application. On command line use commas to +separate multiple arguments. + + + classesDirectory + java.io.File + 1.0.0 + true + true + Directory containing the classes and resource files that should be packaged into +the archive. + + + environmentVariables + java.util.Map + 2.1.0 + false + true + List of Environment variables that should be associated with the forked process +used to run the application. NOTE: a forked process is required to use this +feature. + + + excludeGroupIds + java.lang.String + 1.1.0 + false + true + Comma separated list of groupId names to exclude (exact match). + + + excludes + java.util.List + 1.1.0 + false + true + Collection of artifact definitions to exclude. The {@link Exclude} element defines +a {@code groupId} and {@code artifactId} mandatory properties and an optional +{@code classifier} property. + + + folders + java.lang.String[] + 1.0.0 + false + true + Additional folders besides the classes directory that should be added to the +classpath. + + + fork + boolean + 1.2.0 + false + true + Flag to indicate if the run processes should be forked. Disabling forking will +disable some features such as an agent, custom JVM arguments, devtools or +specifying the working directory to use. + + + includes + java.util.List + 1.2.0 + false + true + Collection of artifact definitions to include. The {@link Include} element defines +a {@code groupId} and {@code artifactId} mandatory properties and an optional +{@code classifier} property. + + + jmxName + java.lang.String + false + true + The JMX name of the automatically deployed MBean managing the lifecycle of the +spring application. + + + jmxPort + int + false + true + The port to use to expose the platform MBeanServer if the application is forked. + + + jvmArguments + java.lang.String + 1.1.0 + false + true + JVM arguments that should be associated with the forked process used to run the +application. On command line, make sure to wrap multiple values between quotes. +NOTE: a forked process is required to use this feature. + + + mainClass + java.lang.String + 1.0.0 + false + true + The name of the main class. If not specified the first compiled class found that +contains a 'main' method will be used. + + + maxAttempts + int + false + true + The maximum number of attempts to check if the spring application is ready. +Combined with the "wait" argument, this gives a global timeout value (30 sec by +default) + + + noverify + boolean + 1.0.0 + false + true + Flag to say that the agent requires -noverify. + + + profiles + java.lang.String[] + 1.3.0 + false + true + The spring profiles to activate. Convenience shortcut of specifying the +'spring.profiles.active' argument. On command line use commas to separate multiple +profiles. + + + project + org.apache.maven.project.MavenProject + 1.0.0 + true + false + The Maven project. + + + skip + boolean + 1.3.2 + false + true + Skip the execution. + + + systemPropertyVariables + java.util.Map + 2.1.0 + false + true + List of JVM system properties to pass to the process. NOTE: a forked process is +required to use this feature. + + + useTestClasspath + java.lang.Boolean + 1.3.0 + false + true + Flag to include the test classpath when running. + + + wait + long + false + true + The number of milli-seconds to wait between each attempt to check if the spring +application is ready. + + + workingDirectory + java.io.File + 1.5.0 + false + true + Current working directory to use for the application. If not specified, basedir +will be used. NOTE: a forked process is required to use this feature. + + + + ${spring-boot.run.addResources} + ${spring-boot.run.agent} + ${spring-boot.run.agents} + ${spring-boot.run.arguments} + + ${spring-boot.excludeGroupIds} + ${spring-boot.excludes} + ${spring-boot.run.folders} + ${spring-boot.run.fork} + ${spring-boot.includes} + ${spring-boot.run.jvmArguments} + ${spring-boot.run.main-class} + ${spring-boot.run.noverify} + ${spring-boot.run.profiles} + + ${spring-boot.run.skip} + ${spring-boot.run.useTestClasspath} + ${spring-boot.run.workingDirectory} + + + + stop + Stop a spring application that has been started by the "start" goal. Typically invoked +once a test suite has completed. + false + true + false + false + false + true + post-integration-test + org.springframework.boot.maven.StopMojo + java + per-lookup + once-per-session + 1.3.0 + false + + + fork + java.lang.Boolean + 1.3.0 + false + true + Flag to indicate if process to stop was forked. By default, the value is inherited +from the {@link MavenProject}. If it is set, it must match the value used to +{@link StartMojo start} the process. + + + jmxName + java.lang.String + false + true + The JMX name of the automatically deployed MBean managing the lifecycle of the +application. + + + jmxPort + int + false + true + The port to use to lookup the platform MBeanServer if the application has been +forked. + + + project + org.apache.maven.project.MavenProject + 1.4.1 + true + false + The Maven project. + + + skip + boolean + 1.3.2 + false + true + Skip the execution. + + + + ${spring-boot.stop.fork} + + ${spring-boot.stop.skip} + + + + + diff --git a/ci/pipeline.yml b/ci/pipeline.yml index 73131464ca..e2aeb3871f 100644 --- a/ci/pipeline.yml +++ b/ci/pipeline.yml @@ -3,7 +3,7 @@ resource_types: type: docker-image source: repository: springio/artifactory-resource - tag: 0.0.10 + tag: 0.0.11-SNAPSHOT - name: pull-request type: docker-image source: @@ -209,19 +209,9 @@ jobs: timeout: ((task-timeout)) image: spring-boot-ci-image file: git-repo/ci/tasks/build-project.yml - - in_parallel: - - task: build-smoke-tests - timeout: ((task-timeout)) - image: spring-boot-ci-image - file: git-repo/ci/tasks/build-smoke-tests.yml - - task: build-integration-tests - timeout: ((task-timeout)) - image: spring-boot-ci-image - file: git-repo/ci/tasks/build-integration-tests.yml - - task: build-deployment-tests - timeout: ((task-timeout)) - image: spring-boot-ci-image - file: git-repo/ci/tasks/build-deployment-tests.yml + params: + GRADLE_ENTERPRISE_CACHE_USERNAME: ((gradle-enterprise-cache-username)) + GRADLE_ENTERPRISE_CACHE_PASSWORD: ((gradle-enterprise-cache-password)) on_failure: do: - put: repo-status-build @@ -241,16 +231,15 @@ jobs: build_uri: "https://ci.spring.io/teams/${BUILD_TEAM_NAME}/pipelines/${BUILD_PIPELINE_NAME}/jobs/${BUILD_JOB_NAME}/builds/${BUILD_NAME}" build_number: "${BUILD_PIPELINE_NAME}-${BUILD_JOB_NAME}-${BUILD_NAME}" disable_checksum_uploads: true - exclude: - - "**/*.effective-pom" - - "**/spring-boot-configuration-docs/**" - - "**/spring-boot-test-support/**" + threads: 8 artifact_set: - include: - "/**/spring-boot-docs-*.zip" properties: "zip.type": "docs" "zip.deployed": "false" + get_params: + threads: 8 on_failure: do: - put: slack-alert @@ -283,19 +272,6 @@ jobs: timeout: ((task-timeout)) image: spring-boot-ci-image file: git-repo/ci/tasks/build-pr-project.yml - - in_parallel: - - task: build-smoke-tests - timeout: ((task-timeout)) - image: spring-boot-ci-image - file: git-repo/ci/tasks/build-smoke-tests.yml - - task: build-integration-tests - timeout: ((task-timeout)) - image: spring-boot-ci-image - file: git-repo/ci/tasks/build-integration-tests.yml - - task: build-deployment-tests - timeout: ((task-timeout)) - image: spring-boot-ci-image - file: git-repo/ci/tasks/build-deployment-tests.yml on_success: put: git-pull-request params: @@ -321,19 +297,9 @@ jobs: timeout: ((task-timeout)) image: spring-boot-jdk11-ci-image file: git-repo/ci/tasks/build-project.yml - - in_parallel: - - task: build-smoke-tests - timeout: ((task-timeout)) - image: spring-boot-jdk11-ci-image - file: git-repo/ci/tasks/build-smoke-tests.yml - - task: build-integration-tests - timeout: ((task-timeout)) - image: spring-boot-jdk11-ci-image - file: git-repo/ci/tasks/build-integration-tests.yml - - task: build-deployment-tests - timeout: ((task-timeout)) - image: spring-boot-jdk11-ci-image - file: git-repo/ci/tasks/build-deployment-tests.yml + params: + GRADLE_ENTERPRISE_CACHE_USERNAME: ((gradle-enterprise-cache-username)) + GRADLE_ENTERPRISE_CACHE_PASSWORD: ((gradle-enterprise-cache-password)) on_failure: do: - put: repo-status-jdk11-build @@ -362,24 +328,14 @@ jobs: - put: repo-status-jdk13-build params: { state: "pending", commit: "git-repo" } - do: - - task: build-project - privileged: true - timeout: ((task-timeout)) - image: spring-boot-jdk13-ci-image - file: git-repo/ci/tasks/build-project.yml - - in_parallel: - - task: build-smoke-tests - timeout: ((task-timeout)) - image: spring-boot-jdk13-ci-image - file: git-repo/ci/tasks/build-smoke-tests.yml - - task: build-integration-tests - timeout: ((task-timeout)) - image: spring-boot-jdk13-ci-image - file: git-repo/ci/tasks/build-integration-tests.yml - - task: build-deployment-tests - timeout: ((task-timeout)) - image: spring-boot-jdk13-ci-image - file: git-repo/ci/tasks/build-deployment-tests.yml + - task: build-project + privileged: true + timeout: ((task-timeout)) + image: spring-boot-jdk13-ci-image + file: git-repo/ci/tasks/build-project.yml + params: + GRADLE_ENTERPRISE_CACHE_USERNAME: ((gradle-enterprise-cache-username)) + GRADLE_ENTERPRISE_CACHE_PASSWORD: ((gradle-enterprise-cache-password)) on_failure: do: - put: repo-status-jdk13-build @@ -412,6 +368,9 @@ jobs: tags: - WIN64 timeout: ((task-timeout)) + params: + GRADLE_ENTERPRISE_CACHE_USERNAME: ((gradle-enterprise-cache-username)) + GRADLE_ENTERPRISE_CACHE_PASSWORD: ((gradle-enterprise-cache-password)) on_failure: do: - put: slack-alert @@ -437,6 +396,8 @@ jobs: file: git-repo/ci/tasks/stage.yml params: RELEASE_TYPE: M + GRADLE_ENTERPRISE_CACHE_USERNAME: ((gradle-enterprise-cache-username)) + GRADLE_ENTERPRISE_CACHE_PASSWORD: ((gradle-enterprise-cache-password)) - put: artifactory-repo params: <<: *artifactory-params @@ -455,6 +416,8 @@ jobs: file: git-repo/ci/tasks/stage.yml params: RELEASE_TYPE: RC + GRADLE_ENTERPRISE_CACHE_USERNAME: ((gradle-enterprise-cache-username)) + GRADLE_ENTERPRISE_CACHE_PASSWORD: ((gradle-enterprise-cache-password)) - put: artifactory-repo params: <<: *artifactory-params @@ -473,6 +436,8 @@ jobs: file: git-repo/ci/tasks/stage.yml params: RELEASE_TYPE: RELEASE + GRADLE_ENTERPRISE_CACHE_USERNAME: ((gradle-enterprise-cache-username)) + GRADLE_ENTERPRISE_CACHE_PASSWORD: ((gradle-enterprise-cache-password)) - put: artifactory-repo params: <<: *artifactory-params diff --git a/ci/scripts/build-deployment-tests.sh b/ci/scripts/build-deployment-tests.sh deleted file mode 100755 index c93fd09008..0000000000 --- a/ci/scripts/build-deployment-tests.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -set -e - -source $(dirname $0)/common.sh -repository=$(pwd)/distribution-repository - -pushd git-repo > /dev/null -run_maven -f spring-boot-tests/spring-boot-deployment-tests/pom.xml clean install -U -Dfull -Drepository=file://${repository} -popd > /dev/null diff --git a/ci/scripts/build-integration-tests.sh b/ci/scripts/build-integration-tests.sh deleted file mode 100755 index 953eaebb1c..0000000000 --- a/ci/scripts/build-integration-tests.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -set -e - -source $(dirname $0)/common.sh -repository=$(pwd)/distribution-repository - -pushd git-repo > /dev/null -run_maven -f spring-boot-tests/spring-boot-integration-tests/pom.xml clean install -U -Dfull -Drepository=file://${repository} -popd > /dev/null diff --git a/ci/scripts/build-project-windows.bat b/ci/scripts/build-project-windows.bat index efade5d1ac..aa8b62e1ab 100755 --- a/ci/scripts/build-project-windows.bat +++ b/ci/scripts/build-project-windows.bat @@ -1,6 +1,4 @@ SET "JAVA_HOME=C:\opt\jdk-8" SET PATH=%PATH%;C:\Program Files\Git\usr\bin cd git-repo - -echo ".\mvnw clean install" > build.log -.\mvnw clean install -U >> build.log 2>&1 || (sleep 1 && tail -n 3000 build.log && exit 1) \ No newline at end of file +.\gradlew --no-daemon --max-workers=4 build diff --git a/ci/scripts/build-project.sh b/ci/scripts/build-project.sh index da3c44e472..767884cbc9 100755 --- a/ci/scripts/build-project.sh +++ b/ci/scripts/build-project.sh @@ -5,6 +5,5 @@ source $(dirname $0)/common.sh repository=$(pwd)/distribution-repository pushd git-repo > /dev/null -run_maven -N clean verify -run_maven -f spring-boot-project/pom.xml clean deploy -U -Dfull -DaltDeploymentRepository=distribution::default::file://${repository} +./gradlew --no-daemon --max-workers=4 -PdeploymentRepository=${repository} build publishAllPublicationsToDeploymentRepository popd > /dev/null diff --git a/ci/scripts/build-smoke-tests.sh b/ci/scripts/build-smoke-tests.sh deleted file mode 100755 index cfb839c0ef..0000000000 --- a/ci/scripts/build-smoke-tests.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -set -e - -source $(dirname $0)/common.sh -repository=$(pwd)/distribution-repository - -pushd git-repo > /dev/null -run_maven -f spring-boot-tests/spring-boot-smoke-tests/pom.xml clean install -U -Dfull -Drepository=file://${repository} -popd > /dev/null diff --git a/ci/scripts/stage.sh b/ci/scripts/stage.sh index 2ff3a71bb3..79aa2d5846 100755 --- a/ci/scripts/stage.sh +++ b/ci/scripts/stage.sh @@ -12,7 +12,7 @@ git clone git-repo stage-git-repo > /dev/null pushd stage-git-repo > /dev/null -snapshotVersion=$( get_revision_from_pom ) +snapshotVersion=$( awk -F '=' '$1 == "version" { print $2 }' gradle.properties ) if [[ $RELEASE_TYPE = "M" ]]; then stageVersion=$( get_next_milestone_release $snapshotVersion) nextVersion=$snapshotVersion @@ -27,23 +27,20 @@ else fi echo "Staging $stageVersion (next version will be $nextVersion)" +sed -i "s/version=$snapshotVersion/version=$stageVersion/" gradle.properties -set_revision_to_pom "$stageVersion" git config user.name "Spring Buildmaster" > /dev/null git config user.email "buildmaster@springframework.org" > /dev/null -git add pom.xml > /dev/null +git add gradle.properties > /dev/null git commit -m"Release v$stageVersion" > /dev/null git tag -a "v$stageVersion" -m"Release v$stageVersion" > /dev/null -run_maven -f spring-boot-project/pom.xml clean deploy -U -Dfull -DaltDeploymentRepository=distribution::default::file://${repository} -run_maven -f spring-boot-tests/spring-boot-smoke-tests/pom.xml clean install -U -Dfull -Drepository=file://${repository} -run_maven -f spring-boot-tests/spring-boot-integration-tests/pom.xml clean install -U -Dfull -Drepository=file://${repository} -run_maven -f spring-boot-tests/spring-boot-deployment-tests/pom.xml clean install -U -Dfull -Drepository=file://${repository} +./gradlew --no-daemon --max-workers=4 -PdeploymentRepository=${repository} build publishAllPublicationsToDeploymentRepository git reset --hard HEAD^ > /dev/null if [[ $nextVersion != $snapshotVersion ]]; then echo "Setting next development version (v$nextVersion)" - set_revision_to_pom "$nextVersion" + sed -i "s/version=$snapshotVersion/version=$nextVersion/" gradle.properties git add pom.xml > /dev/null git commit -m"Next development version (v$nextVersion)" > /dev/null fi; diff --git a/ci/tasks/build-deployment-tests.yml b/ci/tasks/build-deployment-tests.yml deleted file mode 100644 index e45a4c2a30..0000000000 --- a/ci/tasks/build-deployment-tests.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- -platform: linux -inputs: -- name: git-repo -- name: distribution-repository -caches: -- path: maven -- path: gradle -run: - path: git-repo/ci/scripts/build-deployment-tests.sh diff --git a/ci/tasks/build-integration-tests.yml b/ci/tasks/build-integration-tests.yml deleted file mode 100644 index bc96aa6cef..0000000000 --- a/ci/tasks/build-integration-tests.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- -platform: linux -inputs: -- name: git-repo -- name: distribution-repository -caches: -- path: maven -- path: gradle -run: - path: git-repo/ci/scripts/build-integration-tests.sh diff --git a/ci/tasks/build-pr-project.yml b/ci/tasks/build-pr-project.yml index b4576a4849..c3dbfc8c05 100644 --- a/ci/tasks/build-pr-project.yml +++ b/ci/tasks/build-pr-project.yml @@ -7,5 +7,8 @@ outputs: caches: - path: maven - path: gradle +params: + CI: true + GRADLE_ENTERPRISE_URL: https://ge.spring.io run: path: git-repo/ci/scripts/build-project.sh diff --git a/ci/tasks/build-project.yml b/ci/tasks/build-project.yml index 50e222c7d2..a22b6f5d9d 100644 --- a/ci/tasks/build-project.yml +++ b/ci/tasks/build-project.yml @@ -8,6 +8,11 @@ caches: - path: maven - path: gradle - path: embedmongo +params: + CI: true + GRADLE_ENTERPRISE_CACHE_USERNAME: + GRADLE_ENTERPRISE_CACHE_PASSWORD: + GRADLE_ENTERPRISE_URL: https://ge.spring.io run: path: bash args: @@ -16,4 +21,3 @@ run: source /docker-lib.sh start_docker ${PWD}/git-repo/ci/scripts/build-project.sh - diff --git a/ci/tasks/build-smoke-tests.yml b/ci/tasks/build-smoke-tests.yml deleted file mode 100644 index a38dfb2ef9..0000000000 --- a/ci/tasks/build-smoke-tests.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- -platform: linux -inputs: -- name: git-repo -- name: distribution-repository -caches: -- path: maven -- path: gradle -run: - path: git-repo/ci/scripts/build-smoke-tests.sh diff --git a/ci/tasks/stage.yml b/ci/tasks/stage.yml index f486313ae9..dd21db74f8 100644 --- a/ci/tasks/stage.yml +++ b/ci/tasks/stage.yml @@ -7,6 +7,10 @@ outputs: - name: distribution-repository params: RELEASE_TYPE: + CI: true + GRADLE_ENTERPRISE_CACHE_USERNAME: + GRADLE_ENTERPRISE_CACHE_PASSWORD: + GRADLE_ENTERPRISE_URL: https://ge.spring.io caches: - path: maven - path: gradle diff --git a/eclipse/spring-boot-project.setup b/eclipse/spring-boot-project.setup index 79100f5284..2048d3b1bd 100644 --- a/eclipse/spring-boot-project.setup +++ b/eclipse/spring-boot-project.setup @@ -4,13 +4,12 @@ xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdt="http://www.eclipse.org/oomph/setup/jdt/1.0" - xmlns:maven="http://www.eclipse.org/oomph/setup/maven/1.0" xmlns:predicates="http://www.eclipse.org/oomph/predicates/1.0" xmlns:setup="http://www.eclipse.org/oomph/setup/1.0" xmlns:setup.p2="http://www.eclipse.org/oomph/setup/p2/1.0" xmlns:setup.workingsets="http://www.eclipse.org/oomph/setup/workingsets/1.0" xmlns:workingsets="http://www.eclipse.org/oomph/workingsets/1.0" - xsi:schemaLocation="http://www.eclipse.org/oomph/setup/jdt/1.0 https://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/models/JDT.ecore http://www.eclipse.org/oomph/setup/maven/1.0 https://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/models/Maven.ecore http://www.eclipse.org/oomph/predicates/1.0 https://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/models/Predicates.ecore http://www.eclipse.org/oomph/setup/workingsets/1.0 https://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/models/SetupWorkingSets.ecore http://www.eclipse.org/oomph/workingsets/1.0 https://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/models/WorkingSets.ecore" + xsi:schemaLocation="http://www.eclipse.org/oomph/setup/jdt/1.0 https://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/models/JDT.ecore http://www.eclipse.org/oomph/predicates/1.0 https://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/models/Predicates.ecore http://www.eclipse.org/oomph/setup/workingsets/1.0 https://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/models/SetupWorkingSets.ecore http://www.eclipse.org/oomph/workingsets/1.0 https://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/models/WorkingSets.ecore" name="spring.boot.2.3.x" label="Spring Boot 2.3.x"> - - - - spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin - - - search) { + def query = search.collect { name, value -> + "search.names=${encodeURL(name)}&search.values=${encodeURL(value)}" + }.join('&') + + "$gradleEnterprise.buildScan.server/scans?$query" +} + +String encodeURL(String url) { + URLEncoder.encode(url, 'UTF-8') +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..cc4fdc293d0e50b0ad9b65c16e7ddd1db2f6025b GIT binary patch literal 58702 zcma&OV~}W3vL#%;<*Hk@ZQHhO+qTVHwr$(CZQFL$+?np4n10i5zVAmKMC6WrGGd+F zD|4@NHj-D$z)bJV;MYNJ&!D%)v-fQ%q0JG$_z5GVUJTPg0MHPf1TvicY#6DXYBBQ4M`$iC~gA;06+%@0HFQPLj-JXogAJ1j+fRqw^4M` zcW^RxAfl%+w9SiS>QwBUTAfuFAjPXc2DHf6*sr+V+jLQj^m@DQgHTPmAb@F z8%GyCfcQkhWWlT31%4$PtV4tV*LI?J#C4orYI~WU(cSR{aEs^ycxY`1>j1po>yDMi zh4W$pMaecV*mCsOsPLxQ#Xc!RXhpXy*p3S2Hl8t}H7x#p5V6G5va4jV;5^S^+>+x&#zzv4!R}wB;)TyU zE_N~}nN>DTG+uZns%_eI=DL1E#<--Sccx30gvMT}^eu`2-u|{qQZ58(rA2aBYE*ZD zm|*12zg*@J$n|tbH%Mp|d|O9W%VT~xG})R=Ld5z<(z%DOO6=MF3Xh-aF%9Hf$?1N9%8Pkev{wun$jZ2 z^i*EhRt8Ve<7`Wyz~iMZDye+XVn}O%qbhV`wHL+%P+n)K&-UMuZw^RRfeQ)%K=k*m zq5l7mf`4K_WkV5B73~MxajljrjGiJqpiV#>0FkyyrB)@HY!;Ln(7JJ*W(>d5#^ubU zVAkTMs*CHzzvUa^nRu0*f-(ek+VZw+@P~}a;;(K=|!9Mhv(~y-mlW);J zb&bB=vySHG`u?j&_6dh^*se*l_B3avjlE|!!Cb0pXyEXRbLy*@WEQ4|)M<`p8Q!rfDJ2RI!u1hPzNjy&)(kcY~GaD6?)7#dCbm`NFh?Y_g$#!+Qrie7%<7P}<-+W@{sxi4JYI{iY zk0(>m$DxOI=~-&eXf2bfh^&(U@o)>(iA1_wJ%B(+nFH+ceib%HEck32QL=J(BNFh`f>St1%llF8chX7#cp*;z}& zcTeXkwsXhf+e;##!FS2yi=2cChcYfzm$wQJ z9%4kAq)wLHf5wfcj!A|xDsAiAOHRzf*)Z-|daN9y5jK-*R{Q0?xaSX-3m|WeuZ`BJ z>eTi@uQ{OGSDIJ#Iu@JPtOy!C?q)g*6SHORg)eAJGh8b-I*X_+xNqZ|OXEsQ-RWte ze`zjjeV9PpE3ac2za+Rs=PA;%QZ>T{x(TRzwWLp_X^2yC-DOEMUy5So!npzL&-@}u z#>uK#&`i&c%J$!bsntEJhY@rF(>6eY;6RoI5Qkn!&<80X5+1(x$T|wR-ad?4N1N^a0)nBj#&EkVvQ?I_+8t*%l#VK&I?uo$ERI1HMu4P2rLMeH%m3 zZ|HA^*O^dA$gb$`Cw;z9?G?m3@nH6TNYJ04Fd-M2wp8@(;vAvJ ztFoni)BLwncQ3@cO*^+6u;(&D<;N;RKb)_NQ_Qu&?@h3MWvo>6FHG%%*smTwj3;dG zQJnT7Wb?4!XmV^>N@ZkA7Jv9kAfD-gCHu2i+!A!}y98SO><8g}t;1JOOxj>#l zM!?y|j5fR3WY2(&_HSGjgMa?Zif<M@d8W z)4>Ptm@zj|xX=bbt$=j}@a_s|xdp6-tRlq6D|xb_;`9oJlkYF1AH%?Pzv$eIAogMi zf(_H*5t({Arfs5XAPj46pjiudQw?dulW-=OUqBVa)OW9E;^R+NDr&LES&m_nmP>Ga zPf)7_&Gn(3v1qu_a^qW9w4#XIEfgiHOQ(LDi=E&(-DcUSfuQE0`ULsRvS}fpS@<)3 z|CbQSi49rU{<4|XU;kiV|C7}Gld$}Yh5YXjg^W$~ovobybuZ^&YwBR^=qP3G=wxhT z?C_5Trbu~95mOoIXUmEOY646_j4ZL)ubCM{qFkl1u*%xs%#18a4!(*b<&edy<8t2w z_zUxWS5fypUp9ue+eswoJSyv*J&=*3;2;q9U?j>n^q?)}c8+}4Ns8oToBJgD;Ug=y zOa0>{VFrLJutjR{PJmm(P9lPzoPi{K!I{l)pGwDy59p-uxHB9I&7zl11lkCu(}*A< zh492AmxsgwEondBpB^{`I*L&Ut40fjM^JS8VdAWQMlwc>_RUM5|Mjes!36DGqW`xs z4tU4`CpOk|vew8!(L}fEvv5&-3#GqZ(#1EZF4ekDQ@y*$tMDEeG?nOUiS-KXG=rAZ zHUDlMo@X&yzo1TdE6b6!s#f{*45V-T3`e2)w5Ra3l>JWf46`v?Y6B&7*1$eS4M(3% z9C~G@N@RXm)8~EXL*9IObA+PwD)`%64fON_8}&pqjrg|2LmP{W^<0@W`9s^*i#F}V;E8~`-}(4@R4kz?t(RjA;y-r%s^=)15%C> zbF;NZET~nybEsmUr8sH^Hgq^xc^n$ZP=GcZ!-X-Go7J4nByj8%?aQ`c{88;p15Kf>|0h+5BLkM&@KI-(flp^npO3MC~W@Uyjv* z6Hu!4#(NtZJ0*;_{8^xcLrC4-zK$BVo7S5V=eg?R8P;BOpK3Xwms+Jt-8R6us zf_rUHFYHn~lu!)U$e$#%UBz7d8YS;mq}xx$T1PIi=4={c-_cY6OVc<=){mOVn>~J$ zW*2PB%*40eE^c+d=PP7J@bqIX_h4u6b6#W|ir<;IlR`#s`Q*_Z8Q?*s_&emuu8D;NSiPX9mK?>$CwcbjhCuv zO&u(0)@}8nZe=Fl*0uMri02oYDjs#g$OHCZ6oTXV2Y0TrZ}+o%{%i)OAJBj2xHC|F5o+`Qmq`$`2EaL=uePwq%k<;6S2n=w%_9vj$8NO|{` zTEg*tK8PU#DnQ#dQ2mMJaaL|HV;BCn?eQ%d0vY@S7Pu@7 zsf5u`T=bL7NfyYO?K^PR_|jap@K|qQ zmO8CK+&O3fzgEnp2|_=^K9ln~QhxjgMM>EQqY@k@@#np@FnZq|C{EyEP7^NurUm0q zW5rKmiy%__KE>YItATyMhE({0%ve10la=mUd<^AcB{T_$Y`2_N-x;F#3xTORXvhPZ7psmqhXy?WxxB5w!m*4&Q;?t$4Kt?m_em-htVDxora24&6~5z$MG(RT{trtp(L( zy&VDT{@p9_DGoq+I|abw$E!TyTO7j6dWQ25dqdKV*z3E?n-p|IG42ZUnNok? zY4K{y{27bUT@#|Zcni!tIgjE`j=-0rl(tVlWEn>5x7BJBkt0iw6j^4n1f2i^6ebo; zt^&Yb##}W0$3xhH&Nz*nANYpO$emARR6-FWX;C?(l7+}<97Ay#!y%BI6^st=LaJ>n zu{ORVJ9%`f*oy85MUf@Fek@T_+ML0-0b$lkEE2y8h%#P^X6+cn)IEXa@T7CQ{fV z-{^wJGN*+T!NsAH@VNM3tWG;%y{pVF2m z2*0+i?o40zSKVq_S18#=0RrJIse+;5cv#a`*`wNs+B%Ln8#e0v^I>7a_33h?lHo14 zg)CbDfGMyH2cj%7C`>|Rrg;U?$&y!z(U10>(dHKQsf9*=z)&@9u@w%y+e@*CnUS|E z*O^cQqM*!sD|e!u(yhXPi$Sl<$daf3sq@Iexafxt3F#2R&=cK z!gT-qto{oVdGUIxC0q`tg)B-Zy(pxGx}&svoA}7p=}jb3jEjQ!v6=afKI!2`&M{#tY$~3LR}#G#U2up2L{} zMGSX>Yjg6-^vWgeX0i;Nb0=gQmYa!|r0rRUshm2+z3AlehjfTqRGnRAmGhHY3`R_@ zPh4GAF@=nkRz;xMO3TPh$)9Iq?Fs5B@~)QIntSyeBy^10!ts?9Z@tK&L6xJd9 zNzaaz6zvrtr&MPQ@UD)njFUtFupwB zv+8%r`c@#asm}cKW^*x0%v_k3faHOnRLt7vzVFlqslue32rt(NNXnkS+fMSM&^u)8 zC`p{on>0pf=1id|vzdTnBLB;v%*ta`o_lzj21u+U-cTRXR%sxE%4k<(bU!orfsJ&v z3FLM2UT_*)BJm1^W;Z{0;z^_e=N&QXSO>rdB`*cp>yGnjHJt$ zcJd~52X&k1b<-`2R{bqLm*E(W{=|-)RTB*i$h4TdV12@beTkR&*iJ==ck*QlFiQ52 zBZ|o_LP06C?Sgs3VJ=oZQU0vK6#}f9gHSs)JB7TU2h~}UVe%unJA!URBgJ# zI~26)lGD4yk~ngKRg;(s4f@PccDZaL{Y=%6UKHl&k|M@Zc4vdx-DX4{belQ);URF? zyxW+|Ziv}%Y!sFdY@YO))Z|f34L(WjN*v#EfZHn6m)X@;TzQ@wIjl4B_TieZY}qY`mG}3VL{w?; z&O>sZ8)YnW+eLuW@rhClOOCZe2YP@4YWKN?P{c~zFUj*U?OayavPUo!r{uqA1<8h! zs0=rKKlwJYk~34F9$q6fQ&jnw_|@cTn{_kA8sUZ#2(Lb@R$NL*u>08yYGx{p6OeX~ zr7!lwGqMSury(v5=1_9%#*MORl2apGf(MQIQTMN35yE3l`^OS7r;SKS6&v-5q}Gw* zNWI*4OKBD&2YbCr8c{ifn~-9w-v+mV49W+k)$jjU@WA+Aok01SA#X$Sspj}*r52!- zNqOS<0%uMUZeSp+*i1TEO$KGKn7EwzW=s?(b5X^@3s5k*80ns2I2|bTHU+bWZ$x;j z`k@>)1G#JgT=F!8awgol?DqK^S4R*g?e}2rOYRVMUKKxSudO(hOLnnL zQqpxPNouLiQFYJs3?7!9f6!-#Pi83{q3-GgOA|{btKup4fYDu-JFOK~Q1c3KD@fdJ z?uABYOkHA^Fc~l0gTAy4geF<-1UqdS=b=UM6Xi30mPhy1-f^aQh9H(jwFl5w*X`Mh z=Ee5C?038GEqSVTd!67bn9*zQg-r8RIH3$$ zf8vWEBbOc`_0U{b)t)Toa~~<7c-K_=G%*iTW^?6mj9{#)@|# zku9R^IDzbzzERz~fpxFrU*it;-Iu&m!CAtM&$)6^2rMyV4 z$+e!$(e)!UY(Sc9n6hkr^n&cvqy8}NfZz+AQc8fU9lNczlP>5D3qzWoR55YvH94^* z-S%SVQ96pK3|Yo`75D&85)xij9Dl8AO8{J*{_yhs-KtsLXUYqwieO(nfrkB@%|OyI>yF+1G?m7>X&djb(HBNNw3KX;Ma*oMV)cV0xzxmIy+5>yz>l_LLH)VyRnYYce zw$?q!hJzX0TlE0+o5QJDM~sPrjVCN7#|32#rUkc>?-eN6Q0RqQTAl~`&isrQg)ass z+x5XapaYh{Dj`+V096?w)w2!Cnmh?x1WmFC$jEFY4;V)XAl3*tBS)V)3TbL)g46_g zCw9pl^!3OCTOcaEP!?==guEAw;VZ}fE6K-;@qD-Rx~td+j(N>)Wv$_mqFTH_wVZNEEuDG!0T`HXLsf+_E=X3lw4`_&d5&YMl%H733ckO){vZm znFLS`;5J#^`5~unet`V#*Y5In3yb|Ax z|A6b^F37!_z$_{6h{7l~<{u7{Fx*A*#zw{GD)6e}n6f<|)&7`S-txiz3Jm4S5hV&8 zm|Ncc{j_~`^pQ*I#w21;(jwi8GnH4efO;R|r4$tH~i;Bcmp^sP9) zjhJne@yzU&XvFNoc~i(wQ?nE`o6Hk~!;x(%xh7?zvigH2g`!v8L-vEN0DvV3?m( zSW(TZ%2AWf`rS}GGMqUj!8yCp#|fR--Vxfj=9}YD97Gocdj=S z0zkF-jsO>EcPTB1zRO$++k^bH%O`=UkHdHT^5?{$)ot<-K2XIE7js*4OjF)BsVjCJ z*KN)!FdM*sh=fB$p8*EzZmGJp?B_=a-90$FI{S$LLjBU$(lxUj;9 zIBszmA*129W+YE;Yy{J~3uyOr<2A(`*cu0IJN#tmUfz2jIWQi_h)_-V6o+5CjbX!1$lz6?QYU za&|O#F%~hmGUhil{M+J|*0<3&{a1%ONp-^!Qx*LOTYY}L!r9BbTxCjHMuUR0E(uH` z!b$*ZMdnB{b2vsb<&P6})+%O=%a8@~$fjbtfF@Z>^Q@enTOJ%VT)Rdc!wX|@iq9i}HaFZAeY6g8xGZY7h-r1sy_<#YU6}I?L zwvf0ePE5PKbK>2RiJOFO5xNhMY+kt`Qi?Oxo&@xH$<^Q;Nb(&rjPBAcv;XtmSY90z z;oIFFl%lDq$o&kYQ;aSHZHD@W({Y1hw<-I>7f_X8wc?%hNDlo~Ig;63RlHNhw~#R3 zA*f5D_Qo`4_ajY4Gr{mLs*(Fxh(U%oua_u3r%`H!TI)@R!!iqV8IOhIOzI@=7QJ=G zV$(9mEVL(7DvPn0j%_cOZN|vvNg8*PHma`6+oS;PDz%iOFyo0n0e%$<#A3r~$=I0T zDL*{AREUGx&C2}?I9cVL`UcPyawTqA4j-4%Mr-4`9#8GX1jiJkKGpHVr1~Rj#zFaZ zqmE!<|1JCi!LDG?1^Ys62xz(p;Uu!QZB7!C0#piy1_9=e?^s@-sd1gs!h$;Q`TNtf z3N4Elsgl#={#U`~&}FNvH78MLjjavl1x*4pNVr338>%sfHu>bxo2#eZN2ee9q#*Jg zDk_=OBR;8t6=pBN0aj)&Nj}pzqqUYW(tfk?bXTdKbNQFSUMCyN-!b0#3?Z;ijzx$M z^Eo6Eq*NO!Y8K;84H4MHj_xwBYc|3>+D(PFj7ejhECG@5@Pk&8dG<)HwwO2~j7KV6 z0$s}=*D;ek#8$a*sxVlC_`qFkM0%BQQ@v2H&Aq@G9XCQt^^x<8w*=MbZV)@aPrrn; z`6r*&f`x&1lp)`5>-|-4%l&W4jy~LydfN;iq?Y8Xx>Sh#2Lx@FXo|5{WKp@y-x;)7 zl;;_Y*-Nu3pcH-)p0(tP~3xO_u~>HpCdEfgyq7V-!ZZ{?`6v_b-vx< zuu|gm5mG6c@D{FYMLuzvG+A2T&6&`n>XM%s`+Qtj)5XdpyFOnz3KLSCOxaCEUl()M z3b~FYqA3FT1#SY{p36h%M^gBQpB2QzEdtM9hMBMRMu{|rf}(;S85&|A!|Aj}?fMKaju!y>_AS}#hRe_!&%8V=6+oPPtE zOOJ-Rcrf>hNq@lG{{@$H?6ikt@!A2OePLe{MBIWSPz7{u(I} z$PXzD;leHG?Xl0FnWt+Wrkrk*|e3P~YVF@N$y&L929cc=#-!*k)HZKDo8!#+t|?9p0z1KSDKclB&M6~hN5<9~^DIltXKR$+iK*h9k$|@Qoy9H}PSI;b(v>w`8(k70@sfa4nRweeiwZ-syP3zPSsyK_8Te9*(FQdm+ z84ZDah4PGehH72w=Q8bx;pK5juT67rJKb|ovD#COI^l6z0eBidn$!Y?T2;5sN+vTV z$`%Edb<%-Oq@NPZy<2Z3m;$}!9JzIuVK6;fJi>>m3q!Lr!2xXRq+l0LvZIR_PNYrP57E#sCvD^4UU2GVr*Rx`QcT}yQanF z3i~!-2Vkk4S%4Hd2baDvrM2g(&1jZaA1!vLi!I#5wX6g^&PE`0-TovM(%wuaPXAno z`a&j{ai=TsgKpc1C3|)tY#!4>SPBbMnchi}glCBwaNE(4`gi}JY0;`|m`s{HtaP@& zHxwCt#2&z9A7O+=v>za}LW~}G>_tWo$dsRX)f1L=+tZF5E&RBA#jUC|N9ZPa_&z5= zekCOsIfOh`p(&S8dnkE~9#(;BAh8qzi5JYT0nP7x&Hga3v`XFdRN|$5Ry#mq*AN$J zV)l~LSq}2d{EJ@%{TLnkRVn*sdM{_b|4!x73|Ux9{%S;FPyhfZ{xg;P2ZmMuA*cMG zipYNeI7{u98`22!_phwRk|lyX#49r%Lq1aZAabxs6MP79J3Kxh0z1E>MzLS6Ee5u+ z@od~O#6yMa;R}eI*a|ZB$ar0BT`%X4+kyxqW4s+D3rV176EAsfS**6-swZ9OIPRZ& zlmIH>ppe;l28`Kd0z(alw^r<%RlDpI6hv)6Gs?GIpffKApgx^)2-6jAzjZE0BtPBC z0z8!#C5AP${zTF$-Z^v%^ie8LI*rvR+*xc=>fa;`SRUSLAio?qL;jVFV1Bw4K>D+i zyEQ}vyG2HTx>W?Ul&MhxUXK7n;yfN)QS`foM!4>4-(PGwxW!^^UyKOz(v+1BejI*& zQSkV|m5=JF4T0k*+|h|3dx`ZKBVX7H4{5iakAxnD#J=9igW@LS;HE_8$lZy1l|$wX zn<8-$u=7&li+^MB(1y~Mz7lj7?oYf%1k{wT#?(Mep094qqnPv7*OYkQ#7$pkU5U24 zzPLEwAb<VIp_uUE~+r5)jt(>>Bg48_{)twH$QJDSBrUS!j{lX z)SK$6dfLWt)c9%Cml+sRp*OHXB?e4hbYZQo!@=6 zBPTpi&6&atD*#Cn6f@5<>79Mq7o0^E!NH)bD26g}?@qg%*AYeE6Tec@F?y9Q8i}^s zz`)l`8>;h75!kL!`&*_hsX1%2)(lWr|7!}@gn%MfwY8vN0=pMm3WesCRv5e*5m4z|u(zbYCpuxO9$bY)hkL|}mRj{3dlRgNK)#PJp#vR=ka^TZ(tKVI<>M~ekIfd2 zm3UDUNW*ZvS5L|SF334|YD>LJk(EqgPpVxtzwclUNaH70zWDVt^1+cz|F?RdF4HHn z@4~Gs`lj!0dWi2n#>7C@B$Qf7|t{1!3mtrO1H7 zi{=I#^Oa1jJiFI!j>PualW+ncHJ)TelW$bv2MqUG1xK7R z%TsQfTn)7D3}XYU+{?Hq!I&fqi4>DmryMiO?!aN!T4fnwq2vsuB^s6fPW@u*h-JwG zNniJFR(RI*?5HV=tqO)lv}CRv_eNEBR%z}Vnftv0+DUH^OCODH#&;{+aw^1vR z-c~|Mk+o?j-^Z+rR4s z-gNA5guTuab7N`{Y@eT&)!xF8#AeetvQ6d!W4BlO;0#0TxS_( zMm-A-u+h7-PjmOQHlh{Hxn+J$jh?uEtc8RG8tu->og@ z86A%eUt+P8E3oLXIrq#K(nCF@L12>=DVT3ec6Vn=B^B;>D=O%op+0BT;T)FHZ`I93 z^5|bpJC_kB92`alM40Am>Yz5o1gxkIGRYQ)x^+R|TCK)r;Qyq6+~S9Uy9nr^nkvc- zxw~#_9eBBJcZNK0yFZxUK4h>u$8;4k-KpNTblRgS(y&u~u&J;O!aqAMYJp+(BED*d z^I#F7vPOEADj}Pziprs=a{%qgz#eso$j`At7pN~bDw%&ba-+4pI}T*?w-z^_~DfD~Z3Tg+#M#u{s&uRF^dr5RFZh7<|WNEG;P z-_SzXTbHc^yD$r;WJqqJkA7^(zN`nzQ5V16nG~Zobuy)a)(T@Ik>V!qOfw;e z)?AZXjzDJg%BkIEY&bm&BczLuWY~k}3Zyx#)jxg1A9R`sz!_dCb!|13b*3PiA@(E6 z9HmG2R>-YrW93UMQO}XE4loI(*er9J*wDUd1se!pzdpoB_v6^lQl}+!6e5MS`+bU#_b*a5Pkt;o+lOV4loyn2P z$3;z-cX>$R{6M4q%b}aMBF}6N+0RCE70bB;XwHV~JLO&!EB)Cgo9ta_>>Os1HNfaY z4PNu7BGhw`6}cm>glh6i^)Ja{rpLHix?C?u;(e&GI{?!E7$9hd*5c^iL?;6Kwn z@qbBE|3UMF|F$Ok>7YY?CeMzMes@CZJQ?&|R8v5M@XvW}jjxhjl`gzl;rvy6Nn9$K z;1TKGpUgZs`vR!t-sD~2ar{58-;2k`H(MIWr_cujtSCpjue(R z(a7R{q`G+;8qD8D1e?1zWv+pPFtk=k#>f`yqZo)3KwCBgABgQbq%hu4q}h+Bdyh?* z#Rlr*$38^Ru%m9FUTQL2Xy^j|f%*4H*{zWFRsMbs6@u{JM{48fq;F;QFV%6Dn!6X0 zEAr2G{RmY8;Jlmws#%7Hl_TvQMbLnN0KGK=9)1u=Vb&#V27UwM#U+)$hn#hlXxBxO zM~<3s(W;fe-0%mVWtZ)oN|h-01@5z=u(z!V>)I9-IepH|_q6NR_DA>2hxGKt-QX;H6(^FXwcBndi1s%qn2sH-rsuON7*ARP6Qt$2XIy3d#cn8sLh&7#USTFn3 zQm-o6-Bnofon2V;oq-v1@Ye@NuH$Z~+th}Cs>F7=H#=4PKLp%-!EwR&0`a}XL=br< zF>&?HNr}9ahB-EA7a({^_6`taBwmB~hJG)p>8r^vq0J_+o`sOq<{s2~2t}W&1f5`l zj;E0nmt?YRp{ONhti9{4&rvt5uoS0CO@%+Yv>+}ROQAGP3VLu^S4fe{ZRoGviEXMF zhM=I=Eg2~^5PIwEq{~Wt?inz13!axZU3knx_)Ey9<)z<=!TnCPHvs1l^spF`@INYQ zY|J1RWri-^D9mVY5Z{u+bXg#}3rUwSXX>&@PN+017W@!L5H8CvZf0wZxQ=UrHJ{Um z$Z;~3t6ARGql*O1^YY(h4awy!h_brE6&k9B&5l;ya>jDyW5?o$q~=1iV!t7#8&QOx6P zhQIm55sij*Ef-G_?k^$AjK2j?=QQ?^=r{MDaGZ7`Yo*Kp1uoZ=&5|O)D#xAHL)n9_l6-E!b zVV@8ny;`XU#X2((4cTmv5unmYzUmJ>Hm+Kvht&a+j3nr!sljTHUZn^0w@L|WKw2TO zRO>T!>jutIzNI5U_KL}vd00oi6$aJqPeJwq)lIr(2Gt#52i@sqCFaWC)pS$pYoRCK zd*$)r6FCClYp+n>gCqVF>x)ghAbl+h${~Mc_sQGk@+sR@b(88l zcx?*Usr}v|kV!RPfS%HK>Bn{7tdEV$CB5Z@=uy4>^(o(%@R|_7dq69s1(X_8szPZ! zSS~$LCX>-}F=io=YcY~9!vqo3&dh9_Mosio`zO6i|$&p;-9%+~sdYNrVE?Q8rS+eHx z4O$l|b3FUT#2jb(WU<`oKAjGQUsoCgE1(c>3byBNPhKeJ7f4S-hBRqRyePY)im;>H z)hyFuFTDqx*ZgXo$hn+u>TGs~=Bjqr3bhPmXG)v8){EU;N*58NKU5;EIZl z9%|JomX+b6M#jS2`B%~!+`EStMD{|y^P=`xPbD$o6;|!((h!+y%7Y{DuC!NCKDIN1 zER-J?vZ$2el4y~!-0vWjNRoC|ARB`IX@M&;?ZpULcAIu`zlH9 z&JK#H);Ij~fqoT{59}OI#ViA%!lPYyd@kHg*hyI;iMdCtw2&eLHOd1*N%2Y!BG*H_ zu@E?VbtZlI{7B{C>A^b3njh=KdF!=rQ!)oIjwkP{t^I{2q&emQ-C1&U&fPC_viACTbT;(A3qRJeGINz^!0N26vQ~o|#pmjp-Zq46%+{X9n zLGKqhLh4`-(*oDHqHU~-45_+pe(BICF$*0jD&FW?ED=vn=t?p9X(%AH9+;6NcJ8JF zASkf}LfT7Z3u*#i$ml`gKIS>3jrTla--x##EDM{w{>Iu9qV!x95ECU*W_O`q>hcCa zswU!;H3R{}(A6aQ(B)lImTF$BzF;$V_?It*+8ZeiZa|b8n_DN4jUfI0jIA6Q6*c0f(uq~DxrNm!$~G=Uz=qP*)?qc(}|7MQZT&B=Um zr{Lj_R7QJAlwD=CoYpjQsUyu1)C9p5CE)%3nb)~WtP;@6(qGG`*qDT zS(zM>&R<;Z23V|80%3s!`0QpTt0Ay;*xLJeE|DP5@x?a!1)`g= z-1}G_LxiiO(*?R*{(yH#&yl|Seyx6*+ETayQtv7Htk3WPvI;U!@h-e$)gw9>pyKmB zk8#$3BF-ou%=`9_3)Q`0ttk$cymvULFS`Khmjes=2(-QY@eVjJ)rSD)z)1No&o+dz zrGItPZ$QuD;Nqt~U{J?9VlM0g{kx!4$?!?=o?um>#7tjMzrLfv<@pI&cp*5H>XPPZ zu8Xh&6y7v0pGDiQqd-~tBjK%-SO8$8kG&44|{09|FO5BoNkV6~JX>g{b#NHJW?gmM# zhbcS|M9fDc44(seG%$hK#va#4YL98mddGDi2qr;@CeiWO!!`DrF<%=_^*3JgoZiSj zdEv30G5`7ex`XP4#6cG;AQ}(|>CcCTGiom^pc*j-Mz1_oGp4iP*>N125YeWCw#L4H z*>u2Ih8jVRJ?rOj-7KbU7KXpYs2UZf)Vf}(lsM(oiB>tgqX2tILJitw_x z&7gq;`b}qrL{lEA3DaXDOi~HQ!^?xxjjVW|#Z+Ek&GKA2dYgO@zB2V*eY zx>@D06X)(FUz3xz99V3v*k7x|wxiFxv>=N$1Chfp>CErJq)gnf=P!u-QKrYnulzdQ zP56u!AH2^QVnuxTJjcQtlflq>PSm4C!$^fv4V_XsIO2d=O8|J`4bUDtjBchJ!14~3 z#mgUPYF*Z?k;Y)Igdx3yQg8L)M=c%}p3!P-0KOuXI+{*LXJ&w)$gzxeTyr`)h-Nc! z`$xa<>T2pbuU0VR?#FPEM44XDRw+cM6U1R2aLQpGHX40=4Er=lp&2aN#P1IA3|r+L z?5jaRyCgN)b(KuS+(x9rPLLjY&4^YY{0T2Ai%`f0p}sG*R!}{DSf7GdPJ=C2MT1ND zUJ@#y06`CNc9n?13R2KY1K*SYeV87wG%bjcIbn+AR8*FS<{?wWomTT5@`}~z3bFAJ zLR-wmE$iwwJ-TnVEhl{{?+??DJ?DWk~VaX-L3-RLtprT2%z-GfD{UVBR~T}zymA0 z6VZ;1Qr%5q#+Oz#3)`D(%WVWWS4BW6%ZvAtt!u25FO@e{X`)_LH>p&pFzx(wvNEO- z!2$Z}`iynmY2j&UCmRNB)9Cn3MXRls&PFVHzkzr;)B^BCMY~6lYY>0rsKT zm4}RV`Q7tbn)Aseay%@-I6ZT~PBsO?D|>kG*%(PGo=|gZ#0zsmE})xxtAvaCe&$1? z(7GyH&^jm!cguuMo@CPA&-lrdE&Aq8GIOuUK9jt{K0ldcvJJp7I`ZMx-EYj$)hl~) zFM!U~HxgO+lb$1cIK-nvz<5OPs(@d4tB6DUa3?-bJ98|dv-kIdtMS;9BuLc{a~_wW zO$u`rNymsAeMH9zh(|w=<*V z&&B{&O0Am`<$iBa)>pNZ6cO`d^3B5%=gmsH(HYZw6!U(c@}#)19F}`BT+yOfamJY$ zYOmy2m^k+ADH2klhAJMLq;6>t3)NREUgk*cjJHg{NBkVhDORNK;v5362&NN=y*Ef- z$vxYTG5Ga{SI&C93^Gsu9G-osqbC9PbsC&@xxGlF?o{!rs9|YpEE?P8ix#yS`7JUy z%ez(_Q%I^RwPrW%rFF(+mE}rp#Wtg@^>O7T(@LFA7j{LNrL=XGDyB-|3<*mqLL_UA zUZz?ulF$5O59-WWZ!d@hRxC@4d6?okW%`1$#<5w9eh>4Cyr#xe5%VPG@TBe#HA^O} z1&q{T_TMTr($f<()ah%TXapiGp}`MAC7>0I=Cx*t+bXy+gMyk*#(A~ft=&4YBdQki zQ}I=c;etc@sD4?l`eYaksPtJnx5OUaZ6u;7p64DUuI`omrWjht5$8+cqb6Hw75WNX z@D(fl7tDl2H)H%QYyX3>cL0*DZPv8+ZgaP7+t_W}wr$(CZQHhO+qUig`^@>y%s1~j z6Y)pXii(P=SQS<4iS=aOnR(rqe#b*BR~GN+bMNQSnhcMHxhVf6D7_zYs}@oo$eK9sZig1_lH0|C z&<1W;8dh6lutS+|02t0VqRfh9R+%!~9YsQ>cw-uGi!YMSo?19?Sty(u{GRqmTx8Zv zLz|nph}CNn+4a~dDzMog(j+NForDvDjLwub!b;p@dLHSBO0kjaI0CPZ)8B2(HNL&A zdr8Pw@u(POF1J*groJ~!1|E(GmnR3L6`P*3C;v?R zDw-pBC=u%}<}P_);mn-_cE}am&b1_WlqnWVzFS;*NhwoOb%+#0nI|H*Bw6_0R(=Kj z;7@eEqYkW2OvWkoz|yY1gZAJw8=>KShthS*ANzYdDT61^AK)>0H%LV4q3}hw?bkA$ zF$tz;<5T59v0Zd$)unmJ{vu_7eGDP6+pe(H&n^3E)g^rB?pn?GT9l1gztAUpR*+Kvt=FE~M zq5rZM&9v>ww1mzrK)vx*0;;?tnqA@Q;FBC@$2~=gy#jW$bAJUNIl_YpT)``*9nnkV zF!&XBK8(PeQfnScH*JaYqy{1bN4MwF=&g2)`!Kuo165*d^1Sc_d{I4>6V=>74c%g4 zXE_M`b@syq%jQx9VRp@ba!rY|MRhr!S3bN!1RT}^I(2gXE`KT57Y;maGA&dHM#`4* zy%@6YB0A6Z^?fg!$4Gq0auM47(jE$Y4osH zhydBwQ-S~vMS7)hg;AC=MRf~AHZu|Ue*bk=ff`!Ol1%=|W-a+~l)QH04q^oeMZHj~ z8$8jQn(n1#O!_7sg1hi;{v%?nd&gK7tfN3I{A0j zcg`ISk^Ir4G=(SvV$v}DE(nE+%rgFkT%cu5VR0Qa^H4-xPC*7Y*+E8#xvyepS#xYE+FyIIi0|5$J%mKAB58%MgleT%Zx42e^L`TdA~Ips z=NvgHNpYZju?*J>oNcmd^(nFUc+-bu4*+9)qIwU^g?1_4-&-`uZm&f7F^1?@3IvJc{gnlh?no$E9jFIfJ8i+33;o-!b2hD@}}{o}J4{l{44v z3Cd{3Lj%9^E43SBXmIvwsA2_8sXgRu=4=H{j9R(fYcCzOXriTZ51l+HcXr@)^?rK* zmc89=w8MW+txdobBh`X4rMvY#vuv0GIEO67sgL}mIw$pNW6s8Fd=t z@58{pFs^Oz&g}CPr8EL~QyUjk&}1qyO4;-6m0MRd4J9T2r5_j+YdeKP%Q+jnWNdV| zUJLU&d%m|g&3B83R^8K^WM{0at+=9UdVAzTnL+CqdcT#($38|-fQ|BJbHY4vk=ANj zvX?ek_oYp6t8bQz-T){|-5OGrv`IGd?>X*h(s{MvQ{j>fZbx<^-)&(j8(N+z^sftB z;V$0+Wd0oUR^&)Q+2bHfLt#V~jZT$UPUbkd#vD#zZJ&huG+-;T%sU~ONA?a`Va|T%I0yd%0*Xr3>p#slVg7Y<6o&Bx856S zg;7Q>mCFF?xq_m}VG5`(0fIX(V=yvQ;xjpwNhrLFMui8xdBw2aFOvI3t6-NG3%+d= z>1un%A{1+tFrn2nu2%`-hiqYhXDga3%{ZVkC@ROtTcA;g*E@K4i_G1&^P#Pl_9*m& zwBVKqZhrf4bhw@M)78cm zBMB!;A)H{6h6AjEv&|DGxYRmY|e_ARf_dMIvm*-i4hR#IU_#A_QYP@L|sHs zo@Ky_Bx6e2??_k;7vjibD#pM*T7`h9V&s(moOn_x^N|9{gkOtFY~gDqSo+7meUjBR zK2jiOsA%PwD|1*KC^m(-WZ5j2AWi;81kCi5t)KouHKt|R6m{m!!n|4YN3yyBo0mSZ zN^yj9>I9Y6dI&$!T7&$%3Ccxua0-&DoNJFbCV%1;h^-U&1Q+@47qrKld+QNGOrh{a z27PfD|L06XuL1+ZMc{_7rB7bd&WD%*lbypj>|K|<#2#t+qPXH zTm`5QC)ktLW5+G&4lhvX8DgOK)|mvQ_b^HuJ&=wP%Z6%;E+Bx|#|Q}vOoGR(jK}sD zk9x4A-V%Hs#G>J5XldT-W&|Kv(!mEi;J38jdK>L|Q7~<_no&|~Fdc~yhC~%VqQc2e z2|pva(YaxgaE`xa5=u=WkhtI|f`XRHhA6|>1`)hDgYzt9kByS$l*OQ2O-a#Iq%SLz zV^&-mn{^KrM6&BueyiV}>&)9rr)de2+DkV8##PSmko(<`nqPVr^n_V~UoIi`_yVdB zzcj4`b5QijKNrR%0AYi<`{NDb!y1^#Pv|K2N8<&wlO7-JDa5Yp?eM)pf>PbMq@)Wr zvki0Y1yLr2WfDb`RBPgq^VC(KH;ofR#9^i$TaMi9J6p5TP5F8<&ofnvL|`*(;urRO z?0k?7WiOd&^v);ux~R9Hznc3moOxE+O$lYV0Ku|hENFV~?Lt!QZlMNp1%d#^Rv!pC zfq`*V)n<`Io8N2XGBOjLYB}#{g#>o-?Hmb6$VyvSN@nI?3{y-pdNvcYe%&%CIeh?s zWfdM@$o~R)P|M>ElHW0BAMI=ozdH-Fle#Dvq-bpmPg-!rDY|1*o|1dvDh9{`{gt%n zFemDyrWMrywXJ+rV5r%UR~0T*75`i&rM4=%7}ulJyHu{rZw;C$r+nn@cLyLgh0d-A z(3SS5tW>ZK0in8bOH$vW>HIcipgUXYGUq49#>Ixff27cCfWz$0vR4Dmq}CBw<~4Sh zDe9adM$vVItE_)3FJT5Bgk}V=1g+Qvf5+hpxwh78gHe$<|r1^Nh?B&_~xSq+nVdY+~dc4GJ?e5EpV zXs-H~6poV`Kh5kok2qSUMD?0&WXKs7T0?Z-J8zti^WD-*_fo zhAqM(p+l2*(|b>aZC+?aK~^_VCZkP0>}TxdEC-KcmAx*YS?wTK?cW>PjS+NxM==Wg zg}e_*NcH%2(J=+WVL+;P)kz0c@48^4ZuemowCO=rriJFSD|#7D2oO{}$kCbL0#0%2 zQe&D2wwJ3%d|+L`bE=&9k_~(BOe$ZFap$YMGL$&$D0=mJ9n%He#RRlC3f=|WyrI0L zA_qS=kzzw8f_QiJYg_b?xA6UgBS0tT_Y$!9>(J-Q|m=O+8+wIPlb5i=-aU~kBf=4dD zd6Q8*EoKqRCcMNO5q%nez-osz1XT6PZ+r7r7A_{!vpDIfE$$yCUU66H>HOUO>u7aE zs*>|KS24COy<^3O^xXssCI`2iF%;A&7{j1UDk9dvv< zsUbj2HMoFr%{j!bRrmyt%jM|4UKza#}%Vf*_fEvi$*6J-h}oRdsdinr_W1-)p24zB*p9tfDdUa27+yi5W`#8+~eE_NyvNZgCP48jF8P; zgYS#IP!@sLe^SeCy4jwre}sC*A4Vk3|EzFISR4QEai+j{bL%-B#Nlt4WJN3eh+Uo) zVtaBF&A%PtbaaH`A~$h0I(5#|WARn>4Hbxy+Jn-$LdJWL+&({?oGdxCC?@gw`D44O zZ)fV$Yi@4u-zGU|!cfh6Eq?2C3Nn%TL2ZoA1+5g5O#q6$QGS|1C!;H{)PU?dDlSGU zLGKxOa;zm!C-Zghet4U7l(%LaEQnKF+>ECNt@`F07q-JO?%%X~*k}Yndc#f*iq0`hgW#iOvymYI0Ur}T;8qZ+%f1paM#v7e! zUS~+CMQqEbYZ%Ix+4iKAGa>>DLya7d_5zQo_zm&bP6F_75Qk^L7A%?p74r#_+3V6R z@m)%h$SZlQi)PpLLYyya^FulLkrPuM%+!YnWBCX|f#M*ph-`6S5IH3F;Os;ZZ&cDq z<~WF?be7SQre3OHq63A%t27ee4>e--Q*N)lFkAI_P@Yoq?Bd0s)IIqLY)xtXU`k>x zfQK0;b2n0v{oPhQju4$`uD>)Syw=X_l}YEfVF8)awhULL-sJNdq;z8~(wyAEW&sDx zxqHk8ufaTXHNnIUP~eE&k>D!g#IVt73wHY+ugJwtuy74u* z1qC32jRV4EWbz*0B5d5qGm7FB;V0Z>C63g4n6hW?!BfHU=hqZbuGx&ccdij#|lWok>4#{m^Fy>{`JdOS zjIM(Tuf4sYrJltP%2vW!U)Mt5hd5_vs^{onYW=T{?nF6taSUF>uPLMY@>8Y#vd&fU zJg$MqI>EOkIj}Gpu%?+k{%zvX7zqvMeuMm%YD6eLoHxL?e6eW>J~|~Z&lHB^r_Ag0 z{*SlMeG(r}i;4UY6e1TDhAnY@tyh=*e7>7?vlwq>&py69o*=hIE389P!iE)Fe1v;HN5fVGS&&jBzQk*Q}Rb%{FF5H zt;vL@*J)TU^_AGy%>+&9)+R@9XQHe9%Cr#w>Q$NM0~WAiktZl>9`I-Ypc0UjVU1rn z_FPNg@88w2iz;NHBJ8)vM$%1oe7QzSs;NxSieG5h->Cq6`M#YqU;tx=1hYym@h%fi zzWLOcEgsbZ>jW|mkR)qpxv-Z}J6iTzy?L3sZiv!nbZ3a;A~Hu3j6-^%FcrouBW^*9 zwOO;eD$2J8edza=ZDF&}5X#=B9O(;A4zyM&5yTvxuoqjP+FZY!ZYI`_D=;czTJF-e z1-$=(BE%9~*+c%p5UT&+n27&>tc8D77L`o(F_e)w^~KRuv4^AdNE-D~2I(p(SCPRP zc{V^gm}JdYd(~~{max0nhdPp5j3){eJ z$LuzR9V>9)451K&?27Aps3vsd_bU(1EDOA~g;@vOO2Ty`4MFO9u=`!_wEKPQp>9L& zzuUbCBGHhsuxYBy-^Uw`)=n5pSF5)!a6qfH$^u&=0GA(}B-Ixjj|ce?Bp(~$q^7BqWU|H8 zKU!?5P@+8*_63=^7)|h<=`vW)2%PZF(`Q0Lr0x5QLjWKIQZB9)OOB_ISy!Mx`E{lJ z1=1d&Ic*{{_h#6sNH^Hz)~vB7gCTbuUkVrOm(pCye57-0NUsKiFMeA#@NBB+F5<+s{(H7mQAPQx`OR z8xRz&uf&f&-?8paW&Q%EHCq$Lv~}lCIW%s>Wxj&$Majn9D~*{Yn8jBZ3b9-fuz!82Hn?&ZI2_JZYAy$kb_?7m*?J z7EcrbL2*)gJ(Wl`yg~c)vC1w>dR$LezB90-T0%EZo|KuQOirNpKJAd) zr+w2F#9m@j64vevMEx_$M}ESx!oajKsI7|Q#c-fWRsS7nAgMlxf$l`eoBx6_u1LP` z5wVEEAYNPN*iXKJza7=aP+z_r$z;5})SQGWl0SrU7qL5T>MpzjZPVq~an6pv29s{gIn1Rh z$*Vp>0p=05JN|HRiyOCbpgpZ@;9Xj|o3DNV!%Xn6t3hE>(=2$dFuEx{osGXYv`m73 z@j>86*-gsSS^3mR)HB6Bj1fy+E{@9e{bcRLU_iAqDzdQUqG)+sqNE`h1 z$3w4loJ+!{F4NdK!E7Vu6L}j5d=VnffP!j5b(b5(u}{;?o9PB`YLsrEsOeE8IUM8F zj!}~kYF^$l^i7CS$AnS+a4#EnWySE!?hNnzWe>=ETyc4WCXpNzZ9R&vLWR9n2)aFS zeT`FE>ZzLpjPr*qdk%A3<`U8cpr3K~?abpqM})l-j}Hz+9tJcw;_-BzCtzpYoNVk^ zd4xI@9~_|+Y_6S*Kx+?A$c)OqC718Wiat0Sl%qFMhix0?j{gw1XO9$zQhjjoeDj|S z8hS*$R7Ol=9=Sd-9s*OgZAC1sMC*(iexn}3CMYJdNZu8^S5)5@Bxo7ayS4fG2D@ns z(Y9t_4DB(20CAx~=eL=RM?RRc4|4V{?Qe z=>g3K7H^2nxwHm|*N+zhk9ET-=0ak5wZAxM<)DFY7|^q+@a_=>AXMj@vZG11mH%nQ zn9XfRt7)!V&u0~v+`DaED;5~WX_cQ6~@iQ$)`#bKdk&+uvYtZMGQ??&zRmpw zbc5donS&q;jPQE_7rh5{ONJKBM;cxKH>r!f)K=VDf}bfc1B4Nv3C}__D{B|kU4Q04E((6!W^q+&Xb=m`c#S!$wEEp4py_0 zDJO?v%A16hzF;#-Lt+DUyec?VXUS?%21=wBiJ<}TTQMa&n$+5wnHr4sni_Hb`tFO; z((Kg?Xh0p)JZnUc=-mE(Ls`z5)+Qr8;F0R92sj9yEJx1kK&wQ8S2S`)h+Qk?^jShBw0n z^g^Pht7xCZvs&|5W95{bypf4acXhX`O_>*QyEk183j48^Ws>JcasVrhs5G9;&2dyi z%>jCf;J1W^x5i(=Cvt|^PAWSdNG}XTJ@;UD+R!_#xn5!VD8@`C$I>Ipes@q*x>0`l z)z8=i*VF~+bxTYjaCr)lzaDau^|9V&q!IlGwQu0TKbn4oBljDL$D`d(xUR1D_M2H5 z_D)E{)YMOgPe9j&Ta=X`w!K8L8Fz1tOon!uWan9)huounS4Mh4dF)BRXPW~rZ){=b z8GKrX8h<5U_7;gkNu2?Vha=mHR?g_-tDJ7e(~;kBqw^DncZb0-heR1$Eu84i7(X`&aR*AQIwovW z>fz)N@L0uBeI%!;>fF*(y?aB?LspSl*h;#V3|hH@lSBCC>z%=##r4vBD?~% zIcaMD#Ep&MMR|QloYSVm4m`6&D~o=K)KUR!2dn`e7}AFYi4ni=M| zwlXp`cKoTc{O?pVGTu@effshzIQL;~Uran3$O8b$6lS*o0sT!BoyZd(zz&P7axA%@Nz)_qI zkD$LWxQoOtM=CJA^aux0eMxT|$TTV{XcUf%R6YWWWpb~~Wr+7tk~!$o(-O!M!{#H? z)jCw2taNz0WO)=*Gud3!7Hi9?DqB;9JQ_pLDASj_PC!c^M|om%q>Zz+S3oK5Y^V&l+!?6vHO@6@c? z%)vqVE`pRD|ItbFC1kt4ApdNC)&9im8NW=RUr>

@up^y4&I8N>~wvL%f(S2W%NN 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 D613UA literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..94920145f3 --- /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-6.0.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000000..2fe81a7d95 --- /dev/null +++ b/gradlew @@ -0,0 +1,183 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 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. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$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 "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# 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 + ;; + 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" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000000..9618d8d960 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,100 @@ +@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 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 init + +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 init + +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 + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +: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 %CMD_LINE_ARGS% + +: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/pom.xml b/pom.xml deleted file mode 100644 index dd169ece2b..0000000000 --- a/pom.xml +++ /dev/null @@ -1,384 +0,0 @@ - - - 4.0.0 - org.springframework.boot - spring-boot-build - ${revision} - pom - Spring Boot Build - Spring Boot Build - - 2.3.0.BUILD-SNAPSHOT - ${basedir} - - - - - - default - - - !disable-spring-boot-default-profile - - - - 0.0.17 - 0.0.4.RELEASE - - - - - org.apache.maven.plugins - maven-checkstyle-plugin - 3.0.0 - - - com.puppycrawl.tools - checkstyle - 8.22 - - - io.spring.javaformat - spring-javaformat-checkstyle - ${spring-javaformat.version} - - - io.spring.nohttp - nohttp-checkstyle - ${nohttp-checkstyle.version} - - - - - checkstyle-validation - validate - - ${disable.checks} - src/checkstyle/checkstyle.xml - src/checkstyle/checkstyle-suppressions.xml - true - main.basedir=${main.basedir} - UTF-8 - - - check - - - - nohttp-checkstyle-validation - validate - - ${disable.checks} - src/checkstyle/nohttp-checkstyle.xml - src/checkstyle/nohttp-checkstyle-suppressions.xml - main.basedir=${main.basedir} - UTF-8 - ${basedir} - **/* - **/.git/**/*,**/target/**/,**/.flattened-pom.xml,**/*.class,**/spring-boot-gradle-plugin/build/**,**/spring-boot-gradle-plugin/bin/** - - - check - - false - - - - - io.spring.javaformat - spring-javaformat-maven-plugin - ${spring-javaformat.version} - - - validate - - ${disable.checks} - - - validate - - - - - - - - spring-boot-project - - spring-boot-tests - - - - - m2e - - - m2e.version - - - - spring-boot-project - spring-boot-tests - - - - repository - - - repository - - - - - repository - ${repository} - - true - - - - - - repository - ${repository} - - true - - - - - - - - - central - https://repo.maven.apache.org/maven2 - - false - - - - spring-milestone - Spring Milestone - https://repo.spring.io/milestone - - false - - - - spring-snapshot - Spring Snapshot - https://repo.spring.io/snapshot - - true - - - - rabbit-milestone - Rabbit Milestone - https://dl.bintray.com/rabbitmq/maven-milestones - - false - - - - - - central - https://repo.maven.apache.org/maven2 - - false - - - - spring-release - Spring Release - https://repo.spring.io/release - - - spring-milestone - Spring Milestone - https://repo.spring.io/milestone - - false - - - - spring-snapshot - Spring Snapshot - https://repo.spring.io/snapshot - - true - - - - - - - - - org.eclipse.m2e - lifecycle-mapping - 1.0.0 - - - - - - org.apache.maven.plugins - maven-checkstyle-plugin - [1,) - - check - - - - - - - - - org.apache.maven.plugins - maven-dependency-plugin - [1,) - - copy - copy-dependencies - unpack - - - - - - - - - org.apache.maven.plugins - maven-enforcer-plugin - [1,) - - enforce - - - - - - - - - org.apache.maven.plugins - maven-invoker-plugin - [1,) - - install - - - - - - - - - org.apache.maven.plugins - maven-plugin-plugin - [1,) - - descriptor - helpmojo - - - - - - - - - org.basepom.maven - duplicate-finder-maven-plugin - [1,) - - check - - - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - [1,) - - reserve-network-port - - - - - - - - - org.codehaus.mojo - flatten-maven-plugin - [1,) - - flatten - - - - - - - - - org.jetbrains.kotlin - kotlin-maven-plugin - [1,) - - compile - test-compile - - - - - - - - - org.jooq - jooq-codegen-maven - [1,) - - generate - - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - [1,) - - build-info - - - - - - - - - - - - - - diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000000..43d7fd1cfb --- /dev/null +++ b/settings.gradle @@ -0,0 +1,71 @@ +pluginManagement { + repositories { + mavenCentral() + gradlePluginPortal() + maven { url 'https://repo.spring.io/snapshot' } + } + resolutionStrategy { + eachPlugin { + if (requested.id.id == 'org.jetbrains.kotlin.jvm') { + useVersion "${kotlinVersion}" + } + if (requested.id.id == 'org.jetbrains.kotlin.plugin.spring') { + useVersion "${kotlinVersion}" + } + } + } +} + +plugins { + id 'com.gradle.enterprise' version '3.1' +} + +apply from: "$rootDir/gradle/build-scan-user-data.gradle" +gradleEnterprise { + buildScan { + captureTaskInputFiles = true + obfuscation { + ipAddresses { addresses -> addresses.collect { address -> '0.0.0.0'} } + } + publishAlwaysIf(System.getenv('GRADLE_ENTERPRISE_URL') != null) + server = 'https://ge.spring.io' + } +} + +apply from: new File(settingsDir, 'gradle/build-cache-settings.gradle') + +rootProject.name='spring-boot-build' + +include 'spring-boot-project:spring-boot-dependencies' +include 'spring-boot-project:spring-boot-parent' +include 'spring-boot-project:spring-boot-tools:spring-boot-antlib' +include 'spring-boot-project:spring-boot-tools:spring-boot-autoconfigure-processor' +include 'spring-boot-project:spring-boot-tools:spring-boot-configuration-metadata' +include 'spring-boot-project:spring-boot-tools:spring-boot-configuration-processor' +include 'spring-boot-project:spring-boot-tools:spring-boot-gradle-plugin' +include 'spring-boot-project:spring-boot-tools:spring-boot-loader' +include 'spring-boot-project:spring-boot-tools:spring-boot-loader-tools' +include 'spring-boot-project:spring-boot-tools:spring-boot-maven-plugin' +include 'spring-boot-project:spring-boot-tools:spring-boot-test-support' +include 'spring-boot-project:spring-boot' +include 'spring-boot-project:spring-boot-autoconfigure' +include 'spring-boot-project:spring-boot-actuator' +include 'spring-boot-project:spring-boot-actuator-autoconfigure' +include 'spring-boot-project:spring-boot-cli' +include 'spring-boot-project:spring-boot-devtools' +include 'spring-boot-project:spring-boot-docs' +include 'spring-boot-project:spring-boot-properties-migrator' +include 'spring-boot-project:spring-boot-test' +include 'spring-boot-project:spring-boot-test-autoconfigure' +include 'spring-boot-tests:spring-boot-deployment-tests' +include 'spring-boot-tests:spring-boot-integration-tests:spring-boot-configuration-processor-tests' +include 'spring-boot-tests:spring-boot-integration-tests:spring-boot-launch-script-tests' +include 'spring-boot-tests:spring-boot-integration-tests:spring-boot-server-tests' + +new File("$rootDir/spring-boot-project/spring-boot-starters").eachFileMatch(groovy.io.FileType.DIRECTORIES, ~/spring-boot-starter.*/) { + include "spring-boot-project:spring-boot-starters:$it.name" +} + +new File("$rootDir/spring-boot-tests/spring-boot-smoke-tests").eachFileMatch(groovy.io.FileType.DIRECTORIES, ~/spring-boot-smoke-test.*/) { + include "spring-boot-tests:spring-boot-smoke-tests:$it.name" +} diff --git a/spring-boot-project/pom.xml b/spring-boot-project/pom.xml deleted file mode 100644 index 2e893ff281..0000000000 --- a/spring-boot-project/pom.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-build - ${revision} - - spring-boot-project - pom - Spring Boot Project - Spring Boot Project - - ${basedir}/.. - - - spring-boot-dependencies - spring-boot-parent - spring-boot - spring-boot-actuator - spring-boot-actuator-autoconfigure - spring-boot-autoconfigure - spring-boot-devtools - spring-boot-properties-migrator - spring-boot-test - spring-boot-test-autoconfigure - spring-boot-tools - spring-boot-starters - spring-boot-cli - spring-boot-docs - - diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/build.gradle b/spring-boot-project/spring-boot-actuator-autoconfigure/build.gradle new file mode 100644 index 0000000000..5c7076e9ef --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/build.gradle @@ -0,0 +1,185 @@ +plugins { + id 'java-library' + id 'org.asciidoctor.jvm.convert' + id 'org.asciidoctor.jvm.pdf' + id 'org.springframework.boot.auto-configuration' + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.deployed' + id 'org.springframework.boot.optional-dependencies' +} + +description = 'Spring Boot Actuator AutoConfigure' + +configurations { + asciidoctorExtensions + documentation +} + +dependencies { + asciidoctorExtensions enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + asciidoctorExtensions 'org.springframework.restdocs:spring-restdocs-asciidoctor' + + api project(':spring-boot-project:spring-boot-actuator') + + implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + implementation project(':spring-boot-project:spring-boot') + implementation project(':spring-boot-project:spring-boot-autoconfigure') + implementation 'com.fasterxml.jackson.core:jackson-databind' + implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310' + implementation 'org.springframework:spring-core' + implementation 'org.springframework:spring-context' + + optional enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + optional 'ch.qos.logback:logback-classic' + optional 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml' + optional 'com.github.ben-manes.caffeine:caffeine' + optional 'com.hazelcast:hazelcast' + optional 'com.hazelcast:hazelcast-spring' + optional 'com.sun.mail:jakarta.mail' + optional 'com.zaxxer:HikariCP' + optional 'io.dropwizard.metrics:metrics-jmx' + optional 'io.lettuce:lettuce-core' + optional 'io.micrometer:micrometer-core' + optional 'io.micrometer:micrometer-jersey2' + optional 'io.micrometer:micrometer-registry-appoptics' + optional 'io.micrometer:micrometer-registry-atlas' + optional 'io.micrometer:micrometer-registry-datadog' + optional 'io.micrometer:micrometer-registry-dynatrace' + optional 'io.micrometer:micrometer-registry-elastic' + optional 'io.micrometer:micrometer-registry-ganglia' + optional 'io.micrometer:micrometer-registry-graphite' + optional 'io.micrometer:micrometer-registry-humio' + optional 'io.micrometer:micrometer-registry-influx' + optional 'io.micrometer:micrometer-registry-jmx' + optional 'io.micrometer:micrometer-registry-kairos' + optional 'io.micrometer:micrometer-registry-new-relic' + optional 'io.micrometer:micrometer-registry-prometheus' + optional 'io.micrometer:micrometer-registry-stackdriver' + optional 'io.prometheus:simpleclient_pushgateway' + optional 'io.micrometer:micrometer-registry-signalfx' + optional 'io.micrometer:micrometer-registry-statsd' + optional 'io.micrometer:micrometer-registry-wavefront' + optional 'io.projectreactor.netty:reactor-netty' + optional 'io.searchbox:jest' + optional 'jakarta.jms:jakarta.jms-api' + optional 'jakarta.servlet:jakarta.servlet-api' + optional 'javax.cache:cache-api' + optional 'net.sf.ehcache:ehcache' + optional 'org.apache.activemq:activemq-broker' + optional 'org.apache.commons:commons-dbcp2' + optional 'org.apache.kafka:kafka-clients' + optional 'org.apache.tomcat.embed:tomcat-embed-core' + optional 'org.apache.tomcat.embed:tomcat-embed-el' + optional 'org.apache.tomcat:tomcat-jdbc' + optional 'org.aspectj:aspectjweaver' + optional 'org.eclipse.jetty:jetty-server' + optional 'org.elasticsearch:elasticsearch' + optional 'org.elasticsearch.client:elasticsearch-rest-client' + optional 'org.flywaydb:flyway-core' + optional 'org.glassfish.jersey.core:jersey-server' + optional 'org.glassfish.jersey.containers:jersey-container-servlet-core' + optional 'org.hibernate:hibernate-core' + optional 'org.hibernate.validator:hibernate-validator' + optional 'org.influxdb:influxdb-java' + optional 'org.jolokia:jolokia-core' + optional 'org.infinispan:infinispan-spring4-embedded' + optional 'org.liquibase:liquibase-core' + optional 'org.mongodb:mongodb-driver-async' + optional 'org.mongodb:mongodb-driver-reactivestreams' + optional 'org.springframework:spring-jdbc' + optional 'org.springframework:spring-jms' + optional 'org.springframework:spring-messaging' + optional 'org.springframework:spring-webflux' + optional 'org.springframework:spring-webmvc' + optional 'org.springframework.amqp:spring-rabbit' + optional 'org.springframework.data:spring-data-cassandra' + optional 'org.springframework.data:spring-data-couchbase' + optional 'org.springframework.data:spring-data-ldap' + optional 'org.springframework.data:spring-data-mongodb' + optional 'org.springframework.data:spring-data-neo4j' + optional 'org.springframework.data:spring-data-redis' + optional 'org.springframework.data:spring-data-solr' + optional 'org.springframework.integration:spring-integration-core' + optional 'org.springframework.security:spring-security-config' + optional 'org.springframework.security:spring-security-web' + optional 'org.springframework.session:spring-session-core' + optional 'redis.clients:jedis' + + testImplementation project(':spring-boot-project:spring-boot-test') + testImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-test-support') + testImplementation 'io.projectreactor:reactor-test' + testImplementation 'com.squareup.okhttp3:mockwebserver' + testImplementation 'com.jayway.jsonpath:json-path' + testImplementation 'io.undertow:undertow-core' + testImplementation ('io.undertow:undertow-servlet') { + exclude group: 'org.jboss.spec.javax.annotation', module: 'jboss-annotations-api_1.2_spec' + exclude group: 'org.jboss.spec.javax.servlet', module: 'jboss-servlet-api_4.0_spec' + } + testImplementation 'javax.xml.bind:jaxb-api' + testImplementation 'org.apache.logging.log4j:log4j-to-slf4j' + testImplementation 'org.aspectj:aspectjrt' + testImplementation 'org.assertj:assertj-core' + testImplementation 'org.eclipse.jetty:jetty-webapp' + testImplementation 'org.glassfish.jersey.ext:jersey-spring4' + testImplementation 'org.glassfish.jersey.media:jersey-media-json-jackson' + testImplementation 'org.hamcrest:hamcrest' + testImplementation 'org.hsqldb:hsqldb' + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.mockito:mockito-core' + testImplementation 'org.skyscreamer:jsonassert' + testImplementation 'org.springframework:spring-orm' + testImplementation 'org.springframework.data:spring-data-elasticsearch' + testImplementation 'org.springframework.data:spring-data-rest-webmvc' + testImplementation 'org.springframework.integration:spring-integration-jmx' + testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc' + testImplementation 'org.springframework.restdocs:spring-restdocs-webtestclient' + testImplementation 'org.springframework.security:spring-security-test' + testImplementation 'org.yaml:snakeyaml' + + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + testRuntimeOnly 'org.springframework.security:spring-security-oauth2-jose' + testRuntimeOnly 'org.springframework.security:spring-security-oauth2-resource-server' +} + +compileJava { + options.compilerArgs << '-parameters' +} + +compileTestJava { + options.compilerArgs << '-parameters' +} + +test { + outputs.dir("$buildDir/generated-snippets") +} + +asciidoctor { + configurations 'asciidoctorExtensions' + dependsOn test + sources { + include 'index.adoc' + } +} + +asciidoctorPdf { + configurations 'asciidoctorExtensions' + dependsOn test + sources { + include 'index.adoc' + } +} + +task zip(type: Zip) { + dependsOn asciidoctor, asciidoctorPdf + duplicatesStrategy 'fail' + from(asciidoctorPdf.outputDir) { + into 'pdf' + } + from(asciidoctor.outputDir) { + into 'html' + } +} + +artifacts { + documentation zip +} diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml b/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml deleted file mode 100644 index aa824b2ae1..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml +++ /dev/null @@ -1,863 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-parent - ${revision} - ../spring-boot-parent - - spring-boot-actuator-autoconfigure - Spring Boot Actuator AutoConfigure - Spring Boot Actuator AutoConfigure - - ${basedir}/../.. - ${project.build.directory}/refdocs/ - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - - org.springframework.boot - spring-boot-actuator - - - org.springframework.boot - spring-boot-autoconfigure - - - com.fasterxml.jackson.core - jackson-databind - - - org.springframework - spring-core - - - org.springframework - spring-context - - - - ch.qos.logback - logback-classic - true - - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - true - - - com.github.ben-manes.caffeine - caffeine - true - - - com.hazelcast - hazelcast - true - - - com.hazelcast - hazelcast-spring - true - - - com.sun.mail - jakarta.mail - true - - - com.zaxxer - HikariCP - true - - - io.dropwizard.metrics - metrics-jmx - true - - - io.lettuce - lettuce-core - true - - - io.micrometer - micrometer-core - true - - - io.micrometer - micrometer-jersey2 - true - - - io.micrometer - micrometer-registry-appoptics - true - - - io.micrometer - micrometer-registry-atlas - true - - - io.micrometer - micrometer-registry-datadog - true - - - io.micrometer - micrometer-registry-dynatrace - true - - - io.micrometer - micrometer-registry-elastic - true - - - io.micrometer - micrometer-registry-ganglia - true - - - io.micrometer - micrometer-registry-graphite - true - - - io.micrometer - micrometer-registry-humio - true - - - io.micrometer - micrometer-registry-influx - true - - - io.micrometer - micrometer-registry-jmx - true - - - io.micrometer - micrometer-registry-kairos - true - - - io.micrometer - micrometer-registry-new-relic - true - - - io.micrometer - micrometer-registry-prometheus - true - - - io.prometheus - simpleclient_pushgateway - true - - - io.micrometer - micrometer-registry-signalfx - true - - - io.micrometer - micrometer-registry-stackdriver - true - - - io.micrometer - micrometer-registry-statsd - true - - - io.micrometer - micrometer-registry-wavefront - true - - - io.projectreactor.netty - reactor-netty - true - - - io.searchbox - jest - true - - - jakarta.jms - jakarta.jms-api - true - - - jakarta.servlet - jakarta.servlet-api - true - - - jakarta.persistence - jakarta.persistence-api - true - - - jakarta.ws.rs - jakarta.ws.rs-api - true - - - javax.cache - cache-api - true - - - net.sf.ehcache - ehcache - true - - - org.apache.activemq - activemq-broker - true - - - geronimo-jms_1.1_spec - org.apache.geronimo.specs - - - - - org.apache.commons - commons-dbcp2 - true - - - org.apache.kafka - kafka-clients - true - - - org.apache.tomcat.embed - tomcat-embed-core - true - - - org.apache.tomcat.embed - tomcat-embed-el - true - - - org.apache.tomcat - tomcat-jdbc - true - - - org.aspectj - aspectjweaver - true - - - org.eclipse.jetty - jetty-server - true - - - javax.servlet - javax.servlet-api - - - - - org.elasticsearch - elasticsearch - true - - - org.elasticsearch.client - elasticsearch-rest-client - true - - - org.flywaydb - flyway-core - true - - - org.glassfish.jersey.core - jersey-server - true - - - javax.validation - validation-api - - - - - org.glassfish.jersey.containers - jersey-container-servlet-core - true - - - org.hibernate - hibernate-core - true - - - javax.activation - javax.activation-api - - - javax.xml.bind - jaxb-api - - - javax.persistence - javax.persistence-api - - - - - org.hibernate.validator - hibernate-validator - true - - - javax.validation - validation-api - - - - - org.influxdb - influxdb-java - true - - - org.jolokia - jolokia-core - true - - - org.infinispan - infinispan-spring5-embedded - true - - - org.liquibase - liquibase-core - true - - - org.mongodb - mongodb-driver-async - true - - - org.mongodb - mongodb-driver-reactivestreams - true - - - org.springframework - spring-jdbc - true - - - org.springframework - spring-jms - true - - - org.springframework - spring-messaging - true - - - org.springframework - spring-webflux - true - - - org.springframework - spring-webmvc - true - - - org.springframework.amqp - spring-rabbit - true - - - org.springframework.data - spring-data-cassandra - true - - - org.springframework.data - spring-data-couchbase - true - - - org.springframework.data - spring-data-ldap - true - - - org.springframework.data - spring-data-mongodb - true - - - org.springframework.data - spring-data-neo4j - true - - - org.springframework.data - spring-data-redis - true - - - org.springframework.data - spring-data-solr - true - - - - wstx-asl - org.codehaus.woodstox - - - - - org.springframework.integration - spring-integration-core - true - - - org.springframework.security - spring-security-config - true - - - org.springframework.security - spring-security-web - true - - - org.springframework.session - spring-session-core - true - - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - runtime - - - - org.springframework.boot - spring-boot-autoconfigure-processor - true - - - org.springframework.boot - spring-boot-configuration-processor - true - - - - org.springframework.boot - spring-boot-test - test - - - org.springframework.boot - spring-boot-test-support - test - - - io.projectreactor - reactor-test - test - - - com.squareup.okhttp3 - mockwebserver - test - - - org.hamcrest - hamcrest-core - - - - - com.jayway.jsonpath - json-path - test - - - io.undertow - undertow-core - test - - - io.undertow - undertow-servlet - test - - - org.jboss.spec.javax.servlet - jboss-servlet-api_3.1_spec - - - - - jakarta.validation - jakarta.validation-api - test - - - jakarta.xml.bind - jakarta.xml.bind-api - test - - - org.apache.logging.log4j - log4j-to-slf4j - test - - - org.aspectj - aspectjrt - test - - - org.eclipse.jetty - jetty-webapp - test - - - org.hsqldb - hsqldb - test - - - org.glassfish.jersey.ext - jersey-spring5 - test - - - org.glassfish.jersey.media - jersey-media-json-jackson - test - - - org.skyscreamer - jsonassert - test - - - org.springframework - spring-orm - test - - - org.springframework.data - spring-data-elasticsearch - test - - - org.springframework.data - spring-data-rest-webmvc - test - - - org.springframework.integration - spring-integration-jmx - test - - - org.springframework.restdocs - spring-restdocs-mockmvc - test - - - javax.servlet - javax.servlet-api - - - - - org.springframework.restdocs - spring-restdocs-webtestclient - test - - - org.springframework.security - spring-security-test - test - - - org.springframework.security - spring-security-oauth2-resource-server - test - - - org.springframework.security - spring-security-oauth2-jose - test - - - org.yaml - snakeyaml - test - - - redis.clients - jedis - true - - - - - full - - - full - - - - - - com.googlecode.maven-download-plugin - download-maven-plugin - - - unpack-doc-resources - generate-resources - - wget - - - ${spring-doc-resources.url} - true - ${refdocs.build.directory} - - - - - - org.apache.maven.plugins - maven-antrun-plugin - - - ant-contrib - ant-contrib - 1.0b3 - - - ant - ant - - - - - org.apache.ant - ant-nodeps - 1.8.1 - - - org.tigris.antelope - antelopetasks - 3.2.10 - - - - - set-up-maven-properties - prepare-package - - run - - - true - - - - - - - - - - - - - - - package-docs-zip - package - - run - - - - - - - - - - - - - - - - - org.asciidoctor - asciidoctor-maven-plugin - - - generate-html-documentation - prepare-package - - process-asciidoc - - - html5 - ${project.build.directory}/generated-docs/reference/html - highlight.js - book - - js/highlight - github - true - ./images - font - css/ - spring.css - warn - - - true - - DEBUG - - - - - - generate-pdf-documentation - prepare-package - - process-asciidoc - - - pdf - ${project.build.directory}/generated-docs/reference/pdf - - - - - ${refdocs.build.directory} - index.adoc - - ${version-type} - ${project.version} - ${project.build.directory}/generated-snippets/ - - - - - org.asciidoctor - asciidoctorj-pdf - 1.5.0-alpha.18 - - - - - org.apache.maven.plugins - maven-resources-plugin - - - copy-asciidoc-resources - generate-resources - - copy-resources - - - ${refdocs.build.directory} - - - src/main/asciidoc - false - - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - attach-zip - - attach-artifact - - - - - ${project.build.directory}/${project.artifactId}-${project.version}-docs.zip - zip - docs - - - - - - - - - - - diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/auditevents.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/auditevents.adoc new file mode 100644 index 0000000000..9c6358f20b --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/auditevents.adoc @@ -0,0 +1,40 @@ +[[audit-events]] += Audit Events (`auditevents`) + +The `auditevents` endpoint provides information about the application's audit events. + + + +[[audit-events-retrieving]] +== Retrieving Audit Events + +To retrieve the audit events, make a `GET` request to `/actuator/auditevents`, as shown in the following curl-based example: + +include::{snippets}/auditevents/filtered/curl-request.adoc[] + +The preceding example retrieves `logout` events for the principal, `alice`, that occurred after 09:37 on 7 November 2017 in the UTC timezone. +The resulting response is similar to the following: + +include::{snippets}/auditevents/filtered/http-response.adoc[] + + + +[[audit-events-retrieving-query-parameters]] +=== Query Parameters + +The endpoint uses query parameters to limit the events that it returns. +The following table shows the supported query parameters: + +[cols="2,4"] +include::{snippets}/auditevents/filtered/request-parameters.adoc[] + + + +[[audit-events-retrieving-response-structure]] +=== Response Structure + +The response contains details of all of the audit events that matched the query. +The following table describes the structure of the response: + +[cols="2,1,3"] +include::{snippets}/auditevents/all/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/beans.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/beans.adoc new file mode 100644 index 0000000000..e3307538ba --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/beans.adoc @@ -0,0 +1,28 @@ +[[beans]] += Beans (`beans`) + +The `beans` endpoint provides information about the application's beans. + + + +[[beans-retrieving]] +== Retrieving the Beans + +To retrieve the beans, make a `GET` request to `/actuator/beans`, as shown in the following curl-based example: + +include::{snippets}/beans/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/beans/http-response.adoc[] + + + +[[beans-retrieving-response-structure]] +=== Response Structure + +The response contains details of the application's beans. +The following table describes the structure of the response: + +[cols="2,1,3"] +include::{snippets}/beans/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/caches.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/caches.adoc new file mode 100644 index 0000000000..f6057a656d --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/caches.adoc @@ -0,0 +1,89 @@ +[[caches]] += Caches (`caches`) + +The `caches` endpoint provides access to the application's caches. + + + +[[caches-all]] +== Retrieving All Caches +To retrieve the application's caches, make a `GET` request to `/actuator/caches`, as shown in the following curl-based example: + +include::{snippets}/caches/all/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/caches/all/http-response.adoc[] + + + +[[caches-all-response-structure]] +=== Response Structure +The response contains details of the application's caches. +The following table describes the structure of the response: + +[cols="3,1,3"] +include::{snippets}/caches/all/response-fields.adoc[] + + + +[[caches-named]] +== Retrieving Caches by Name +To retrieve a cache by name, make a `GET` request to `/actuator/caches/\{name}`, as shown in the following curl-based example: + +include::{snippets}/caches/named/curl-request.adoc[] + +The preceding example retrieves information about the cache named `cities`. +The resulting response is similar to the following: + +include::{snippets}/caches/named/http-response.adoc[] + + + +[[caches-named-query-parameters]] +=== Query Parameters +If the requested name is specific enough to identify a single cache, no extra parameter is required. +Otherwise, the `cacheManager` must be specified. +The following table shows the supported query parameters: + +[cols="2,4"] +include::{snippets}/caches/named/request-parameters.adoc[] + + + +[[caches-named-response-structure]] +=== Response Structure +The response contains details of the requested cache. +The following table describes the structure of the response: + +[cols="3,1,3"] +include::{snippets}/caches/named/response-fields.adoc[] + + + +[[caches-evict-all]] +== Evict All Caches +To clear all available caches, make a `DELETE` request to `/actuator/caches` as shown in the following curl-based example: + +include::{snippets}/caches/evict-all/curl-request.adoc[] + + + +[[caches-evict-named]] +== Evict a Cache by Name +To evict a particular cache, make a `DELETE` request to `/actuator/caches/\{name}` as shown in the following curl-based example: + +include::{snippets}/caches/evict-named/curl-request.adoc[] + +NOTE: As there are two caches named `countries`, the `cacheManager` has to be provided to specify which `Cache` should be cleared. + + + +[[caches-evict-named-request-structure]] +=== Request Structure +If the requested name is specific enough to identify a single cache, no extra parameter is required. +Otherwise, the `cacheManager` must be specified. +The following table shows the supported query parameters: + +[cols="2,4"] +include::{snippets}/caches/evict-named/request-parameters.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/conditions.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/conditions.adoc new file mode 100644 index 0000000000..2477015d83 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/conditions.adoc @@ -0,0 +1,28 @@ +[[conditions]] += Conditions Evaluation Report (`conditions`) + +The `conditions` endpoint provides information about the evaluation of conditions on configuration and auto-configuration classes. + + + +[[conditions-retrieving]] +== Retrieving the Report + +To retrieve the report, make a `GET` request to `/actuator/conditions`, as shown in the following curl-based example: + +include::{snippets}/conditions/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/conditions/http-response.adoc[] + + + +[[conditions-retrieving-response-structure]] +=== Response Structure + +The response contains details of the application's condition evaluation. +The following table describes the structure of the response: + +[cols="3,1,3"] +include::{snippets}/conditions/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/configprops.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/configprops.adoc new file mode 100644 index 0000000000..1f251b9c2e --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/configprops.adoc @@ -0,0 +1,28 @@ +[[configprops]] += Configuration Properties (`configprops`) + +The `configprops` endpoint provides information about the application's `@ConfigurationProperties` beans. + + + +[[configprops-retrieving]] +== Retrieving the `@ConfigurationProperties` Bean + +To retrieve the `@ConfigurationProperties` beans, make a `GET` request to `/actuator/configprops`, as shown in the following curl-based example: + +include::{snippets}/configprops/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/configprops/http-response.adoc[] + + + +[[configprops-retrieving-response-structure]] +=== Response Structure + +The response contains details of the application's `@ConfigurationProperties` beans. +The following table describes the structure of the response: + +[cols="2,1,3"] +include::{snippets}/configprops/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/env.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/env.adoc new file mode 100644 index 0000000000..4b624946db --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/env.adoc @@ -0,0 +1,53 @@ +[[env]] += Environment (`env`) + +The `env` endpoint provides information about the application's `Environment`. + + + +[[env-entire]] +== Retrieving the Entire Environment + +To retrieve the entire environment, make a `GET` request to `/actuator/env`, as shown in the following curl-based example: + +include::{snippets}/env/all/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/env/all/http-response.adoc[] + + + +[[env-entire-response-structure]] +=== Response Structure + +The response contains details of the application's `Environment`. +The following table describes the structure of the response: + +[cols="3,1,3"] +include::{snippets}/env/all/response-fields.adoc[] + + + +[[env-single-property]] +== Retrieving a Single Property + +To retrieve a single property, make a `GET` request to `/actuator/env/{property.name}`, as shown in the following curl-based example: + +include::{snippets}/env/single/curl-request.adoc[] + +The preceding example retrieves information about the property named `com.example.cache.max-size`. +The resulting response is similar to the following: + +include::{snippets}/env/single/http-response.adoc[] + + + +[[env-single-response-structure]] +=== Response Structure + +The response contains details of the requested property. +The following table describes the structure of the response: + +[cols="3,1,3"] +include::{snippets}/env/single/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/flyway.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/flyway.adoc new file mode 100644 index 0000000000..d70b0e6a56 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/flyway.adoc @@ -0,0 +1,28 @@ +[[flyway]] += Flyway (`flyway`) + +The `flyway` endpoint provides information about database migrations performed by Flyway. + + + +[[flyway-retrieving]] +== Retrieving the Migrations + +To retrieve the migrations, make a `GET` request to `/actuator/flyway`, as shown in the following curl-based example: + +include::{snippets}/flyway/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/flyway/http-response.adoc[] + + + +[[flyway-retrieving-response-structure]] +=== Response Structure + +The response contains details of the application's Flyway migrations. +The following table describes the structure of the response: + +[cols="2,1,3"] +include::{snippets}/flyway/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/health.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/health.adoc new file mode 100644 index 0000000000..6cbaf51771 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/health.adoc @@ -0,0 +1,75 @@ +[[health]] += Health (`health`) +The `health` endpoint provides detailed information about the health of the application. + + + +[[health-retrieving]] +== Retrieving the Health of the application +To retrieve the health of the application, make a `GET` request to `/actuator/health`, as shown in the following curl-based example: + +include::{snippets}/health/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/health/http-response.adoc[] + + + +[[health-retrieving-response-structure]] +=== Response Structure +The response contains details of the health of the application. +The following table describes the structure of the response: + +[cols="2,1,3"] +include::{snippets}/health/response-fields.adoc[] + +NOTE: The response fields above are for the V3 API. +If you need to return V2 JSON you should use an accept header or `application/vnd.spring-boot.actuator.v2+json` + + + +[[health-retrieving-component]] +== Retrieving the Health of a component +To retrieve the health of a particular component of the application's health, make a `GET` request to `/actuator/health/\{component}`, as shown in the following curl-based example: + +include::{snippets}/health/component/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/health/component/http-response.adoc[] + + + +[[health-retrieving-component-response-structure]] +=== Response Structure +The response contains details of the health of a particular component of the application's health. +The following table describes the structure of the response: + +[cols="2,1,3"] +include::{snippets}/health/component/response-fields.adoc[] + + + +[[health-retrieving-component-nested]] +== Retrieving the Health of a nested component +If a particular component contains other nested components (as the `broker` indicator in the example above), the health of such a nested component can be retrieved by issuing a `GET` request to `/actuator/health/\{component}/\{subcomponent}`, as shown in the following curl-based example: + +include::{snippets}/health/instance/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/health/instance/http-response.adoc[] + +Components of an application's health may be nested arbitrarily deep depending on the application's health indicators and how they have been grouped. +The health endpoint supports any number of `/\{component}` identifiers in the URL to allow the health of a component at any depth to be retrieved. + + + +[[health-retrieving-component-instance-response-structure]] +=== Response Structure +The response contains details of the health of an instance of a particular component of the application. +The following table describes the structure of the response: + +[cols="2,1,3"] +include::{snippets}/health/instance/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/heapdump.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/heapdump.adoc new file mode 100644 index 0000000000..57488cb017 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/heapdump.adoc @@ -0,0 +1,18 @@ +[[heapdump]] += Heap Dump (`heapdump`) + +The `heapdump` endpoint provides a heap dump from the application's JVM. + + + +[[heapdump-retrieving]] +== Retrieving the Heap Dump + +To retrieve the heap dump, make a `GET` request to `/actuator/heapdump`. +The response is binary data in https://docs.oracle.com/javase/8/docs/technotes/samples/hprof.html[HPROF] format and can be large. +Typically, you should save the response to disk for subsequent analysis. +When using curl, this can be achieved by using the `-O` option, as shown in the following example: + +include::{snippets}/heapdump/curl-request.adoc[] + +The preceding example results in a file named `heapdump` being written to the current working directory. diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/httptrace.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/httptrace.adoc new file mode 100644 index 0000000000..b7937e57a2 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/httptrace.adoc @@ -0,0 +1,28 @@ +[[http-trace]] += HTTP Trace (`httptrace`) + +The `httptrace` endpoint provides information about HTTP request-response exchanges. + + + +[[http-trace-retrieving]] +== Retrieving the Traces + +To retrieve the traces, make a `GET` request to `/actuator/httptrace`, as shown in the following curl-based example: + +include::{snippets}/httptrace/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/httptrace/http-response.adoc[] + + + +[[http-trace-retrieving-response-structure]] +=== Response Structure + +The response contains details of the traced HTTP request-response exchanges. +The following table describes the structure of the response: + +[cols="2,1,3"] +include::{snippets}/httptrace/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/info.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/info.adoc new file mode 100644 index 0000000000..91f884face --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/info.adoc @@ -0,0 +1,46 @@ +[[info]] += Info (`info`) + +The `info` endpoint provides general information about the application. + + + +[[info-retrieving]] +== Retrieving the Info + +To retrieve the information about the application, make a `GET` request to `/actuator/info`, as shown in the following curl-based example: + +include::{snippets}/info/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/info/http-response.adoc[] + + + +[[info-retrieving-response-structure]] +=== Response Structure + +The response contains general information about the application. +Each section of the response is contributed by an `InfoContributor`. +Spring Boot provides `build` and `git` contributions. + + + +[[info-retrieving-response-structure-build]] +==== `build` Response Structure + +The following table describe the structure of the `build` section of the response: + +[cols="2,1,3"] +include::{snippets}/info/response-fields-beneath-build.adoc[] + + + +[[info-retrieving-response-structure-git]] +==== `git` Response Structure + +The following table describes the structure of the `git` section of the response: + +[cols="2,1,3"] +include::{snippets}/info/response-fields-beneath-git.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/integrationgraph.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/integrationgraph.adoc new file mode 100644 index 0000000000..5a2b28a63a --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/integrationgraph.adoc @@ -0,0 +1,35 @@ +[[integrationgraph]] += Spring Integration graph (`integrationgraph`) + +The `integrationgraph` endpoint exposes a graph containing all Spring Integration components. + + + +[[integrationgraph-retrieving]] +== Retrieving the Spring Integration graph +To retrieve the information about the application, make a `GET` request to `/actuator/integrationgraph`, as shown in the following curl-based example: + +include::{snippets}/integrationgraph/graph/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/integrationgraph/graph/http-response.adoc[] + + + +[[integrationgraph-retrieving-response-structure]] +=== Response Structure +The response contains all Spring Integration components used within the application, as well as the links between them. +More information about the structure can be found in the https://docs.spring.io/spring-integration/reference/html/#integration-graph[reference documentation]. + + + +[[integrationgraph-rebuilding]] +== Rebuilding the Spring Integration graph +To rebuild the exposed graph, make a `POST` request to `/actuator/integrationgraph`, as shown in the following curl-based example: + +include::{snippets}/integrationgraph/rebuild/curl-request.adoc[] + +This will result in a `204 - No Content` response: + +include::{snippets}/integrationgraph/rebuild/http-response.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/liquibase.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/liquibase.adoc new file mode 100644 index 0000000000..a517d85cce --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/liquibase.adoc @@ -0,0 +1,28 @@ +[[liquibase]] += Liquibase (`liquibase`) + +The `liquibase` endpoint provides information about database change sets applied by Liquibase. + + + +[[liquibase-retrieving]] +== Retrieving the Changes + +To retrieve the changes, make a `GET` request to `/actuator/liquibase`, as shown in the following curl-based example: + +include::{snippets}/liquibase/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/liquibase/http-response.adoc[] + + + +[[liquibase-retrieving-response-structure]] +=== Response Structure + +The response contains details of the application's Liquibase change sets. +The following table describes the structure of the response: + +[cols="2,1,3"] +include::{snippets}/liquibase/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/logfile.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/logfile.adoc new file mode 100644 index 0000000000..9fd1dc8658 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/logfile.adoc @@ -0,0 +1,33 @@ +[[log-file]] += Log File (`logfile`) + +The `logfile` endpoint provides access to the contents of the application's log file. + + + +[[logfile-retrieving]] +== Retrieving the Log File + +To retrieve the log file, make a `GET` request to `/actuator/logfile`, as shown in the following curl-based example: + +include::{snippets}/logfile/entire/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/logfile/entire/http-response.adoc[] + + + +[[logfile-retrieving-part]] +== Retrieving Part of the Log File + +NOTE: Retrieving part of the log file is not supported when using Jersey. + +To retrieve part of the log file, make a `GET` request to `/actuator/logfile` by using the `Range` header, as shown in the following curl-based example: + +include::{snippets}/logfile/range/curl-request.adoc[] + +The preceding example retrieves the first 1024 bytes of the log file. +The resulting response is similar to the following: + +include::{snippets}/logfile/range/http-response.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/loggers.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/loggers.adoc new file mode 100644 index 0000000000..5e88b104e4 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/loggers.adoc @@ -0,0 +1,134 @@ +[[loggers]] += Loggers (`loggers`) + +The `loggers` endpoint provides access to the application's loggers and the configuration of their levels. + + + +[[loggers-all]] +== Retrieving All Loggers + +To retrieve the application's loggers, make a `GET` request to `/actuator/loggers`, as shown in the following curl-based example: + +include::{snippets}/loggers/all/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/loggers/all/http-response.adoc[] + + + +[[loggers-all-response-structure]] +=== Response Structure + +The response contains details of the application's loggers. +The following table describes the structure of the response: + +[cols="3,1,3"] +include::{snippets}/loggers/all/response-fields.adoc[] + + + +[[loggers-single]] +== Retrieving a Single Logger + +To retrieve a single logger, make a `GET` request to `/actuator/loggers/{logger.name}`, as shown in the following curl-based example: + +include::{snippets}/loggers/single/curl-request.adoc[] + +The preceding example retrieves information about the logger named `com.example`. +The resulting response is similar to the following: + +include::{snippets}/loggers/single/http-response.adoc[] + + + +[[loggers-single-response-structure]] +=== Response Structure + +The response contains details of the requested logger. +The following table describes the structure of the response: + +[cols="3,1,3"] +include::{snippets}/loggers/single/response-fields.adoc[] + + + +[[loggers-group]] +== Retrieving a Single Group + +To retrieve a single group, make a `GET` request to `/actuator/loggers/{group.name}`, +as shown in the following curl-based example: + +include::{snippets}/loggers/group/curl-request.adoc[] + +The preceding example retrieves information about the logger group named `test`. +The resulting response is similar to the following: + +include::{snippets}/loggers/group/http-response.adoc[] + + + +[[loggers-group-response-structure]] +=== Response Structure + +The response contains details of the requested group. +The following table describes the structure of the response: + +[cols="3,1,3"] +include::{snippets}/loggers/group/response-fields.adoc[] + + + +[[loggers-setting-level]] +== Setting a Log Level + +To set the level of a logger, make a `POST` request to `/actuator/loggers/{logger.name}` with a JSON body that specifies the configured level for the logger, as shown in the following curl-based example: + +include::{snippets}/loggers/set/curl-request.adoc[] + +The preceding example sets the `configuredLevel` of the `com.example` logger to `DEBUG`. + + + +[[loggers-setting-level-request-structure]] +=== Request Structure + +The request specifies the desired level of the logger. +The following table describes the structure of the request: + +[cols="3,1,3"] +include::{snippets}/loggers/set/request-fields.adoc[] + + + +[[loggers-group-setting-level]] +== Setting a Log Level for a Group + +To set the level of a logger, make a `POST` request to `/actuator/loggers/{group.name}` with a JSON body that specifies the configured level for the logger group, as shown in the following curl-based example: + +include::{snippets}/loggers/setGroup/curl-request.adoc[] + +The preceding example sets the `configuredLevel` of the `test` logger group to `DEBUG`. + + + +[[loggers-group-setting-level-request-structure]] +=== Request Structure + +The request specifies the desired level of the logger group. +The following table describes the structure of the request: + +[cols="3,1,3"] +include::{snippets}/loggers/set/request-fields.adoc[] + + + +[[loggers-clearing-level]] +== Clearing a Log Level + +To clear the level of a logger, make a `POST` request to `/actuator/loggers/{logger.name}` with a JSON body containing an empty object, as shown in the following curl-based example: + +include::{snippets}/loggers/clear/curl-request.adoc[] + +The preceding example clears the configured level of the `com.example` logger. diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/mappings.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/mappings.adoc new file mode 100644 index 0000000000..20ac03e0f7 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/mappings.adoc @@ -0,0 +1,74 @@ +[[mappings]] += Mappings (`mappings`) + +The `mappings` endpoint provides information about the application's request mappings. + + + +[[mappings-retrieving]] +== Retrieving the Mappings + +To retrieve the mappings, make a `GET` request to `/actuator/mappings`, as shown in the following curl-based example: + +include::{snippets}/mappings/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/mappings/http-response.adoc[] + + + +[[mappings-retrieving-response-structure]] +=== Response Structure + +The response contains details of the application's mappings. +The items found in the response depend on the type of web application (reactive or Servlet-based). +The following table describes the structure of the common elements of the response: + +[cols="2,1,3"] +include::{snippets}/mappings/response-fields.adoc[] + +The entries that may be found in `contexts.*.mappings` are described in the following sections. + + +[[mappings-retrieving-response-structure-dispatcher-servlets]] +=== Dispatcher Servlets Response Structure + +When using Spring MVC, the response contains details of any `DispatcherServlet` request mappings beneath `contexts.*.mappings.dispatcherServlets`. +The following table describes the structure of this section of the response: + +[cols="4,1,2"] +include::{snippets}/mappings/response-fields-dispatcher-servlets.adoc[] + + + +[[mappings-retrieving-response-structure-servlets]] +=== Servlets Response Structure + +When using the Servlet stack, the response contains details of any `Servlet` mappings beneath `contexts.*.mappings.servlets`. +The following table describes the structure of this section of the response: + +[cols="2,1,3"] +include::{snippets}/mappings/response-fields-servlets.adoc[] + + + +[[mappings-retrieving-response-structure-servlet-filters]] +=== Servlet Filters Response Structure + +When using the Servlet stack, the response contains details of any `Filter` mappings beneath `contexts.*.mappings.servletFilters`. +The following table describes the structure of this section of the response: + +[cols="2,1,3"] +include::{snippets}/mappings/response-fields-servlet-filters.adoc[] + + + +[[mappings-retrieving-response-structure-dispatcher-handlers]] +=== Dispatcher Handlers Response Structure + +When using Spring WebFlux, the response contains details of any `DispatcherHandler` request mappings beneath `contexts.*.mappings.dispatcherHandlers`. +The following table describes the structure of this section of the response: + +[cols="4,1,2"] +include::{snippets}/mappings/response-fields-dispatcher-handlers.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/metrics.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/metrics.adoc new file mode 100644 index 0000000000..ac5430abe8 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/metrics.adoc @@ -0,0 +1,76 @@ +[[metrics]] += Metrics (`metrics`) + +The `metrics` endpoint provides access to application metrics. + + + +[[metrics-retrieving-names]] +== Retrieving Metric Names + +To retrieve the names of the available metrics, make a `GET` request to `/actuator/metrics`, as shown in the following curl-based example: + +include::{snippets}/metrics/names/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/metrics/names/http-response.adoc[] + + + +[[metrics-retrieving-names-response-structure]] +=== Response Structure + +The response contains details of the metric names. +The following table describes the structure of the response: + +[cols="3,1,2"] +include::{snippets}/metrics/names/response-fields.adoc[] + + + +[[metrics-retrieving-metric]] +== Retrieving a Metric + +To retrieve a metric, make a `GET` request to `/actuator/metrics/{metric.name}`, as shown in the following curl-based example: + +include::{snippets}/metrics/metric/curl-request.adoc[] + +The preceding example retrieves information about the metric named `jvm.memory.max`. +The resulting response is similar to the following: + +include::{snippets}/metrics/metric/http-response.adoc[] + + + +[[metrics-retrieving-metric-query-parameters]] +=== Query Parameters + +The endpoint uses query parameters to <> into a metric by using its tags. +The following table shows the single supported query parameter: + +[cols="2,4"] +include::{snippets}/metrics/metric-with-tags/request-parameters.adoc[] + + + +[[metrics-retrieving-metric-response-structure]] +=== Response structure + +The response contains details of the metric. +The following table describes the structure of the response: + +include::{snippets}/metrics/metric/response-fields.adoc[] + + +[[metrics-drilling-down]] +== Drilling Down + +To drill down into a metric, make a `GET` request to `/actuator/metrics/{metric.name}` using the `tag` query parameter, as shown in the following curl-based example: + +include::{snippets}/metrics/metric-with-tags/curl-request.adoc[] + +The preceding example retrieves the `jvm.memory.max` metric, where the `area` tag has a value of `nonheap` and the `id` attribute has a value of `Compressed Class Space`. +The resulting response is similar to the following: + +include::{snippets}/metrics/metric-with-tags/http-response.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/prometheus.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/prometheus.adoc new file mode 100644 index 0000000000..16d2205ba4 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/prometheus.adoc @@ -0,0 +1,17 @@ +[[prometheus]] += Prometheus (`prometheus`) + +The `prometheus` endpoint provides Spring Boot application's metrics in the format required for scraping by a Prometheus server. + + + +[[prometheus-retrieving]] +== Retrieving the Metrics + +To retrieve the metrics, make a `GET` request to `/actuator/prometheus`, as shown in the following curl-based example: + +include::{snippets}/prometheus/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/prometheus/http-response.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/scheduledtasks.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/scheduledtasks.adoc new file mode 100644 index 0000000000..1e69e6046a --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/scheduledtasks.adoc @@ -0,0 +1,28 @@ +[[scheduled-tasks]] += Scheduled Tasks (`scheduledtasks`) + +The `scheduledtasks` endpoint provides information about the application's scheduled tasks. + + + +[[scheduled-tasks-retrieving]] +== Retrieving the Scheduled Tasks + +To retrieve the scheduled tasks, make a `GET` request to `/actuator/scheduledtasks`, as shown in the following curl-based example: + +include::{snippets}/scheduled-tasks/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/scheduled-tasks/http-response.adoc[] + + + +[[scheduled-tasks-retrieving-response-structure]] +=== Response Structure + +The response contains details of the application's scheduled tasks. +The following table describes the structure of the response: + +[cols="2,1,3"] +include::{snippets}/scheduled-tasks/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/sessions.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/sessions.adoc new file mode 100644 index 0000000000..01f2d8a842 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/sessions.adoc @@ -0,0 +1,76 @@ +[[sessions]] += Sessions (`sessions`) + +The `sessions` endpoint provides information about the application's HTTP sessions that are managed by Spring Session. + + + +[[sessions-retrieving]] +== Retrieving Sessions + +To retrieve the sessions, make a `GET` request to `/actuator/sessions`, as shown in the following curl-based example: + +include::{snippets}/sessions/username/curl-request.adoc[] + +The preceding examples retrieves all of the sessions for the user whose username is `alice`. +The resulting response is similar to the following: + +include::{snippets}/sessions/username/http-response.adoc[] + + + +[[sessions-retrieving-query-parameters]] +=== Query Parameters + +The endpoint uses query parameters to limit the sessions that it returns. +The following table shows the single required query parameter: + +[cols="2,4"] +include::{snippets}/sessions/username/request-parameters.adoc[] + + + +[[sessions-retrieving-response-structure]] +=== Response Structure + +The response contains details of the matching sessions. +The following table describes the structure of the response: + +[cols="3,1,3"] +include::{snippets}/sessions/username/response-fields.adoc[] + + + +[[sessions-retrieving-id]] +== Retrieving a Single Session + +To retrieve a single session, make a `GET` request to `/actuator/sessions/\{id}`, as shown in the following curl-based example: + +include::{snippets}/sessions/id/curl-request.adoc[] + +The preceding example retrieves the session with the `id` of `4db5efcc-99cb-4d05-a52c-b49acfbb7ea9`. +The resulting response is similar to the following: + +include::{snippets}/sessions/id/http-response.adoc[] + + + +[[sessions-retrieving-id-response-structure]] +=== Response Structure + +The response contains details of the requested session. +The following table describes the structure of the response: + +[cols="3,1,3"] +include::{snippets}/sessions/id/response-fields.adoc[] + + + +[[sessions-deleting]] +== Deleting a Session + +To delete a session, make a `DELETE` request to `/actuator/sessions/\{id}`, as shown in the following curl-based example: + +include::{snippets}/sessions/delete/curl-request.adoc[] + +The preceding example deletes the session with the `id` of `4db5efcc-99cb-4d05-a52c-b49acfbb7ea9`. diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/shutdown.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/shutdown.adoc new file mode 100644 index 0000000000..2231904f67 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/shutdown.adoc @@ -0,0 +1,28 @@ +[[shutdown]] += Shutdown (`shutdown`) + +The `shutdown` endpoint is used to shut down the application. + + + +[[shutdown-shutting-down]] +== Shutting Down the Application + +To shut down the application, make a `POST` request to `/actuator/shutdown`, as shown in the following curl-based example: + +include::{snippets}/shutdown/curl-request.adoc[] + +A response similar to the following is produced: + +include::{snippets}/shutdown/http-response.adoc[] + + + +[[shutdown-shutting-down-response-structure]] +=== Response Structure + +The response contains details of the result of the shutdown request. +The following table describes the structure of the response: + +[cols="3,1,3"] +include::{snippets}/shutdown/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/threaddump.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/threaddump.adoc new file mode 100644 index 0000000000..e141296d70 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/endpoints/threaddump.adoc @@ -0,0 +1,42 @@ +[[threaddump]] += Thread Dump (`threaddump`) + +The `threaddump` endpoint provides a thread dump from the application's JVM. + + + +[[threaddump-retrieving-json]] +== Retrieving the Thread Dump as JSON + +To retrieve the thread dump as JSON, make a `GET` request to `/actuator/threaddump` with an appropriate `Accept` header, as shown in the following curl-based example: + +include::{snippets}/threaddump/json/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/threaddump/json/http-response.adoc[] + + + +[[threaddump-retrieving-json-response-structure]] +=== Response Structure + +The response contains details of the JVM's threads. +The following table describes the structure of the response: + +[cols="3,1,2"] +include::{snippets}/threaddump/json/response-fields.adoc[] + + + +[[threaddump-retrieving-text]] +== Retrieving the Thread Dump as Text + +To retrieve the thread dump as text, make a `GET` request to `/actuator/threaddump` that +accepts `text/plain`, as shown in the following curl-based example: + +include::{snippets}/threaddump/text/curl-request.adoc[] + +The resulting response is similar to the following: + +include::{snippets}/threaddump/text/http-response.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/index.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/index.adoc similarity index 100% rename from spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/index.adoc rename to spring-boot-project/spring-boot-actuator-autoconfigure/src/docs/asciidoc/index.adoc diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/auditevents.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/auditevents.adoc deleted file mode 100644 index 91dac834d5..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/auditevents.adoc +++ /dev/null @@ -1,40 +0,0 @@ -[[audit-events]] -= Audit Events (`auditevents`) - -The `auditevents` endpoint provides information about the application's audit events. - - - -[[audit-events-retrieving]] -== Retrieving Audit Events - -To retrieve the audit events, make a `GET` request to `/actuator/auditevents`, as shown in the following curl-based example: - -include::{snippets}auditevents/filtered/curl-request.adoc[] - -The preceding example retrieves `logout` events for the principal, `alice`, that occurred after 09:37 on 7 November 2017 in the UTC timezone. -The resulting response is similar to the following: - -include::{snippets}auditevents/filtered/http-response.adoc[] - - - -[[audit-events-retrieving-query-parameters]] -=== Query Parameters - -The endpoint uses query parameters to limit the events that it returns. -The following table shows the supported query parameters: - -[cols="2,4"] -include::{snippets}auditevents/filtered/request-parameters.adoc[] - - - -[[audit-events-retrieving-response-structure]] -=== Response Structure - -The response contains details of all of the audit events that matched the query. -The following table describes the structure of the response: - -[cols="2,1,3"] -include::{snippets}auditevents/all/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/beans.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/beans.adoc deleted file mode 100644 index 5417a90601..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/beans.adoc +++ /dev/null @@ -1,28 +0,0 @@ -[[beans]] -= Beans (`beans`) - -The `beans` endpoint provides information about the application's beans. - - - -[[beans-retrieving]] -== Retrieving the Beans - -To retrieve the beans, make a `GET` request to `/actuator/beans`, as shown in the following curl-based example: - -include::{snippets}beans/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}beans/http-response.adoc[] - - - -[[beans-retrieving-response-structure]] -=== Response Structure - -The response contains details of the application's beans. -The following table describes the structure of the response: - -[cols="2,1,3"] -include::{snippets}beans/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/caches.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/caches.adoc deleted file mode 100644 index 3f2156a4b9..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/caches.adoc +++ /dev/null @@ -1,89 +0,0 @@ -[[caches]] -= Caches (`caches`) - -The `caches` endpoint provides access to the application's caches. - - - -[[caches-all]] -== Retrieving All Caches -To retrieve the application's caches, make a `GET` request to `/actuator/caches`, as shown in the following curl-based example: - -include::{snippets}caches/all/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}caches/all/http-response.adoc[] - - - -[[caches-all-response-structure]] -=== Response Structure -The response contains details of the application's caches. -The following table describes the structure of the response: - -[cols="3,1,3"] -include::{snippets}caches/all/response-fields.adoc[] - - - -[[caches-named]] -== Retrieving Caches by Name -To retrieve a cache by name, make a `GET` request to `/actuator/caches/\{name}`, as shown in the following curl-based example: - -include::{snippets}caches/named/curl-request.adoc[] - -The preceding example retrieves information about the cache named `cities`. -The resulting response is similar to the following: - -include::{snippets}caches/named/http-response.adoc[] - - - -[[caches-named-query-parameters]] -=== Query Parameters -If the requested name is specific enough to identify a single cache, no extra parameter is required. -Otherwise, the `cacheManager` must be specified. -The following table shows the supported query parameters: - -[cols="2,4"] -include::{snippets}caches/named/request-parameters.adoc[] - - - -[[caches-named-response-structure]] -=== Response Structure -The response contains details of the requested cache. -The following table describes the structure of the response: - -[cols="3,1,3"] -include::{snippets}caches/named/response-fields.adoc[] - - - -[[caches-evict-all]] -== Evict All Caches -To clear all available caches, make a `DELETE` request to `/actuator/caches` as shown in the following curl-based example: - -include::{snippets}caches/evict-all/curl-request.adoc[] - - - -[[caches-evict-named]] -== Evict a Cache by Name -To evict a particular cache, make a `DELETE` request to `/actuator/caches/\{name}` as shown in the following curl-based example: - -include::{snippets}caches/evict-named/curl-request.adoc[] - -NOTE: As there are two caches named `countries`, the `cacheManager` has to be provided to specify which `Cache` should be cleared. - - - -[[caches-evict-named-request-structure]] -=== Request Structure -If the requested name is specific enough to identify a single cache, no extra parameter is required. -Otherwise, the `cacheManager` must be specified. -The following table shows the supported query parameters: - -[cols="2,4"] -include::{snippets}caches/evict-named/request-parameters.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/conditions.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/conditions.adoc deleted file mode 100644 index 26dace0267..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/conditions.adoc +++ /dev/null @@ -1,28 +0,0 @@ -[[conditions]] -= Conditions Evaluation Report (`conditions`) - -The `conditions` endpoint provides information about the evaluation of conditions on configuration and auto-configuration classes. - - - -[[conditions-retrieving]] -== Retrieving the Report - -To retrieve the report, make a `GET` request to `/actuator/conditions`, as shown in the following curl-based example: - -include::{snippets}conditions/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}conditions/http-response.adoc[] - - - -[[conditions-retrieving-response-structure]] -=== Response Structure - -The response contains details of the application's condition evaluation. -The following table describes the structure of the response: - -[cols="3,1,3"] -include::{snippets}conditions/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/configprops.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/configprops.adoc deleted file mode 100644 index 651b0ec512..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/configprops.adoc +++ /dev/null @@ -1,28 +0,0 @@ -[[configprops]] -= Configuration Properties (`configprops`) - -The `configprops` endpoint provides information about the application's `@ConfigurationProperties` beans. - - - -[[configprops-retrieving]] -== Retrieving the `@ConfigurationProperties` Bean - -To retrieve the `@ConfigurationProperties` beans, make a `GET` request to `/actuator/configprops`, as shown in the following curl-based example: - -include::{snippets}configprops/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}configprops/http-response.adoc[] - - - -[[configprops-retrieving-response-structure]] -=== Response Structure - -The response contains details of the application's `@ConfigurationProperties` beans. -The following table describes the structure of the response: - -[cols="2,1,3"] -include::{snippets}configprops/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/env.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/env.adoc deleted file mode 100644 index d7b917ca16..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/env.adoc +++ /dev/null @@ -1,53 +0,0 @@ -[[env]] -= Environment (`env`) - -The `env` endpoint provides information about the application's `Environment`. - - - -[[env-entire]] -== Retrieving the Entire Environment - -To retrieve the entire environment, make a `GET` request to `/actuator/env`, as shown in the following curl-based example: - -include::{snippets}env/all/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}env/all/http-response.adoc[] - - - -[[env-entire-response-structure]] -=== Response Structure - -The response contains details of the application's `Environment`. -The following table describes the structure of the response: - -[cols="3,1,3"] -include::{snippets}env/all/response-fields.adoc[] - - - -[[env-single-property]] -== Retrieving a Single Property - -To retrieve a single property, make a `GET` request to `/actuator/env/{property.name}`, as shown in the following curl-based example: - -include::{snippets}env/single/curl-request.adoc[] - -The preceding example retrieves information about the property named `com.example.cache.max-size`. -The resulting response is similar to the following: - -include::{snippets}env/single/http-response.adoc[] - - - -[[env-single-response-structure]] -=== Response Structure - -The response contains details of the requested property. -The following table describes the structure of the response: - -[cols="3,1,3"] -include::{snippets}env/single/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/flyway.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/flyway.adoc deleted file mode 100644 index 8fe81d6295..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/flyway.adoc +++ /dev/null @@ -1,28 +0,0 @@ -[[flyway]] -= Flyway (`flyway`) - -The `flyway` endpoint provides information about database migrations performed by Flyway. - - - -[[flyway-retrieving]] -== Retrieving the Migrations - -To retrieve the migrations, make a `GET` request to `/actuator/flyway`, as shown in the following curl-based example: - -include::{snippets}flyway/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}flyway/http-response.adoc[] - - - -[[flyway-retrieving-response-structure]] -=== Response Structure - -The response contains details of the application's Flyway migrations. -The following table describes the structure of the response: - -[cols="2,1,3"] -include::{snippets}flyway/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/health.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/health.adoc deleted file mode 100644 index a7c1998dde..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/health.adoc +++ /dev/null @@ -1,75 +0,0 @@ -[[health]] -= Health (`health`) -The `health` endpoint provides detailed information about the health of the application. - - - -[[health-retrieving]] -== Retrieving the Health of the application -To retrieve the health of the application, make a `GET` request to `/actuator/health`, as shown in the following curl-based example: - -include::{snippets}health/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}health/http-response.adoc[] - - - -[[health-retrieving-response-structure]] -=== Response Structure -The response contains details of the health of the application. -The following table describes the structure of the response: - -[cols="2,1,3"] -include::{snippets}health/response-fields.adoc[] - -NOTE: The response fields above are for the V3 API. -If you need to return V2 JSON you should use an accept header or `application/vnd.spring-boot.actuator.v2+json` - - - -[[health-retrieving-component]] -== Retrieving the Health of a component -To retrieve the health of a particular component of the application's health, make a `GET` request to `/actuator/health/\{component}`, as shown in the following curl-based example: - -include::{snippets}health/component/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}health/component/http-response.adoc[] - - - -[[health-retrieving-component-response-structure]] -=== Response Structure -The response contains details of the health of a particular component of the application's health. -The following table describes the structure of the response: - -[cols="2,1,3"] -include::{snippets}health/component/response-fields.adoc[] - - - -[[health-retrieving-component-nested]] -== Retrieving the Health of a nested component -If a particular component contains other nested components (as the `broker` indicator in the example above), the health of such a nested component can be retrieved by issuing a `GET` request to `/actuator/health/\{component}/\{subcomponent}`, as shown in the following curl-based example: - -include::{snippets}health/instance/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}health/instance/http-response.adoc[] - -Components of an application's health may be nested arbitrarily deep depending on the application's health indicators and how they have been grouped. -The health endpoint supports any number of `/\{component}` identifiers in the URL to allow the health of a component at any depth to be retrieved. - - - -[[health-retrieving-component-instance-response-structure]] -=== Response Structure -The response contains details of the health of an instance of a particular component of the application. -The following table describes the structure of the response: - -[cols="2,1,3"] -include::{snippets}health/instance/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/heapdump.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/heapdump.adoc deleted file mode 100644 index ebbba69207..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/heapdump.adoc +++ /dev/null @@ -1,18 +0,0 @@ -[[heapdump]] -= Heap Dump (`heapdump`) - -The `heapdump` endpoint provides a heap dump from the application's JVM. - - - -[[heapdump-retrieving]] -== Retrieving the Heap Dump - -To retrieve the heap dump, make a `GET` request to `/actuator/heapdump`. -The response is binary data in https://docs.oracle.com/javase/8/docs/technotes/samples/hprof.html[HPROF] format and can be large. -Typically, you should save the response to disk for subsequent analysis. -When using curl, this can be achieved by using the `-O` option, as shown in the following example: - -include::{snippets}heapdump/curl-request.adoc[] - -The preceding example results in a file named `heapdump` being written to the current working directory. diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/httptrace.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/httptrace.adoc deleted file mode 100644 index ea1149f9ef..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/httptrace.adoc +++ /dev/null @@ -1,28 +0,0 @@ -[[http-trace]] -= HTTP Trace (`httptrace`) - -The `httptrace` endpoint provides information about HTTP request-response exchanges. - - - -[[http-trace-retrieving]] -== Retrieving the Traces - -To retrieve the traces, make a `GET` request to `/actuator/httptrace`, as shown in the following curl-based example: - -include::{snippets}httptrace/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}httptrace/http-response.adoc[] - - - -[[http-trace-retrieving-response-structure]] -=== Response Structure - -The response contains details of the traced HTTP request-response exchanges. -The following table describes the structure of the response: - -[cols="2,1,3"] -include::{snippets}httptrace/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/info.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/info.adoc deleted file mode 100644 index f431c3a8d8..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/info.adoc +++ /dev/null @@ -1,46 +0,0 @@ -[[info]] -= Info (`info`) - -The `info` endpoint provides general information about the application. - - - -[[info-retrieving]] -== Retrieving the Info - -To retrieve the information about the application, make a `GET` request to `/actuator/info`, as shown in the following curl-based example: - -include::{snippets}info/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}info/http-response.adoc[] - - - -[[info-retrieving-response-structure]] -=== Response Structure - -The response contains general information about the application. -Each section of the response is contributed by an `InfoContributor`. -Spring Boot provides `build` and `git` contributions. - - - -[[info-retrieving-response-structure-build]] -==== `build` Response Structure - -The following table describe the structure of the `build` section of the response: - -[cols="2,1,3"] -include::{snippets}info/response-fields-beneath-build.adoc[] - - - -[[info-retrieving-response-structure-git]] -==== `git` Response Structure - -The following table describes the structure of the `git` section of the response: - -[cols="2,1,3"] -include::{snippets}info/response-fields-beneath-git.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/integrationgraph.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/integrationgraph.adoc deleted file mode 100644 index e2d3274729..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/integrationgraph.adoc +++ /dev/null @@ -1,35 +0,0 @@ -[[integrationgraph]] -= Spring Integration graph (`integrationgraph`) - -The `integrationgraph` endpoint exposes a graph containing all Spring Integration components. - - - -[[integrationgraph-retrieving]] -== Retrieving the Spring Integration graph -To retrieve the information about the application, make a `GET` request to `/actuator/integrationgraph`, as shown in the following curl-based example: - -include::{snippets}integrationgraph/graph/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}integrationgraph/graph/http-response.adoc[] - - - -[[integrationgraph-retrieving-response-structure]] -=== Response Structure -The response contains all Spring Integration components used within the application, as well as the links between them. -More information about the structure can be found in the https://docs.spring.io/spring-integration/reference/html/#integration-graph[reference documentation]. - - - -[[integrationgraph-rebuilding]] -== Rebuilding the Spring Integration graph -To rebuild the exposed graph, make a `POST` request to `/actuator/integrationgraph`, as shown in the following curl-based example: - -include::{snippets}integrationgraph/rebuild/curl-request.adoc[] - -This will result in a `204 - No Content` response: - -include::{snippets}integrationgraph/rebuild/http-response.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/liquibase.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/liquibase.adoc deleted file mode 100644 index 1e84c8efac..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/liquibase.adoc +++ /dev/null @@ -1,28 +0,0 @@ -[[liquibase]] -= Liquibase (`liquibase`) - -The `liquibase` endpoint provides information about database change sets applied by Liquibase. - - - -[[liquibase-retrieving]] -== Retrieving the Changes - -To retrieve the changes, make a `GET` request to `/actuator/liquibase`, as shown in the following curl-based example: - -include::{snippets}liquibase/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}liquibase/http-response.adoc[] - - - -[[liquibase-retrieving-response-structure]] -=== Response Structure - -The response contains details of the application's Liquibase change sets. -The following table describes the structure of the response: - -[cols="2,1,3"] -include::{snippets}liquibase/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/logfile.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/logfile.adoc deleted file mode 100644 index 99121fc673..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/logfile.adoc +++ /dev/null @@ -1,33 +0,0 @@ -[[log-file]] -= Log File (`logfile`) - -The `logfile` endpoint provides access to the contents of the application's log file. - - - -[[logfile-retrieving]] -== Retrieving the Log File - -To retrieve the log file, make a `GET` request to `/actuator/logfile`, as shown in the following curl-based example: - -include::{snippets}logfile/entire/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}logfile/entire/http-response.adoc[] - - - -[[logfile-retrieving-part]] -== Retrieving Part of the Log File - -NOTE: Retrieving part of the log file is not supported when using Jersey. - -To retrieve part of the log file, make a `GET` request to `/actuator/logfile` by using the `Range` header, as shown in the following curl-based example: - -include::{snippets}logfile/range/curl-request.adoc[] - -The preceding example retrieves the first 1024 bytes of the log file. -The resulting response is similar to the following: - -include::{snippets}logfile/range/http-response.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/loggers.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/loggers.adoc deleted file mode 100644 index e4609c73e7..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/loggers.adoc +++ /dev/null @@ -1,134 +0,0 @@ -[[loggers]] -= Loggers (`loggers`) - -The `loggers` endpoint provides access to the application's loggers and the configuration of their levels. - - - -[[loggers-all]] -== Retrieving All Loggers - -To retrieve the application's loggers, make a `GET` request to `/actuator/loggers`, as shown in the following curl-based example: - -include::{snippets}loggers/all/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}loggers/all/http-response.adoc[] - - - -[[loggers-all-response-structure]] -=== Response Structure - -The response contains details of the application's loggers. -The following table describes the structure of the response: - -[cols="3,1,3"] -include::{snippets}loggers/all/response-fields.adoc[] - - - -[[loggers-single]] -== Retrieving a Single Logger - -To retrieve a single logger, make a `GET` request to `/actuator/loggers/{logger.name}`, as shown in the following curl-based example: - -include::{snippets}loggers/single/curl-request.adoc[] - -The preceding example retrieves information about the logger named `com.example`. -The resulting response is similar to the following: - -include::{snippets}loggers/single/http-response.adoc[] - - - -[[loggers-single-response-structure]] -=== Response Structure - -The response contains details of the requested logger. -The following table describes the structure of the response: - -[cols="3,1,3"] -include::{snippets}loggers/single/response-fields.adoc[] - - - -[[loggers-group]] -== Retrieving a Single Group - -To retrieve a single group, make a `GET` request to `/actuator/loggers/{group.name}`, -as shown in the following curl-based example: - -include::{snippets}loggers/group/curl-request.adoc[] - -The preceding example retrieves information about the logger group named `test`. -The resulting response is similar to the following: - -include::{snippets}loggers/group/http-response.adoc[] - - - -[[loggers-group-response-structure]] -=== Response Structure - -The response contains details of the requested group. -The following table describes the structure of the response: - -[cols="3,1,3"] -include::{snippets}loggers/group/response-fields.adoc[] - - - -[[loggers-setting-level]] -== Setting a Log Level - -To set the level of a logger, make a `POST` request to `/actuator/loggers/{logger.name}` with a JSON body that specifies the configured level for the logger, as shown in the following curl-based example: - -include::{snippets}loggers/set/curl-request.adoc[] - -The preceding example sets the `configuredLevel` of the `com.example` logger to `DEBUG`. - - - -[[loggers-setting-level-request-structure]] -=== Request Structure - -The request specifies the desired level of the logger. -The following table describes the structure of the request: - -[cols="3,1,3"] -include::{snippets}loggers/set/request-fields.adoc[] - - - -[[loggers-group-setting-level]] -== Setting a Log Level for a Group - -To set the level of a logger, make a `POST` request to `/actuator/loggers/{group.name}` with a JSON body that specifies the configured level for the logger group, as shown in the following curl-based example: - -include::{snippets}loggers/setGroup/curl-request.adoc[] - -The preceding example sets the `configuredLevel` of the `test` logger group to `DEBUG`. - - - -[[loggers-group-setting-level-request-structure]] -=== Request Structure - -The request specifies the desired level of the logger group. -The following table describes the structure of the request: - -[cols="3,1,3"] -include::{snippets}loggers/set/request-fields.adoc[] - - - -[[loggers-clearing-level]] -== Clearing a Log Level - -To clear the level of a logger, make a `POST` request to `/actuator/loggers/{logger.name}` with a JSON body containing an empty object, as shown in the following curl-based example: - -include::{snippets}loggers/clear/curl-request.adoc[] - -The preceding example clears the configured level of the `com.example` logger. diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/mappings.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/mappings.adoc deleted file mode 100644 index 1d7371d9e2..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/mappings.adoc +++ /dev/null @@ -1,74 +0,0 @@ -[[mappings]] -= Mappings (`mappings`) - -The `mappings` endpoint provides information about the application's request mappings. - - - -[[mappings-retrieving]] -== Retrieving the Mappings - -To retrieve the mappings, make a `GET` request to `/actuator/mappings`, as shown in the following curl-based example: - -include::{snippets}mappings/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}mappings/http-response.adoc[] - - - -[[mappings-retrieving-response-structure]] -=== Response Structure - -The response contains details of the application's mappings. -The items found in the response depend on the type of web application (reactive or Servlet-based). -The following table describes the structure of the common elements of the response: - -[cols="2,1,3"] -include::{snippets}mappings/response-fields.adoc[] - -The entries that may be found in `contexts.*.mappings` are described in the following sections. - - -[[mappings-retrieving-response-structure-dispatcher-servlets]] -=== Dispatcher Servlets Response Structure - -When using Spring MVC, the response contains details of any `DispatcherServlet` request mappings beneath `contexts.*.mappings.dispatcherServlets`. -The following table describes the structure of this section of the response: - -[cols="4,1,2"] -include::{snippets}mappings/response-fields-dispatcher-servlets.adoc[] - - - -[[mappings-retrieving-response-structure-servlets]] -=== Servlets Response Structure - -When using the Servlet stack, the response contains details of any `Servlet` mappings beneath `contexts.*.mappings.servlets`. -The following table describes the structure of this section of the response: - -[cols="2,1,3"] -include::{snippets}mappings/response-fields-servlets.adoc[] - - - -[[mappings-retrieving-response-structure-servlet-filters]] -=== Servlet Filters Response Structure - -When using the Servlet stack, the response contains details of any `Filter` mappings beneath `contexts.*.mappings.servletFilters`. -The following table describes the structure of this section of the response: - -[cols="2,1,3"] -include::{snippets}mappings/response-fields-servlet-filters.adoc[] - - - -[[mappings-retrieving-response-structure-dispatcher-handlers]] -=== Dispatcher Handlers Response Structure - -When using Spring WebFlux, the response contains details of any `DispatcherHandler` request mappings beneath `contexts.*.mappings.dispatcherHandlers`. -The following table describes the structure of this section of the response: - -[cols="4,1,2"] -include::{snippets}mappings/response-fields-dispatcher-handlers.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/metrics.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/metrics.adoc deleted file mode 100644 index db26c3fd95..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/metrics.adoc +++ /dev/null @@ -1,76 +0,0 @@ -[[metrics]] -= Metrics (`metrics`) - -The `metrics` endpoint provides access to application metrics. - - - -[[metrics-retrieving-names]] -== Retrieving Metric Names - -To retrieve the names of the available metrics, make a `GET` request to `/actuator/metrics`, as shown in the following curl-based example: - -include::{snippets}metrics/names/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}metrics/names/http-response.adoc[] - - - -[[metrics-retrieving-names-response-structure]] -=== Response Structure - -The response contains details of the metric names. -The following table describes the structure of the response: - -[cols="3,1,2"] -include::{snippets}metrics/names/response-fields.adoc[] - - - -[[metrics-retrieving-metric]] -== Retrieving a Metric - -To retrieve a metric, make a `GET` request to `/actuator/metrics/{metric.name}`, as shown in the following curl-based example: - -include::{snippets}metrics/metric/curl-request.adoc[] - -The preceding example retrieves information about the metric named `jvm.memory.max`. -The resulting response is similar to the following: - -include::{snippets}metrics/metric/http-response.adoc[] - - - -[[metrics-retrieving-metric-query-parameters]] -=== Query Parameters - -The endpoint uses query parameters to <> into a metric by using its tags. -The following table shows the single supported query parameter: - -[cols="2,4"] -include::{snippets}metrics/metric-with-tags/request-parameters.adoc[] - - - -[[metrics-retrieving-metric-response-structure]] -=== Response structure - -The response contains details of the metric. -The following table describes the structure of the response: - -include::{snippets}metrics/metric/response-fields.adoc[] - - -[[metrics-drilling-down]] -== Drilling Down - -To drill down into a metric, make a `GET` request to `/actuator/metrics/{metric.name}` using the `tag` query parameter, as shown in the following curl-based example: - -include::{snippets}metrics/metric-with-tags/curl-request.adoc[] - -The preceding example retrieves the `jvm.memory.max` metric, where the `area` tag has a value of `nonheap` and the `id` attribute has a value of `Compressed Class Space`. -The resulting response is similar to the following: - -include::{snippets}metrics/metric-with-tags/http-response.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/prometheus.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/prometheus.adoc deleted file mode 100644 index 1d1006bc37..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/prometheus.adoc +++ /dev/null @@ -1,17 +0,0 @@ -[[prometheus]] -= Prometheus (`prometheus`) - -The `prometheus` endpoint provides Spring Boot application's metrics in the format required for scraping by a Prometheus server. - - - -[[prometheus-retrieving]] -== Retrieving the Metrics - -To retrieve the metrics, make a `GET` request to `/actuator/prometheus`, as shown in the following curl-based example: - -include::{snippets}prometheus/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}prometheus/http-response.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/scheduledtasks.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/scheduledtasks.adoc deleted file mode 100644 index a3a4f3a9a4..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/scheduledtasks.adoc +++ /dev/null @@ -1,28 +0,0 @@ -[[scheduled-tasks]] -= Scheduled Tasks (`scheduledtasks`) - -The `scheduledtasks` endpoint provides information about the application's scheduled tasks. - - - -[[scheduled-tasks-retrieving]] -== Retrieving the Scheduled Tasks - -To retrieve the scheduled tasks, make a `GET` request to `/actuator/scheduledtasks`, as shown in the following curl-based example: - -include::{snippets}scheduled-tasks/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}scheduled-tasks/http-response.adoc[] - - - -[[scheduled-tasks-retrieving-response-structure]] -=== Response Structure - -The response contains details of the application's scheduled tasks. -The following table describes the structure of the response: - -[cols="2,1,3"] -include::{snippets}scheduled-tasks/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/sessions.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/sessions.adoc deleted file mode 100644 index 8cc3508d9e..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/sessions.adoc +++ /dev/null @@ -1,76 +0,0 @@ -[[sessions]] -= Sessions (`sessions`) - -The `sessions` endpoint provides information about the application's HTTP sessions that are managed by Spring Session. - - - -[[sessions-retrieving]] -== Retrieving Sessions - -To retrieve the sessions, make a `GET` request to `/actuator/sessions`, as shown in the following curl-based example: - -include::{snippets}sessions/username/curl-request.adoc[] - -The preceding examples retrieves all of the sessions for the user whose username is `alice`. -The resulting response is similar to the following: - -include::{snippets}sessions/username/http-response.adoc[] - - - -[[sessions-retrieving-query-parameters]] -=== Query Parameters - -The endpoint uses query parameters to limit the sessions that it returns. -The following table shows the single required query parameter: - -[cols="2,4"] -include::{snippets}sessions/username/request-parameters.adoc[] - - - -[[sessions-retrieving-response-structure]] -=== Response Structure - -The response contains details of the matching sessions. -The following table describes the structure of the response: - -[cols="3,1,3"] -include::{snippets}sessions/username/response-fields.adoc[] - - - -[[sessions-retrieving-id]] -== Retrieving a Single Session - -To retrieve a single session, make a `GET` request to `/actuator/sessions/\{id}`, as shown in the following curl-based example: - -include::{snippets}sessions/id/curl-request.adoc[] - -The preceding example retrieves the session with the `id` of `4db5efcc-99cb-4d05-a52c-b49acfbb7ea9`. -The resulting response is similar to the following: - -include::{snippets}sessions/id/http-response.adoc[] - - - -[[sessions-retrieving-id-response-structure]] -=== Response Structure - -The response contains details of the requested session. -The following table describes the structure of the response: - -[cols="3,1,3"] -include::{snippets}sessions/id/response-fields.adoc[] - - - -[[sessions-deleting]] -== Deleting a Session - -To delete a session, make a `DELETE` request to `/actuator/sessions/\{id}`, as shown in the following curl-based example: - -include::{snippets}sessions/delete/curl-request.adoc[] - -The preceding example deletes the session with the `id` of `4db5efcc-99cb-4d05-a52c-b49acfbb7ea9`. diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/shutdown.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/shutdown.adoc deleted file mode 100644 index 00aec5b1bf..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/shutdown.adoc +++ /dev/null @@ -1,28 +0,0 @@ -[[shutdown]] -= Shutdown (`shutdown`) - -The `shutdown` endpoint is used to shut down the application. - - - -[[shutdown-shutting-down]] -== Shutting Down the Application - -To shut down the application, make a `POST` request to `/actuator/shutdown`, as shown in the following curl-based example: - -include::{snippets}shutdown/curl-request.adoc[] - -A response similar to the following is produced: - -include::{snippets}shutdown/http-response.adoc[] - - - -[[shutdown-shutting-down-response-structure]] -=== Response Structure - -The response contains details of the result of the shutdown request. -The following table describes the structure of the response: - -[cols="3,1,3"] -include::{snippets}shutdown/response-fields.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/threaddump.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/threaddump.adoc deleted file mode 100644 index fa61f6df0c..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/threaddump.adoc +++ /dev/null @@ -1,42 +0,0 @@ -[[threaddump]] -= Thread Dump (`threaddump`) - -The `threaddump` endpoint provides a thread dump from the application's JVM. - - - -[[threaddump-retrieving-json]] -== Retrieving the Thread Dump as JSON - -To retrieve the thread dump as JSON, make a `GET` request to `/actuator/threaddump` with an appropriate `Accept` header, as shown in the following curl-based example: - -include::{snippets}threaddump/json/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}threaddump/json/http-response.adoc[] - - - -[[threaddump-retrieving-json-response-structure]] -=== Response Structure - -The response contains details of the JVM's threads. -The following table describes the structure of the response: - -[cols="3,1,2"] -include::{snippets}threaddump/json/response-fields.adoc[] - - - -[[threaddump-retrieving-text]] -== Retrieving the Thread Dump as Text - -To retrieve the thread dump as text, make a `GET` request to `/actuator/threaddump` that -accepts `text/plain`, as shown in the following curl-based example: - -include::{snippets}threaddump/text/curl-request.adoc[] - -The resulting response is similar to the following: - -include::{snippets}threaddump/text/http-response.adoc[] diff --git a/spring-boot-project/spring-boot-actuator/build.gradle b/spring-boot-project/spring-boot-actuator/build.gradle new file mode 100644 index 0000000000..73dddb1880 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator/build.gradle @@ -0,0 +1,96 @@ +plugins { + id 'java-library' + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.configuration-properties' + id 'org.springframework.boot.optional-dependencies' + id 'org.springframework.boot.deployed' +} + +description = 'Spring Boot Actuator' + +dependencies { + implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + implementation project(':spring-boot-project:spring-boot') + + optional enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + optional 'com.fasterxml.jackson.core:jackson-databind' + optional 'com.hazelcast:hazelcast' + optional 'com.hazelcast:hazelcast-spring' + optional 'com.sun.mail:jakarta.mail' + optional 'com.zaxxer:HikariCP' + optional 'io.lettuce:lettuce-core' + optional 'io.micrometer:micrometer-core' + optional 'io.micrometer:micrometer-registry-prometheus' + optional 'io.prometheus:simpleclient_pushgateway' + optional 'io.reactivex:rxjava-reactive-streams' + optional 'io.searchbox:jest' + optional 'org.elasticsearch.client:elasticsearch-rest-client' + optional ('io.undertow:undertow-servlet') { + exclude group: 'org.jboss.spec.javax.annotation', module: 'jboss-annotations-api_1.2_spec' + exclude group: 'org.jboss.spec.javax.servlet', module: 'jboss-servlet-api_4.0_spec' + } + optional 'javax.cache:cache-api' + optional 'javax.jms:javax.jms-api' + optional 'net.sf.ehcache:ehcache' + optional 'org.apache.tomcat.embed:tomcat-embed-core' + optional 'org.aspectj:aspectjweaver' + optional 'org.eclipse.jetty:jetty-server' + optional 'org.elasticsearch:elasticsearch' + optional 'org.flywaydb:flyway-core' + optional 'org.glassfish.jersey.core:jersey-server' + optional 'org.glassfish.jersey.containers:jersey-container-servlet-core' + optional 'org.hibernate.validator:hibernate-validator' + optional 'org.infinispan:infinispan-spring4-embedded' + optional 'org.influxdb:influxdb-java' + optional 'org.liquibase:liquibase-core' + optional 'org.mongodb:mongodb-driver-async' + optional 'org.mongodb:mongodb-driver-reactivestreams' + optional 'org.springframework:spring-jdbc' + optional 'org.springframework:spring-messaging' + optional 'org.springframework:spring-webflux' + optional 'org.springframework:spring-web' + optional 'org.springframework:spring-webmvc' + optional 'org.springframework.amqp:spring-rabbit' + optional 'org.springframework.data:spring-data-cassandra' + optional 'org.springframework.data:spring-data-couchbase' + optional 'org.springframework.data:spring-data-ldap' + optional 'org.springframework.data:spring-data-mongodb' + optional 'org.springframework.data:spring-data-neo4j' + optional 'org.springframework.data:spring-data-redis' + optional 'org.springframework.data:spring-data-rest-webmvc' + optional 'org.springframework.data:spring-data-solr' + optional 'org.springframework.integration:spring-integration-core' + optional 'org.springframework.security:spring-security-core' + optional 'org.springframework.security:spring-security-web' + optional 'org.springframework.session:spring-session-core' + + testImplementation project(':spring-boot-project:spring-boot-test') + testImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-test-support') + testImplementation project(':spring-boot-project:spring-boot-autoconfigure') + testImplementation 'org.assertj:assertj-core' + testImplementation 'com.jayway.jsonpath:json-path' + testImplementation 'io.projectreactor:reactor-test' + testImplementation 'org.apache.logging.log4j:log4j-to-slf4j' + testImplementation 'org.awaitility:awaitility' + testImplementation 'org.glassfish.jersey.media:jersey-media-json-jackson' + testImplementation 'org.hamcrest:hamcrest' + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.mockito:mockito-core' + testImplementation 'org.mockito:mockito-junit-jupiter' + testImplementation 'org.skyscreamer:jsonassert' + testImplementation 'org.springframework:spring-test' + + testRuntimeOnly 'io.projectreactor.netty:reactor-netty' + testRuntimeOnly 'javax.xml.bind:jaxb-api' + testRuntimeOnly 'org.apache.tomcat.embed:tomcat-embed-el' + testRuntimeOnly 'org.glassfish.jersey.ext:jersey-spring4' + testRuntimeOnly 'org.hsqldb:hsqldb' +} + +compileJava { + options.compilerArgs << '-parameters' +} + +compileTestJava { + options.compilerArgs << '-parameters' +} \ No newline at end of file diff --git a/spring-boot-project/spring-boot-actuator/pom.xml b/spring-boot-project/spring-boot-actuator/pom.xml deleted file mode 100644 index cedc88716c..0000000000 --- a/spring-boot-project/spring-boot-actuator/pom.xml +++ /dev/null @@ -1,401 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-parent - ${revision} - ../spring-boot-parent - - spring-boot-actuator - Spring Boot Actuator - Spring Boot Actuator - - ${basedir}/../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - - org.springframework.boot - spring-boot - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - - com.fasterxml.jackson.core - jackson-databind - true - - - com.hazelcast - hazelcast - true - - - com.hazelcast - hazelcast-spring - true - - - com.sun.mail - jakarta.mail - true - - - com.zaxxer - HikariCP - true - - - io.lettuce - lettuce-core - true - - - io.micrometer - micrometer-core - true - - - io.micrometer - micrometer-registry-prometheus - true - - - io.prometheus - simpleclient_pushgateway - true - - - io.reactivex - rxjava-reactive-streams - true - - - io.searchbox - jest - true - - - org.elasticsearch.client - elasticsearch-rest-client - true - - - io.undertow - undertow-servlet - true - - - org.jboss.spec.javax.servlet - jboss-servlet-api_3.1_spec - - - - - javax.cache - cache-api - true - - - jakarta.jms - jakarta.jms-api - true - - - jakarta.ws.rs - jakarta.ws.rs-api - true - - - net.sf.ehcache - ehcache - true - - - org.apache.tomcat.embed - tomcat-embed-core - true - - - org.aspectj - aspectjweaver - true - - - org.eclipse.jetty - jetty-server - true - - - javax.servlet - javax.servlet-api - - - - - org.elasticsearch - elasticsearch - true - - - org.flywaydb - flyway-core - true - - - org.glassfish.jersey.core - jersey-server - true - - - javax.validation - validation-api - - - - - org.glassfish.jersey.containers - jersey-container-servlet-core - true - - - org.hibernate.validator - hibernate-validator - true - - - javax.validation - validation-api - - - - - org.infinispan - infinispan-spring5-embedded - true - - - org.influxdb - influxdb-java - true - - - org.liquibase - liquibase-core - true - - - org.mongodb - mongodb-driver-async - true - - - org.mongodb - mongodb-driver-reactivestreams - true - - - org.springframework - spring-jdbc - true - - - org.springframework - spring-messaging - true - - - org.springframework - spring-webflux - true - - - org.springframework - spring-web - true - - - org.springframework - spring-webmvc - true - - - org.springframework.amqp - spring-rabbit - true - - - org.springframework.data - spring-data-cassandra - true - - - org.springframework.data - spring-data-couchbase - true - - - org.springframework.data - spring-data-ldap - true - - - org.springframework.data - spring-data-mongodb - true - - - org.springframework.data - spring-data-neo4j - true - - - org.springframework.data - spring-data-redis - true - - - org.springframework.data - spring-data-rest-webmvc - true - - - org.springframework.data - spring-data-solr - true - - - - wstx-asl - org.codehaus.woodstox - - - - - org.springframework.integration - spring-integration-core - true - - - org.springframework.security - spring-security-core - true - - - org.springframework.security - spring-security-web - true - - - org.springframework.session - spring-session-core - true - - - - org.springframework.boot - spring-boot-configuration-processor - true - - - - org.springframework.boot - spring-boot-test - test - - - org.springframework.boot - spring-boot-test-support - test - - - org.springframework.boot - spring-boot-autoconfigure - test - - - ch.qos.logback - logback-classic - test - - - jakarta.validation - jakarta.validation-api - test - - - jakarta.xml.bind - jakarta.xml.bind-api - test - - - org.apache.logging.log4j - log4j-to-slf4j - test - - - org.apache.tomcat.embed - tomcat-embed-el - test - - - org.glassfish.jersey.media - jersey-media-json-jackson - test - - - org.awaitility - awaitility - test - - - com.jayway.jsonpath - json-path - test - - - io.projectreactor - reactor-test - test - - - io.projectreactor.netty - reactor-netty - test - - - org.hsqldb - hsqldb - test - - - org.glassfish.jersey.ext - jersey-spring5 - test - - - javax.validation - validation-api - - - - - org.skyscreamer - jsonassert - test - - - - diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/web/test/WebEndpointTestInvocationContextProvider.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/web/test/WebEndpointTestInvocationContextProvider.java index 41bf39c07f..c1669f4545 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/web/test/WebEndpointTestInvocationContextProvider.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/web/test/WebEndpointTestInvocationContextProvider.java @@ -66,6 +66,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.MergedAnnotations; import org.springframework.core.annotation.MergedAnnotations.SearchStrategy; +import org.springframework.http.HttpMethod; import org.springframework.http.server.reactive.HttpHandler; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.util.ClassUtils; @@ -192,7 +193,13 @@ class WebEndpointTestInvocationContextProvider implements TestTemplateInvocation DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory( "http://localhost:" + determinePort()); uriBuilderFactory.setEncodingMode(EncodingMode.NONE); - return WebTestClient.bindToServer().uriBuilderFactory(uriBuilderFactory).responseTimeout(TIMEOUT).build(); + return WebTestClient.bindToServer().uriBuilderFactory(uriBuilderFactory).responseTimeout(TIMEOUT) + .filter((request, next) -> { + if (HttpMethod.GET == request.method()) { + return next.exchange(request).retry(10); + } + return next.exchange(request); + }).build(); } private int determinePort() { diff --git a/spring-boot-project/spring-boot-autoconfigure/build.gradle b/spring-boot-project/spring-boot-autoconfigure/build.gradle new file mode 100644 index 0000000000..ff509e7425 --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/build.gradle @@ -0,0 +1,185 @@ +plugins { + id 'java-library' + id 'org.jetbrains.kotlin.jvm' + id 'org.springframework.boot.auto-configuration' + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.deployed' + id 'org.springframework.boot.optional-dependencies' +} + +description = 'Spring Boot AutoConfigure' + +dependencies { + api project(':spring-boot-project:spring-boot') + + implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + + optional enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + optional 'com.atomikos:transactions-jdbc' + optional 'com.atomikos:transactions-jta' + optional 'com.couchbase.client:couchbase-spring-cache' + optional 'com.fasterxml.jackson.core:jackson-databind' + optional 'com.fasterxml.jackson.dataformat:jackson-dataformat-cbor' + optional 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml' + optional 'com.fasterxml.jackson.datatype:jackson-datatype-joda' + optional 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310' + optional 'com.fasterxml.jackson.module:jackson-module-parameter-names' + optional 'com.google.code.gson:gson' + optional 'com.hazelcast:hazelcast' + optional 'com.hazelcast:hazelcast-client' + optional 'com.hazelcast:hazelcast-spring' + optional 'com.h2database:h2' + optional 'com.samskivert:jmustache' + optional 'com.sun.mail:jakarta.mail' + optional 'de.flapdoodle.embed:de.flapdoodle.embed.mongo' + optional 'io.lettuce:lettuce-core' + optional 'io.projectreactor.netty:reactor-netty' + optional 'io.searchbox:jest' + optional 'io.rsocket:rsocket-core' + optional 'io.rsocket:rsocket-transport-netty' + optional ('io.undertow:undertow-servlet') { + exclude group: 'org.jboss.spec.javax.annotation', module: 'jboss-annotations-api_1.2_spec' + exclude group: 'org.jboss.spec.javax.servlet', module: 'jboss-servlet-api_4.0_spec' + } + optional ('io.undertow:undertow-websockets-jsr') { + exclude group: 'org.jboss.spec.javax.annotation', module: 'jboss-annotations-api_1.2_spec' + exclude group: 'org.jboss.spec.javax.servlet', module: 'jboss-servlet-api_4.0_spec' + } + optional 'jakarta.jms:jakarta.jms-api' + optional 'jakarta.mail:jakarta.mail-api' + optional 'jakarta.json.bind:jakarta.json.bind-api' + optional 'jakarta.persistence:jakarta.persistence-api' + optional 'jakarta.validation:jakarta.validation-api' + optional 'jakarta.ws.rs:jakarta.ws.rs-api' + optional 'javax.cache:cache-api' + optional 'javax.money:money-api' + optional 'net.sf.ehcache:ehcache' + optional 'org.apache.activemq:activemq-broker' + optional 'org.apache.activemq:artemis-jms-client' + optional 'org.apache.activemq:artemis-jms-server' + optional 'org.apache.commons:commons-dbcp2' + optional 'org.apache.kafka:kafka-streams' + optional 'org.apache.solr:solr-solrj' + optional 'org.apache.tomcat.embed:tomcat-embed-core' + optional 'org.apache.tomcat.embed:tomcat-embed-el' + optional 'org.apache.tomcat.embed:tomcat-embed-websocket' + optional 'org.apache.tomcat:tomcat-jdbc' + optional 'org.codehaus.btm:btm' + optional 'org.codehaus.groovy:groovy-templates' + optional 'com.github.ben-manes.caffeine:caffeine' + optional 'com.github.mxab.thymeleaf.extras:thymeleaf-extras-data-attribute' + optional 'com.sendgrid:sendgrid-java' + optional 'com.unboundid:unboundid-ldapsdk' + optional 'com.zaxxer:HikariCP' + optional 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect' + optional 'org.aspectj:aspectjweaver' + optional 'org.eclipse.jetty:jetty-webapp' + optional 'org.eclipse.jetty:jetty-reactive-httpclient' + optional 'org.eclipse.jetty.websocket:javax-websocket-server-impl' + optional 'org.ehcache:ehcache' + optional 'org.elasticsearch.client:elasticsearch-rest-client' + optional 'org.elasticsearch.client:elasticsearch-rest-high-level-client' + optional 'org.flywaydb:flyway-core' + optional 'org.freemarker:freemarker' + optional 'org.glassfish.jersey.core:jersey-server' + optional 'org.glassfish.jersey.containers:jersey-container-servlet-core' + optional 'org.glassfish.jersey.containers:jersey-container-servlet' + optional 'org.glassfish.jersey.ext:jersey-spring5' + optional 'org.glassfish.jersey.media:jersey-media-json-jackson' + optional 'org.hibernate:hibernate-core' + optional 'org.hibernate:hibernate-jcache' + optional 'org.hibernate.validator:hibernate-validator' + optional 'org.infinispan:infinispan-jcache' + optional 'org.infinispan:infinispan-spring5-embedded' + optional 'org.influxdb:influxdb-java' + optional 'org.jboss:jboss-transaction-spi' + optional 'org.jooq:jooq' + optional 'org.liquibase:liquibase-core' + optional 'org.messaginghub:pooled-jms' + optional 'org.mongodb:mongodb-driver-async' + optional 'org.mongodb:mongodb-driver-reactivestreams' + optional 'org.quartz-scheduler:quartz' + optional 'org.springframework:spring-jdbc' + optional 'org.springframework.integration:spring-integration-core' + optional 'org.springframework.integration:spring-integration-jdbc' + optional 'org.springframework.integration:spring-integration-jmx' + optional 'org.springframework:spring-jms' + optional 'org.springframework:spring-orm' + optional 'org.springframework:spring-tx' + optional 'org.springframework:spring-web' + optional 'org.springframework:spring-websocket' + optional 'org.springframework:spring-webflux' + optional 'org.springframework:spring-webmvc' + optional 'org.springframework.batch:spring-batch-core' + optional 'org.springframework.data:spring-data-couchbase' + optional 'org.springframework.data:spring-data-jpa' + optional 'org.springframework.data:spring-data-rest-webmvc' + optional 'org.springframework.data:spring-data-cassandra' + optional 'org.springframework.data:spring-data-elasticsearch' + optional 'org.springframework.data:spring-data-jdbc' + optional 'org.springframework.data:spring-data-ldap' + optional 'org.springframework.data:spring-data-mongodb' + optional 'org.springframework.data:spring-data-neo4j' + optional 'org.springframework.data:spring-data-redis' + optional 'org.springframework.data:spring-data-solr' + optional 'org.springframework.hateoas:spring-hateoas' + optional 'org.springframework.security:spring-security-acl' + optional 'org.springframework.security:spring-security-config' + optional 'org.springframework.security:spring-security-data' + optional 'org.springframework.security:spring-security-oauth2-client' + optional 'org.springframework.security:spring-security-oauth2-jose' + optional 'org.springframework.security:spring-security-oauth2-resource-server' + optional 'org.springframework.security:spring-security-rsocket' + optional 'org.springframework.security:spring-security-saml2-service-provider' + optional 'org.springframework.security:spring-security-web' + optional 'org.springframework.session:spring-session-core' + optional 'org.springframework.session:spring-session-data-mongodb' + optional 'org.springframework.session:spring-session-data-redis' + optional 'org.springframework.session:spring-session-hazelcast' + optional 'org.springframework.session:spring-session-jdbc' + optional 'org.springframework.amqp:spring-rabbit' + optional 'org.springframework.kafka:spring-kafka' + optional 'org.springframework.cloud:spring-cloud-spring-service-connector' + optional 'org.springframework.ws:spring-ws-core' + optional 'org.thymeleaf:thymeleaf' + optional 'org.thymeleaf:thymeleaf-spring5' + optional 'org.thymeleaf.extras:thymeleaf-extras-java8time' + optional 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5' + optional 'redis.clients:jedis' + + testImplementation enforcedPlatform(project(':spring-boot-project:spring-boot-parent')) + testImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-test-support') + testImplementation project(':spring-boot-project:spring-boot-test') + testImplementation 'ch.qos.logback:logback-classic' + testImplementation 'commons-fileupload:commons-fileupload' + testImplementation 'com.atomikos:transactions-jms' + testImplementation 'com.jayway.jsonpath:json-path' + testImplementation 'com.squareup.okhttp3:mockwebserver' + testImplementation 'com.sun.xml.messaging.saaj:saaj-impl' + testImplementation 'jakarta.json:jakarta.json-api' + testImplementation 'jakarta.xml.ws:jakarta.xml.ws-api' + testImplementation 'mysql:mysql-connector-java' + testImplementation 'org.apache.johnzon:johnzon-jsonb' + testImplementation 'org.apache.logging.log4j:log4j-to-slf4j' + testImplementation 'org.apache.tomcat.embed:tomcat-embed-jasper' + testImplementation 'org.assertj:assertj-core' + testImplementation 'org.awaitility:awaitility' + testImplementation 'org.hsqldb:hsqldb' + testImplementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.neo4j:neo4j-ogm-bolt-native-types' + testImplementation 'org.neo4j:neo4j-ogm-http-driver' + testImplementation 'org.neo4j:neo4j-ogm-embedded-driver' + testImplementation 'org.springframework:spring-test' + testImplementation 'org.springframework.kafka:spring-kafka-test' + testImplementation 'org.springframework.security:spring-security-test' + testImplementation 'org.testcontainers:cassandra' + testImplementation 'org.testcontainers:couchbase' + testImplementation 'org.testcontainers:elasticsearch' + testImplementation 'org.testcontainers:junit-jupiter' + testImplementation 'org.testcontainers:testcontainers' + testImplementation 'org.yaml:snakeyaml' + + testRuntimeOnly 'org.jetbrains.kotlin:kotlin-reflect' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' +} diff --git a/spring-boot-project/spring-boot-autoconfigure/pom.xml b/spring-boot-project/spring-boot-autoconfigure/pom.xml deleted file mode 100755 index a187161806..0000000000 --- a/spring-boot-project/spring-boot-autoconfigure/pom.xml +++ /dev/null @@ -1,1044 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-parent - ${revision} - ../spring-boot-parent - - spring-boot-autoconfigure - Spring Boot AutoConfigure - Spring Boot AutoConfigure - - ${basedir}/../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - - org.springframework.boot - spring-boot - - - - com.atomikos - transactions-jdbc - true - - - com.atomikos - transactions-jta - true - - - com.couchbase.client - couchbase-spring-cache - true - - - com.fasterxml.jackson.core - jackson-databind - true - - - com.fasterxml.jackson.dataformat - jackson-dataformat-cbor - true - - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - true - - - com.fasterxml.jackson.datatype - jackson-datatype-joda - true - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - true - - - com.fasterxml.jackson.module - jackson-module-parameter-names - true - - - com.google.code.gson - gson - true - - - com.hazelcast - hazelcast - true - - - com.hazelcast - hazelcast-client - true - - - com.hazelcast - hazelcast-spring - true - - - com.h2database - h2 - true - - - com.samskivert - jmustache - true - - - com.sun.mail - jakarta.mail - true - - - de.flapdoodle.embed - de.flapdoodle.embed.mongo - true - - - io.lettuce - lettuce-core - true - - - io.projectreactor.netty - reactor-netty - true - - - io.rsocket - rsocket-core - true - - - io.rsocket - rsocket-transport-netty - true - - - io.searchbox - jest - true - - - jakarta.json.bind - jakarta.json.bind-api - true - - - javax.cache - cache-api - true - - - javax.money - money-api - true - - - org.apache.kafka - kafka-streams - true - - - javax.ws.rs - javax.ws.rs-api - - - - - org.flywaydb - flyway-core - true - - - org.glassfish.jersey.core - jersey-server - true - - - javax.validation - validation-api - - - - - org.glassfish.jersey.containers - jersey-container-servlet-core - true - - - org.glassfish.jersey.containers - jersey-container-servlet - true - - - org.glassfish.jersey.ext - jersey-spring5 - true - - - org.glassfish.hk2.external - bean-validator - - - org.hibernate - hibernate-validator - - - - - org.glassfish.jersey.media - jersey-media-json-jackson - true - - - org.apache.activemq - activemq-broker - true - - - geronimo-jms_1.1_spec - org.apache.geronimo.specs - - - - - org.apache.activemq - artemis-jms-client - true - - - geronimo-jms_2.0_spec - org.apache.geronimo.specs - - - - - org.apache.activemq - artemis-jms-server - true - - - geronimo-jms_2.0_spec - org.apache.geronimo.specs - - - - - org.apache.commons - commons-dbcp2 - true - - - org.apache.solr - solr-solrj - true - - - org.codehaus.woodstox - wstx-asl - - - log4j - log4j - - - - - org.apache.tomcat.embed - tomcat-embed-core - true - - - org.apache.tomcat.embed - tomcat-embed-el - true - - - org.apache.tomcat.embed - tomcat-embed-websocket - true - - - org.apache.tomcat - tomcat-jdbc - true - - - org.codehaus.btm - btm - true - - - javax.transaction - jta - - - - - org.codehaus.groovy - groovy-templates - true - - - com.sendgrid - sendgrid-java - true - - - com.unboundid - unboundid-ldapsdk - true - - - com.zaxxer - HikariCP - true - - - org.eclipse.jetty - jetty-webapp - true - - - javax.servlet - javax.servlet-api - - - - - org.eclipse.jetty - jetty-reactive-httpclient - true - - - org.eclipse.jetty.websocket - javax-websocket-server-impl - true - - - javax.annotation - javax.annotation-api - - - javax.servlet - javax.servlet-api - - - javax.websocket - javax.websocket-api - - - javax.websocket - javax.websocket-client-api - - - - - io.undertow - undertow-servlet - true - - - io.undertow - undertow-websockets-jsr - true - - - jakarta.persistence - jakarta.persistence-api - true - - - jakarta.validation - jakarta.validation-api - true - - - jakarta.ws.rs - jakarta.ws.rs-api - true - - - org.ehcache - ehcache - true - - - org.elasticsearch.client - elasticsearch-rest-client - true - - - org.elasticsearch.client - elasticsearch-rest-high-level-client - true - - - org.freemarker - freemarker - true - - - org.hibernate - hibernate-core - true - - - javax.activation - javax.activation-api - - - javax.persistence - javax.persistence-api - - - javax.xml.bind - jaxb-api - - - - - org.hibernate - hibernate-jcache - true - - - org.hibernate.validator - hibernate-validator - true - - - javax.validation - validation-api - - - - - org.infinispan - infinispan-jcache - true - - - org.infinispan - infinispan-spring5-embedded - true - - - org.jboss - jboss-transaction-spi - true - - - org.messaginghub - pooled-jms - true - - - org.apache.geronimo.specs - geronimo-jms_2.0_spec - - - - - org.mongodb - mongodb-driver-async - true - - - org.mongodb - mongodb-driver-reactivestreams - true - - - org.springframework - spring-jdbc - true - - - org.springframework.integration - spring-integration-core - true - - - org.springframework.integration - spring-integration-jdbc - true - - - org.springframework.integration - spring-integration-jmx - true - - - org.springframework - spring-jms - true - - - org.springframework - spring-orm - true - - - org.springframework - spring-tx - true - - - org.springframework - spring-web - true - - - org.springframework - spring-websocket - true - - - org.springframework - spring-webflux - true - - - org.springframework - spring-webmvc - true - - - org.springframework.batch - spring-batch-core - true - - - org.springframework.data - spring-data-couchbase - true - - - org.slf4j - jcl-over-slf4j - - - - - org.springframework.data - spring-data-jpa - true - - - jcl-over-slf4j - org.slf4j - - - - - org.springframework.data - spring-data-rest-webmvc - true - - - jcl-over-slf4j - org.slf4j - - - - - org.springframework.data - spring-data-cassandra - true - - - org.springframework.data - spring-data-jdbc - true - - - org.springframework.data - spring-data-ldap - true - - - org.springframework.data - spring-data-mongodb - true - - - jcl-over-slf4j - org.slf4j - - - - - org.springframework.data - spring-data-neo4j - true - - - jcl-over-slf4j - org.slf4j - - - - - org.springframework.data - spring-data-redis - true - - - org.springframework.data - spring-data-elasticsearch - true - - - jcl-over-slf4j - org.slf4j - - - - - org.springframework.data - spring-data-solr - true - - - jcl-over-slf4j - org.slf4j - - - - - org.springframework.hateoas - spring-hateoas - true - - - redis.clients - jedis - true - - - org.liquibase - liquibase-core - true - - - org.springframework.security - spring-security-acl - true - - - org.springframework.security - spring-security-config - true - - - org.springframework.security - spring-security-data - true - - - javax.xml.bind - jaxb-api - - - - - org.springframework.security - spring-security-oauth2-client - true - - - com.sun.mail - javax.mail - - - - - org.springframework.security - spring-security-oauth2-jose - true - - - org.springframework.security - spring-security-oauth2-resource-server - true - - - org.springframework.security - spring-security-rsocket - true - - - org.springframework.security - spring-security-saml2-service-provider - true - - - org.springframework.security - spring-security-web - true - - - org.springframework.session - spring-session-core - true - - - org.springframework.session - spring-session-data-mongodb - true - - - org.springframework.session - spring-session-data-redis - true - - - org.springframework.session - spring-session-hazelcast - true - - - javax.annotation - javax.annotation-api - - - - - org.springframework.session - spring-session-jdbc - true - - - org.springframework.amqp - spring-rabbit - true - - - org.springframework.kafka - spring-kafka - true - - - org.springframework.cloud - spring-cloud-spring-service-connector - true - - - org.springframework.ws - spring-ws-core - true - - - org.thymeleaf - thymeleaf - true - - - org.thymeleaf - thymeleaf-spring5 - true - - - nz.net.ultraq.thymeleaf - thymeleaf-layout-dialect - true - - - com.github.ben-manes.caffeine - caffeine - true - - - com.github.mxab.thymeleaf.extras - thymeleaf-extras-data-attribute - true - - - org.thymeleaf.extras - thymeleaf-extras-java8time - true - - - org.thymeleaf.extras - thymeleaf-extras-springsecurity5 - true - - - jakarta.jms - jakarta.jms-api - true - - - jakarta.mail - jakarta.mail-api - true - - - net.sf.ehcache - ehcache - true - - - org.aspectj - aspectjweaver - true - - - org.influxdb - influxdb-java - true - - - org.jooq - jooq - true - - - javax.xml.bind - jaxb-api - - - - - org.quartz-scheduler - quartz - true - - - - org.springframework.boot - spring-boot-autoconfigure-processor - true - - - org.springframework.boot - spring-boot-configuration-processor - true - - - - org.jetbrains.kotlin - kotlin-reflect - test - - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - test - - - org.springframework.boot - spring-boot-test-support - test - - - org.springframework.boot - spring-boot-test - test - - - ch.qos.logback - logback-classic - test - - - commons-fileupload - commons-fileupload - test - - - com.atomikos - transactions-jms - test - - - com.jayway.jsonpath - json-path - test - - - com.squareup.okhttp3 - mockwebserver - test - - - org.hamcrest - hamcrest-core - - - - - com.sun.xml.messaging.saaj - saaj-impl - test - - - jakarta.json - jakarta.json-api - test - - - jakarta.xml.ws - jakarta.xml.ws-api - test - - - mysql - mysql-connector-java - test - - - org.apache.johnzon - johnzon-jsonb - test - - - org.apache.logging.log4j - log4j-to-slf4j - test - - - org.apache.tomcat.embed - tomcat-embed-jasper - test - - - org.awaitility - awaitility - test - - - org.hsqldb - hsqldb - test - - - org.neo4j - neo4j-ogm-bolt-native-types - test - - - org.neo4j - neo4j-ogm-embedded-driver - test - - - org.neo4j - neo4j-ogm-http-driver - test - - - org.springframework - spring-test - test - - - org.springframework.kafka - spring-kafka-test - test - - - org.springframework.security - spring-security-test - test - - - org.testcontainers - cassandra - test - - - org.testcontainers - couchbase - test - - - org.testcontainers - elasticsearch - test - - - org.testcontainers - junit-jupiter - test - - - org.testcontainers - testcontainers - test - - - javax.annotation - javax.annotation-api - - - javax.xml.bind - jaxb-api - - - - - org.yaml - snakeyaml - test - - - - - - org.jetbrains.kotlin - kotlin-maven-plugin - - - test-compile - test-compile - - test-compile - - - - ${project.basedir}/src/test/kotlin - ${project.basedir}/src/test/java - - - - - - - - - - java9+ - - [9,) - - - - org.glassfish.jaxb - jaxb-runtime - true - - - - - diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveRestClientAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveRestClientAutoConfigurationTests.java index 8ccaf257f9..614c598ae7 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveRestClientAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveRestClientAutoConfigurationTests.java @@ -74,10 +74,11 @@ public class ReactiveRestClientAutoConfigurationTests { @Test void restClientCanQueryElasticsearchNode() { - this.contextRunner - .withPropertyValues("spring.data.elasticsearch.client.reactive.endpoints=" - + elasticsearch.getContainerIpAddress() + ":" + elasticsearch.getFirstMappedPort()) - .run((context) -> { + this.contextRunner.withPropertyValues( + "spring.data.elasticsearch.client.reactive.endpoints=" + elasticsearch.getContainerIpAddress() + ":" + + elasticsearch.getFirstMappedPort(), + "spring.data.elasticsearch.client.reactive.connection-timeout=120s", + "spring.data.elasticsearch.client.reactive.socket-timeout=120s").run((context) -> { ReactiveElasticsearchClient client = context.getBean(ReactiveElasticsearchClient.class); Map source = new HashMap<>(); source.put("a", "alpha"); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/transaction/TransactionAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/transaction/TransactionAutoConfigurationTests.java index ba889f9762..2461c1eaa9 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/transaction/TransactionAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/transaction/TransactionAutoConfigurationTests.java @@ -16,6 +16,8 @@ package org.springframework.boot.autoconfigure.transaction; +import java.util.UUID; + import javax.sql.DataSource; import org.junit.jupiter.api.Test; @@ -81,7 +83,7 @@ class TransactionAutoConfigurationTests { DataSourceTransactionManagerAutoConfiguration.class)) .withUserConfiguration(SinglePlatformTransactionManagerConfiguration.class, SingleReactiveTransactionManagerConfiguration.class) - .run((context) -> { + .withPropertyValues("spring.datasource.url:jdbc:h2:mem:" + UUID.randomUUID()).run((context) -> { PlatformTransactionManager platformTransactionManager = context .getBean(PlatformTransactionManager.class); TransactionTemplate transactionTemplate = context.getBean(TransactionTemplate.class); diff --git a/spring-boot-project/spring-boot-cli/build.gradle b/spring-boot-project/spring-boot-cli/build.gradle new file mode 100644 index 0000000000..db7ee46c8d --- /dev/null +++ b/spring-boot-project/spring-boot-cli/build.gradle @@ -0,0 +1,195 @@ +plugins { + id 'java' + id 'org.springframework.boot.deployed' + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.integration-test' +} + +description = "Spring Boot CLI" + +configurations { + dependenciesBom + loader + testRepository +} + +dependencies { + compileOnly project(':spring-boot-project:spring-boot') + + compileOnly 'jakarta.servlet:jakarta.servlet-api' + compileOnly 'org.codehaus.groovy:groovy-templates' + compileOnly 'org.springframework:spring-web' + + dependenciesBom project(path: ':spring-boot-project:spring-boot-dependencies', configuration: 'effectiveBom') + + implementation enforcedPlatform(project(':spring-boot-project:spring-boot-parent')) + implementation project(':spring-boot-project:spring-boot-tools:spring-boot-loader-tools') + + implementation 'com.vaadin.external.google:android-json' + implementation 'jline:jline' + implementation 'net.sf.jopt-simple:jopt-simple' + implementation('org.apache.httpcomponents:httpclient') { + exclude group: 'commons-logging', module: 'commons-logging' + } + implementation 'org.apache.maven:maven-model' + implementation('org.apache.maven:maven-resolver-provider') { + exclude group: 'com.google.guava', module: 'guava' + } + implementation 'org.apache.maven.resolver:maven-resolver-connector-basic' + implementation 'org.apache.maven.resolver:maven-resolver-transport-file' + implementation('org.apache.maven.resolver:maven-resolver-transport-http') { + exclude group: 'org.slf4j', module: 'jcl-over-slf4j' + } + implementation 'org.apache.maven:maven-settings-builder' + implementation 'org.codehaus.groovy:groovy' + implementation 'org.slf4j:slf4j-simple' + implementation 'org.sonatype.plexus:plexus-sec-dispatcher' + implementation('org.sonatype.sisu:sisu-inject-plexus') { + exclude group: 'javax.enterprise', module: 'cdi-api' + exclude group: 'org.sonatype.sisu', module: 'sisu-inject-bean' + } + implementation 'org.springframework:spring-core' + implementation 'org.springframework.security:spring-security-crypto' + + intTestImplementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + intTestImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-loader-tools') + intTestImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-test-support') + intTestImplementation 'org.assertj:assertj-core' + intTestImplementation 'org.junit.jupiter:junit-jupiter' + intTestImplementation 'org.springframework:spring-core' + + loader project(':spring-boot-project:spring-boot-tools:spring-boot-loader') + + testImplementation project(':spring-boot-project:spring-boot') + testImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-test-support') + testImplementation project(':spring-boot-project:spring-boot-test') + testImplementation 'org.assertj:assertj-core' + testImplementation 'org.codehaus.groovy:groovy-templates' + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.mockito:mockito-core' + testImplementation 'org.springframework:spring-test' + + testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter-actuator', configuration: 'mavenRepository') + testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter-amqp', configuration: 'mavenRepository') + testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter-aop', configuration: 'mavenRepository') + testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter-artemis', configuration: 'mavenRepository') + testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter-batch', configuration: 'mavenRepository') + testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter-data-jpa', configuration: 'mavenRepository') + testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter-jdbc', configuration: 'mavenRepository') + testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter-integration', configuration: 'mavenRepository') + testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter-security', configuration: 'mavenRepository') + testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter-web', configuration: 'mavenRepository') +} + +task syncSpringBootDependenciesBom(type: Sync) { + destinationDir = file("$buildDir/generated-resources/org/springframework/boot/cli/compiler/dependencies") + from configurations.dependenciesBom +} + +task syncTestRepository(type: Sync) { + destinationDir = file("${buildDir}/test-repository") + from configurations.testRepository +} + +sourceSets { + main { + output.dir("$buildDir/generated-resources", builtBy: 'syncSpringBootDependenciesBom') + } +} + +test { + dependsOn syncTestRepository + useJUnitPlatform() +} + +task fullJar(type: Jar) { + classifier = 'full' + entryCompression = 'stored' + from(configurations.runtimeClasspath) { + into 'BOOT-INF/lib' + } + from(sourceSets.main.output) { + into 'BOOT-INF/classes' + } + into("") { + from zipTree(configurations.loader.singleFile) + } + manifest { + attributes( + 'Class-Loader': 'groovy.lang.GroovyClassLoader', + 'Main-Class': 'org.springframework.boot.loader.JarLauncher', + 'Start-Class': 'org.springframework.boot.cli.SpringCli' + ) + } +} + +def configureArchive(archive) { + archive.classifier = 'bin' + archive.into "spring-${project.version}" + archive.from(fullJar) { + rename { + it.replace("-full", "") + } + into 'lib/' + } + archive.from(file('src/main/content')) { + eachFile { it.mode = it.directory ? 0x755 : 0x644 } + } + archive.from(file('src/main/executablecontent')) { + eachFile { it.mode = 0x755 } + } +} + +task zip(type: Zip) { + classifier = 'bin' + configureArchive it +} + +intTest { + dependsOn syncTestRepository, zip +} + +task tar(type: Tar) { + compression = 'gzip' + archiveExtension = 'tar.gz' + configureArchive it +} + +task scoopManifest(type: org.springframework.boot.build.cli.ScoopManifest) { + dependsOn zip + outputDir = file("$buildDir/scoop") + template = file('src/main/scoop/springboot.json') + archive = zip.archiveFile +} + +def scoopManifestArtifact = artifacts.add('archives', file("$buildDir/scoop/springboot.json")) { + type 'json' + classifier 'scoop' + builtBy 'scoopManifest' +} + +task homebrewFormula(type: org.springframework.boot.build.cli.HomebrewFormula) { + dependsOn tar + outputDir = file("$buildDir/homebrew") + template = file('src/main/homebrew/springboot.rb') + archive = tar.archiveFile +} + +def homebrewFormulaArtifact = artifacts.add('archives', file("$buildDir/homebrew/springboot.rb")) { + type 'rb' + classifier 'homebrew' + builtBy 'homebrewFormula' +} + +publishing { + publications { + getByName('maven') { + artifact fullJar + artifact tar + artifact zip + artifact scoopManifestArtifact + artifact homebrewFormulaArtifact + } + } +} + diff --git a/spring-boot-project/spring-boot-cli/pom.xml b/spring-boot-project/spring-boot-cli/pom.xml deleted file mode 100644 index a349767d00..0000000000 --- a/spring-boot-project/spring-boot-cli/pom.xml +++ /dev/null @@ -1,469 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-parent - ${revision} - ../spring-boot-parent - - spring-boot-cli - Spring Boot CLI - Spring Boot CLI - - ${basedir}/../.. - org.springframework.boot.cli.SpringCli - default - ${project.build.directory}/generated-resources/org/springframework/boot/cli/compiler/dependencies - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - - org.springframework.boot - spring-boot-loader-tools - - - com.vaadin.external.google - android-json - - - jline - jline - - - net.sf.jopt-simple - jopt-simple - - - org.codehaus.groovy - groovy - - - org.sonatype.plexus - plexus-sec-dispatcher - - - org.sonatype.sisu - sisu-inject-plexus - - - org.sonatype.sisu - sisu-inject-bean - - - javax.enterprise - cdi-api - - - - - org.springframework - spring-core - - - org.springframework.security - spring-security-crypto - - - org.apache.httpcomponents - httpclient - - - org.apache.maven - maven-model - - - org.apache.maven - maven-settings-builder - - - org.apache.maven - maven-resolver-provider - - - com.google.guava - guava - - - - - org.apache.maven.resolver - maven-resolver-connector-basic - - - org.apache.maven.resolver - maven-resolver-impl - - - org.apache.maven.resolver - maven-resolver-transport-file - - - org.apache.maven.resolver - maven-resolver-transport-http - - - jcl-over-slf4j - org.slf4j - - - - - - org.springframework.boot - spring-boot-dependencies - effective-pom - provided - ${project.version} - - - org.codehaus.groovy - groovy-templates - provided - - - org.springframework.boot - spring-boot - provided - - - org.springframework - spring-web - provided - - - jakarta.servlet - jakarta.servlet-api - provided - - - - org.springframework.boot - spring-boot-test-support - test - - - org.springframework.boot - spring-boot-test - test - - - junit - junit - test - - - org.hamcrest - hamcrest-core - - - - - - - - ${project.build.directory}/generated-resources - - - ${basedir}/src/main/resources - - - - - org.apache.maven.plugins - maven-failsafe-plugin - - - org.apache.maven.plugins - maven-surefire-plugin - - - ${project.build.directory}/generated-resources - - - ${spring.profiles.active} - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-effective-pom - generate-resources - - copy - - - - - org.springframework.boot - spring-boot-dependencies - effective-pom - true - ${generated.pom.dir} - effective-pom.xml - - - - - - unpack - prepare-package - - unpack - - - - - org.springframework.boot - spring-boot-loader - ${project.version} - jar - - - ${project.build.directory}/assembly - - - - copy - prepare-package - - copy-dependencies - - - ${project.build.directory}/assembly/BOOT-INF/lib - runtime - - - - - - org.apache.maven.plugins - maven-assembly-plugin - - - jar-with-dependencies - package - - single - - - - src/main/assembly/jar-with-dependencies.xml - - - - true - org.springframework.boot.loader.JarLauncher - - - ${start-class} - groovy.lang.GroovyClassLoader - - - - - - bin-package - package - - single - - - - src/main/assembly/bin-package.xml - - - - - - - org.apache.maven.plugins - maven-antrun-plugin - - - ant-contrib - ant-contrib - 1.0b3 - - - ant - ant - - - - - org.apache.ant - ant-nodeps - 1.8.1 - - - org.tigris.antelope - antelopetasks - 3.2.10 - - - - - homebrew - package - - run - - false - - - - - - - - - - - - - - - - - - - - - - - - - scoop - package - - run - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - add-test-source - process-resources - - add-test-source - - - - src/it/java - - - - - - - - - - integration - - true - - - integration - - - - java9+ - - [9,) - - - - org.glassfish.jaxb - jaxb-runtime - true - - - - - diff --git a/spring-boot-project/spring-boot-cli/src/intTest/java/org/springframework/boot/cli/CommandLineIT.java b/spring-boot-project/spring-boot-cli/src/intTest/java/org/springframework/boot/cli/CommandLineIT.java new file mode 100644 index 0000000000..1ee7939855 --- /dev/null +++ b/spring-boot-project/spring-boot-cli/src/intTest/java/org/springframework/boot/cli/CommandLineIT.java @@ -0,0 +1,86 @@ +/* + * Copyright 2012-2019 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.boot.cli; + +import java.io.File; +import java.io.IOException; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import org.springframework.boot.cli.infrastructure.CommandLineInvoker; +import org.springframework.boot.cli.infrastructure.CommandLineInvoker.Invocation; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Integration Tests for the command line application. + * + * @author Andy Wilkinson + * @author Phillip Webb + */ +class CommandLineIT { + + private CommandLineInvoker cli; + + @BeforeEach + void setup(@TempDir File tempDir) { + this.cli = new CommandLineInvoker(tempDir); + } + + @Test + void hintProducesListOfValidCommands() throws IOException, InterruptedException { + Invocation cli = this.cli.invoke("hint"); + assertThat(cli.await()).isEqualTo(0); + assertThat(cli.getErrorOutput()).isEmpty(); + assertThat(cli.getStandardOutputLines()).hasSize(11); + } + + @Test + void invokingWithNoArgumentsDisplaysHelp() throws IOException, InterruptedException { + Invocation cli = this.cli.invoke(); + assertThat(cli.await()).isEqualTo(1); + assertThat(cli.getErrorOutput()).isEmpty(); + assertThat(cli.getStandardOutput()).startsWith("usage:"); + } + + @Test + void unrecognizedCommandsAreHandledGracefully() throws IOException, InterruptedException { + Invocation cli = this.cli.invoke("not-a-real-command"); + assertThat(cli.await()).isEqualTo(1); + assertThat(cli.getErrorOutput()).contains("'not-a-real-command' is not a valid command"); + assertThat(cli.getStandardOutput()).isEmpty(); + } + + @Test + void version() throws IOException, InterruptedException { + Invocation cli = this.cli.invoke("version"); + assertThat(cli.await()).isEqualTo(0); + assertThat(cli.getErrorOutput()).isEmpty(); + assertThat(cli.getStandardOutput()).startsWith("Spring CLI v"); + } + + @Test + void help() throws IOException, InterruptedException { + Invocation cli = this.cli.invoke("help"); + assertThat(cli.await()).isEqualTo(1); + assertThat(cli.getErrorOutput()).isEmpty(); + assertThat(cli.getStandardOutput()).startsWith("usage:"); + } + +} diff --git a/spring-boot-project/spring-boot-cli/src/intTest/java/org/springframework/boot/cli/JarCommandIT.java b/spring-boot-project/spring-boot-cli/src/intTest/java/org/springframework/boot/cli/JarCommandIT.java new file mode 100644 index 0000000000..cafb01739d --- /dev/null +++ b/spring-boot-project/spring-boot-cli/src/intTest/java/org/springframework/boot/cli/JarCommandIT.java @@ -0,0 +1,150 @@ +/* + * Copyright 2012-2019 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.boot.cli; + +import java.io.File; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import org.springframework.boot.cli.command.archive.JarCommand; +import org.springframework.boot.cli.infrastructure.CommandLineInvoker; +import org.springframework.boot.cli.infrastructure.CommandLineInvoker.Invocation; +import org.springframework.boot.loader.tools.JavaExecutable; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Integration test for {@link JarCommand}. + * + * @author Andy Wilkinson + * @author Stephane Nicoll + */ +class JarCommandIT { + + private static final boolean JAVA_9_OR_LATER = isClassPresent("java.security.cert.URICertStoreParameters"); + + private CommandLineInvoker cli; + + private File tempDir; + + @BeforeEach + void setup(@TempDir File tempDir) { + this.cli = new CommandLineInvoker(new File("src/intTest/resources/jar-command"), tempDir); + this.tempDir = tempDir; + } + + @Test + void noArguments() throws Exception { + Invocation invocation = this.cli.invoke("jar"); + invocation.await(); + assertThat(invocation.getStandardOutput()).isEqualTo(""); + assertThat(invocation.getErrorOutput()) + .contains("The name of the " + "resulting jar and at least one source file must be specified"); + } + + @Test + void noSources() throws Exception { + Invocation invocation = this.cli.invoke("jar", "test-app.jar"); + invocation.await(); + assertThat(invocation.getStandardOutput()).isEqualTo(""); + assertThat(invocation.getErrorOutput()) + .contains("The name of the " + "resulting jar and at least one source file must be specified"); + } + + @Test + void jarCreationWithGrabResolver() throws Exception { + File jar = new File(this.tempDir, "test-app.jar"); + Invocation invocation = this.cli.invoke("run", jar.getAbsolutePath(), "bad.groovy"); + invocation.await(); + if (!JAVA_9_OR_LATER) { + assertThat(invocation.getErrorOutput()).isEqualTo(""); + } + invocation = this.cli.invoke("jar", jar.getAbsolutePath(), "bad.groovy"); + invocation.await(); + if (!JAVA_9_OR_LATER) { + assertThat(invocation.getErrorOutput()).isEmpty(); + } + assertThat(jar).exists(); + + Process process = new JavaExecutable().processBuilder("-jar", jar.getAbsolutePath()).start(); + invocation = new Invocation(process); + invocation.await(); + + if (!JAVA_9_OR_LATER) { + assertThat(invocation.getErrorOutput()).isEqualTo(""); + } + } + + @Test + void jarCreation() throws Exception { + File jar = new File(this.tempDir, "test-app.jar"); + Invocation invocation = this.cli.invoke("jar", jar.getAbsolutePath(), "jar.groovy"); + invocation.await(); + if (!JAVA_9_OR_LATER) { + assertThat(invocation.getErrorOutput()).isEmpty(); + } + assertThat(jar).exists(); + + Process process = new JavaExecutable().processBuilder("-jar", jar.getAbsolutePath()).start(); + invocation = new Invocation(process); + invocation.await(); + + if (!JAVA_9_OR_LATER) { + assertThat(invocation.getErrorOutput()).isEqualTo(""); + } + assertThat(invocation.getStandardOutput()).contains("Hello World!") + .contains("/BOOT-INF/classes!/public/public.txt").contains("/BOOT-INF/classes!/resources/resource.txt") + .contains("/BOOT-INF/classes!/static/static.txt").contains("/BOOT-INF/classes!/templates/template.txt") + .contains("/BOOT-INF/classes!/root.properties").contains("Goodbye Mama"); + } + + @Test + void jarCreationWithIncludes() throws Exception { + File jar = new File(this.tempDir, "test-app.jar"); + Invocation invocation = this.cli.invoke("jar", jar.getAbsolutePath(), "--include", "-public/**,-resources/**", + "jar.groovy"); + invocation.await(); + if (!JAVA_9_OR_LATER) { + assertThat(invocation.getErrorOutput()).isEmpty(); + } + assertThat(jar).exists(); + + Process process = new JavaExecutable().processBuilder("-jar", jar.getAbsolutePath()).start(); + invocation = new Invocation(process); + invocation.await(); + + if (!JAVA_9_OR_LATER) { + assertThat(invocation.getErrorOutput()).isEqualTo(""); + } + assertThat(invocation.getStandardOutput()).contains("Hello World!").doesNotContain("/public/public.txt") + .doesNotContain("/resources/resource.txt").contains("/static/static.txt") + .contains("/templates/template.txt").contains("Goodbye Mama"); + } + + private static boolean isClassPresent(String name) { + try { + Class.forName(name); + return true; + } + catch (Exception ex) { + return false; + } + } + +} diff --git a/spring-boot-project/spring-boot-cli/src/intTest/java/org/springframework/boot/cli/WarCommandIT.java b/spring-boot-project/spring-boot-cli/src/intTest/java/org/springframework/boot/cli/WarCommandIT.java new file mode 100644 index 0000000000..4ea3ffa4b5 --- /dev/null +++ b/spring-boot-project/spring-boot-cli/src/intTest/java/org/springframework/boot/cli/WarCommandIT.java @@ -0,0 +1,66 @@ +/* + * Copyright 2012-2019 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.boot.cli; + +import java.io.File; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import org.springframework.boot.cli.command.archive.WarCommand; +import org.springframework.boot.cli.infrastructure.CommandLineInvoker; +import org.springframework.boot.cli.infrastructure.CommandLineInvoker.Invocation; +import org.springframework.boot.loader.tools.JavaExecutable; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Integration test for {@link WarCommand}. + * + * @author Andrey Stolyarov + * @author Henri Kerola + */ +class WarCommandIT { + + private CommandLineInvoker cli; + + private File tempDir; + + @BeforeEach + void setup(@TempDir File tempDir) { + this.cli = new CommandLineInvoker(new File("src/intTest/resources/war-command"), tempDir); + this.tempDir = tempDir; + } + + @Test + void warCreation() throws Exception { + File war = new File(this.tempDir, "test-app.war"); + Invocation invocation = this.cli.invoke("war", war.getAbsolutePath(), "war.groovy"); + invocation.await(); + assertThat(war.exists()).isTrue(); + Process process = new JavaExecutable().processBuilder("-jar", war.getAbsolutePath(), "--server.port=0").start(); + invocation = new Invocation(process); + invocation.await(); + assertThat(invocation.getOutput()).contains("onStart error"); + assertThat(invocation.getOutput()).contains("Tomcat started"); + assertThat(invocation.getOutput()).contains("/WEB-INF/lib-provided/tomcat-embed-core"); + assertThat(invocation.getOutput()).contains("WEB-INF/classes!/root.properties"); + process.destroy(); + } + +} diff --git a/spring-boot-project/spring-boot-cli/src/intTest/java/org/springframework/boot/cli/infrastructure/CommandLineInvoker.java b/spring-boot-project/spring-boot-cli/src/intTest/java/org/springframework/boot/cli/infrastructure/CommandLineInvoker.java new file mode 100644 index 0000000000..4792b8ebad --- /dev/null +++ b/spring-boot-project/spring-boot-cli/src/intTest/java/org/springframework/boot/cli/infrastructure/CommandLineInvoker.java @@ -0,0 +1,217 @@ +/* + * Copyright 2012-2019 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.boot.cli.infrastructure; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.io.StringReader; +import java.io.StringWriter; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +import org.springframework.boot.testsupport.BuildOutput; +import org.springframework.util.Assert; +import org.springframework.util.StreamUtils; + +/** + * Utility to invoke the command line in the same way as a user would, i.e. via the shell + * script in the package's bin directory. + * + * @author Andy Wilkinson + * @author Phillip Webb + */ +public final class CommandLineInvoker { + + private final File workingDirectory; + + private final File temp; + + public CommandLineInvoker(File temp) { + this(new File("."), temp); + } + + public CommandLineInvoker(File workingDirectory, File temp) { + this.workingDirectory = workingDirectory; + this.temp = temp; + } + + public Invocation invoke(String... args) throws IOException { + return new Invocation(runCliProcess(args)); + } + + private Process runCliProcess(String... args) throws IOException { + Path m2 = this.temp.toPath().resolve(".m2"); + Files.createDirectories(m2); + Files.copy(Paths.get("src", "intTest", "resources", "settings.xml"), m2.resolve("settings.xml"), + StandardCopyOption.REPLACE_EXISTING); + List command = new ArrayList<>(); + command.add(findLaunchScript().getAbsolutePath()); + command.addAll(Arrays.asList(args)); + ProcessBuilder processBuilder = new ProcessBuilder(command).directory(this.workingDirectory); + processBuilder.environment().put("JAVA_OPTS", "-Duser.home=" + this.temp); + return processBuilder.start(); + } + + private File findLaunchScript() throws IOException { + File unpacked = new File(this.temp, "unpacked-cli"); + if (!unpacked.isDirectory()) { + File zip = new File(new BuildOutput(getClass()).getRootLocation(), "distributions") + .listFiles((pathname) -> pathname.getName().endsWith("-bin.zip"))[0]; + try (ZipInputStream input = new ZipInputStream(new FileInputStream(zip))) { + ZipEntry entry; + while ((entry = input.getNextEntry()) != null) { + File file = new File(unpacked, entry.getName()); + if (entry.isDirectory()) { + file.mkdirs(); + } + else { + file.getParentFile().mkdirs(); + try (FileOutputStream output = new FileOutputStream(file)) { + StreamUtils.copy(input, output); + if (entry.getName().endsWith("/bin/spring")) { + file.setExecutable(true); + } + } + } + } + } + } + File bin = new File(unpacked.listFiles()[0], "bin"); + File launchScript = new File(bin, isWindows() ? "spring.bat" : "spring"); + Assert.state(launchScript.exists() && launchScript.isFile(), + () -> "Could not find CLI launch script " + launchScript.getAbsolutePath()); + return launchScript; + } + + private boolean isWindows() { + return File.separatorChar == '\\'; + } + + /** + * An ongoing Process invocation. + */ + public static final class Invocation { + + private final StringBuffer err = new StringBuffer(); + + private final StringBuffer out = new StringBuffer(); + + private final StringBuffer combined = new StringBuffer(); + + private final Process process; + + private final List streamReaders = new ArrayList<>(); + + public Invocation(Process process) { + this.process = process; + this.streamReaders + .add(new Thread(new StreamReadingRunnable(this.process.getErrorStream(), this.err, this.combined))); + this.streamReaders + .add(new Thread(new StreamReadingRunnable(this.process.getInputStream(), this.out, this.combined))); + for (Thread streamReader : this.streamReaders) { + streamReader.start(); + } + } + + public String getOutput() { + return postProcessLines(getLines(this.combined)); + } + + public String getErrorOutput() { + return postProcessLines(getLines(this.err)); + } + + public String getStandardOutput() { + return postProcessLines(getStandardOutputLines()); + } + + public List getStandardOutputLines() { + return getLines(this.out); + } + + private String postProcessLines(List lines) { + StringWriter out = new StringWriter(); + PrintWriter printOut = new PrintWriter(out); + for (String line : lines) { + if (!line.startsWith("Maven settings decryption failed")) { + printOut.println(line); + } + } + return out.toString(); + } + + private List getLines(StringBuffer buffer) { + BufferedReader reader = new BufferedReader(new StringReader(buffer.toString())); + return reader.lines().filter((line) -> !line.startsWith("Picked up ")).collect(Collectors.toList()); + } + + public int await() throws InterruptedException { + for (Thread streamReader : this.streamReaders) { + streamReader.join(); + } + return this.process.waitFor(); + } + + /** + * {@link Runnable} to copy stream output. + */ + private final class StreamReadingRunnable implements Runnable { + + private final InputStream stream; + + private final StringBuffer[] outputs; + + private final byte[] buffer = new byte[4096]; + + private StreamReadingRunnable(InputStream stream, StringBuffer... outputs) { + this.stream = stream; + this.outputs = outputs; + } + + @Override + public void run() { + int read; + try { + while ((read = this.stream.read(this.buffer)) > 0) { + for (StringBuffer output : this.outputs) { + output.append(new String(this.buffer, 0, read)); + } + } + } + catch (IOException ex) { + // Allow thread to die + } + } + + } + + } + +} diff --git a/spring-boot-project/spring-boot-cli/src/it/resources/jar-command/bad.groovy b/spring-boot-project/spring-boot-cli/src/intTest/resources/jar-command/bad.groovy similarity index 100% rename from spring-boot-project/spring-boot-cli/src/it/resources/jar-command/bad.groovy rename to spring-boot-project/spring-boot-cli/src/intTest/resources/jar-command/bad.groovy diff --git a/spring-boot-project/spring-boot-cli/src/it/resources/jar-command/jar.groovy b/spring-boot-project/spring-boot-cli/src/intTest/resources/jar-command/jar.groovy similarity index 100% rename from spring-boot-project/spring-boot-cli/src/it/resources/jar-command/jar.groovy rename to spring-boot-project/spring-boot-cli/src/intTest/resources/jar-command/jar.groovy diff --git a/spring-boot-project/spring-boot-cli/src/it/resources/jar-command/public/public.txt b/spring-boot-project/spring-boot-cli/src/intTest/resources/jar-command/public/public.txt similarity index 100% rename from spring-boot-project/spring-boot-cli/src/it/resources/jar-command/public/public.txt rename to spring-boot-project/spring-boot-cli/src/intTest/resources/jar-command/public/public.txt diff --git a/spring-boot-project/spring-boot-cli/src/it/resources/jar-command/resources/resource.txt b/spring-boot-project/spring-boot-cli/src/intTest/resources/jar-command/resources/resource.txt similarity index 100% rename from spring-boot-project/spring-boot-cli/src/it/resources/jar-command/resources/resource.txt rename to spring-boot-project/spring-boot-cli/src/intTest/resources/jar-command/resources/resource.txt diff --git a/spring-boot-project/spring-boot-cli/src/it/resources/jar-command/root.properties b/spring-boot-project/spring-boot-cli/src/intTest/resources/jar-command/root.properties similarity index 100% rename from spring-boot-project/spring-boot-cli/src/it/resources/jar-command/root.properties rename to spring-boot-project/spring-boot-cli/src/intTest/resources/jar-command/root.properties diff --git a/spring-boot-project/spring-boot-cli/src/it/resources/jar-command/static/static.txt b/spring-boot-project/spring-boot-cli/src/intTest/resources/jar-command/static/static.txt similarity index 100% rename from spring-boot-project/spring-boot-cli/src/it/resources/jar-command/static/static.txt rename to spring-boot-project/spring-boot-cli/src/intTest/resources/jar-command/static/static.txt diff --git a/spring-boot-project/spring-boot-cli/src/it/resources/jar-command/templates/template.txt b/spring-boot-project/spring-boot-cli/src/intTest/resources/jar-command/templates/template.txt similarity index 100% rename from spring-boot-project/spring-boot-cli/src/it/resources/jar-command/templates/template.txt rename to spring-boot-project/spring-boot-cli/src/intTest/resources/jar-command/templates/template.txt diff --git a/spring-boot-project/spring-boot-cli/src/it/resources/run-command/quiet.groovy b/spring-boot-project/spring-boot-cli/src/intTest/resources/run-command/quiet.groovy similarity index 100% rename from spring-boot-project/spring-boot-cli/src/it/resources/run-command/quiet.groovy rename to spring-boot-project/spring-boot-cli/src/intTest/resources/run-command/quiet.groovy diff --git a/spring-boot-project/spring-boot-cli/src/intTest/resources/settings.xml b/spring-boot-project/spring-boot-cli/src/intTest/resources/settings.xml new file mode 100644 index 0000000000..bbe1ac0ed3 --- /dev/null +++ b/spring-boot-project/spring-boot-cli/src/intTest/resources/settings.xml @@ -0,0 +1,23 @@ + + ../../../../build/local-m2-repository + + + cli-test-repo + + true + + + + local.central + file:../../../../build/test-repository + + true + + + true + + + + + + \ No newline at end of file diff --git a/spring-boot-project/spring-boot-cli/src/it/resources/war-command/root.properties b/spring-boot-project/spring-boot-cli/src/intTest/resources/war-command/root.properties similarity index 100% rename from spring-boot-project/spring-boot-cli/src/it/resources/war-command/root.properties rename to spring-boot-project/spring-boot-cli/src/intTest/resources/war-command/root.properties diff --git a/spring-boot-project/spring-boot-cli/src/it/resources/war-command/war.groovy b/spring-boot-project/spring-boot-cli/src/intTest/resources/war-command/war.groovy similarity index 100% rename from spring-boot-project/spring-boot-cli/src/it/resources/war-command/war.groovy rename to spring-boot-project/spring-boot-cli/src/intTest/resources/war-command/war.groovy diff --git a/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/CommandLineIT.java b/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/CommandLineIT.java deleted file mode 100644 index c98970b269..0000000000 --- a/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/CommandLineIT.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.cli; - -import java.io.File; -import java.io.IOException; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; - -import org.springframework.boot.cli.infrastructure.CommandLineInvoker; -import org.springframework.boot.cli.infrastructure.CommandLineInvoker.Invocation; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Integration Tests for the command line application. - * - * @author Andy Wilkinson - * @author Phillip Webb - */ -class CommandLineIT { - - private CommandLineInvoker cli; - - @BeforeEach - void setup(@TempDir File tempDir) { - this.cli = new CommandLineInvoker(tempDir); - } - - @Test void hintProducesListOfValidCommands() - throws IOException, InterruptedException { - Invocation cli = this.cli.invoke("hint"); - assertThat(cli.await()).isEqualTo(0); - assertThat(cli.getErrorOutput()).isEmpty(); - assertThat(cli.getStandardOutputLines()).hasSize(11); - } - - @Test void invokingWithNoArgumentsDisplaysHelp() - throws IOException, InterruptedException { - Invocation cli = this.cli.invoke(); - assertThat(cli.await()).isEqualTo(1); - assertThat(cli.getErrorOutput()).isEmpty(); - assertThat(cli.getStandardOutput()).startsWith("usage:"); - } - - @Test void unrecognizedCommandsAreHandledGracefully() - throws IOException, InterruptedException { - Invocation cli = this.cli.invoke("not-a-real-command"); - assertThat(cli.await()).isEqualTo(1); - assertThat(cli.getErrorOutput()) - .contains("'not-a-real-command' is not a valid command"); - assertThat(cli.getStandardOutput()).isEmpty(); - } - - @Test void version() throws IOException, InterruptedException { - Invocation cli = this.cli.invoke("version"); - assertThat(cli.await()).isEqualTo(0); - assertThat(cli.getErrorOutput()).isEmpty(); - assertThat(cli.getStandardOutput()).startsWith("Spring CLI v"); - } - - @Test void help() throws IOException, InterruptedException { - Invocation cli = this.cli.invoke("help"); - assertThat(cli.await()).isEqualTo(1); - assertThat(cli.getErrorOutput()).isEmpty(); - assertThat(cli.getStandardOutput()).startsWith("usage:"); - } - -} diff --git a/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/JarCommandIT.java b/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/JarCommandIT.java deleted file mode 100644 index 255b91d5de..0000000000 --- a/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/JarCommandIT.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.cli; - -import java.io.File; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; - -import org.springframework.boot.cli.command.archive.JarCommand; -import org.springframework.boot.cli.infrastructure.CommandLineInvoker; -import org.springframework.boot.cli.infrastructure.CommandLineInvoker.Invocation; -import org.springframework.boot.loader.tools.JavaExecutable; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Integration test for {@link JarCommand}. - * - * @author Andy Wilkinson - * @author Stephane Nicoll - */ -class JarCommandIT { - - private static final boolean JAVA_9_OR_LATER = isClassPresent( - "java.security.cert.URICertStoreParameters"); - - private CommandLineInvoker cli; - - private File tempDir; - - @BeforeEach - void setup(@TempDir File tempDir) { - this.cli = new CommandLineInvoker(new File("src/it/resources/jar-command"), - tempDir); - this.tempDir = tempDir; - } - - @Test void noArguments() throws Exception { - Invocation invocation = this.cli.invoke("jar"); - invocation.await(); - assertThat(invocation.getStandardOutput()).isEqualTo(""); - assertThat(invocation.getErrorOutput()).contains("The name of the " - + "resulting jar and at least one source file must be specified"); - } - - @Test void noSources() throws Exception { - Invocation invocation = this.cli.invoke("jar", "test-app.jar"); - invocation.await(); - assertThat(invocation.getStandardOutput()).isEqualTo(""); - assertThat(invocation.getErrorOutput()).contains("The name of the " - + "resulting jar and at least one source file must be specified"); - } - - @Test void jarCreationWithGrabResolver() throws Exception { - File jar = new File(this.tempDir, "test-app.jar"); - Invocation invocation = this.cli.invoke("run", jar.getAbsolutePath(), - "bad.groovy"); - invocation.await(); - if (!JAVA_9_OR_LATER) { - assertThat(invocation.getErrorOutput()).isEqualTo(""); - } - invocation = this.cli.invoke("jar", jar.getAbsolutePath(), "bad.groovy"); - invocation.await(); - if (!JAVA_9_OR_LATER) { - assertThat(invocation.getErrorOutput()).isEmpty(); - } - assertThat(jar).exists(); - - Process process = new JavaExecutable() - .processBuilder("-jar", jar.getAbsolutePath()).start(); - invocation = new Invocation(process); - invocation.await(); - - if (!JAVA_9_OR_LATER) { - assertThat(invocation.getErrorOutput()).isEqualTo(""); - } - } - - @Test void jarCreation() throws Exception { - File jar = new File(this.tempDir, "test-app.jar"); - Invocation invocation = this.cli.invoke("jar", jar.getAbsolutePath(), - "jar.groovy"); - invocation.await(); - if (!JAVA_9_OR_LATER) { - assertThat(invocation.getErrorOutput()).isEmpty(); - } - assertThat(jar).exists(); - - Process process = new JavaExecutable() - .processBuilder("-jar", jar.getAbsolutePath()).start(); - invocation = new Invocation(process); - invocation.await(); - - if (!JAVA_9_OR_LATER) { - assertThat(invocation.getErrorOutput()).isEqualTo(""); - } - assertThat(invocation.getStandardOutput()).contains("Hello World!") - .contains("/BOOT-INF/classes!/public/public.txt") - .contains("/BOOT-INF/classes!/resources/resource.txt") - .contains("/BOOT-INF/classes!/static/static.txt") - .contains("/BOOT-INF/classes!/templates/template.txt") - .contains("/BOOT-INF/classes!/root.properties").contains("Goodbye Mama"); - } - - @Test void jarCreationWithIncludes() throws Exception { - File jar = new File(this.tempDir, "test-app.jar"); - Invocation invocation = this.cli.invoke("jar", jar.getAbsolutePath(), "--include", - "-public/**,-resources/**", "jar.groovy"); - invocation.await(); - if (!JAVA_9_OR_LATER) { - assertThat(invocation.getErrorOutput()).isEmpty(); - } - assertThat(jar).exists(); - - Process process = new JavaExecutable() - .processBuilder("-jar", jar.getAbsolutePath()).start(); - invocation = new Invocation(process); - invocation.await(); - - if (!JAVA_9_OR_LATER) { - assertThat(invocation.getErrorOutput()).isEqualTo(""); - } - assertThat(invocation.getStandardOutput()).contains("Hello World!") - .doesNotContain("/public/public.txt") - .doesNotContain("/resources/resource.txt").contains("/static/static.txt") - .contains("/templates/template.txt").contains("Goodbye Mama"); - } - - private static boolean isClassPresent(String name) { - try { - Class.forName(name); - return true; - } - catch (Exception ex) { - return false; - } - } - -} diff --git a/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/WarCommandIT.java b/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/WarCommandIT.java deleted file mode 100644 index 0554fff7d9..0000000000 --- a/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/WarCommandIT.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.cli; - -import java.io.File; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; - -import org.springframework.boot.cli.command.archive.WarCommand; -import org.springframework.boot.cli.infrastructure.CommandLineInvoker; -import org.springframework.boot.cli.infrastructure.CommandLineInvoker.Invocation; -import org.springframework.boot.loader.tools.JavaExecutable; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Integration test for {@link WarCommand}. - * - * @author Andrey Stolyarov - * @author Henri Kerola - */ -class WarCommandIT { - - private CommandLineInvoker cli; - - private File tempDir; - - @BeforeEach - void setup(@TempDir File tempDir) { - this.cli = new CommandLineInvoker(new File("src/it/resources/war-command"), - tempDir); - this.tempDir = tempDir; - } - - @Test void warCreation() throws Exception { - File war = new File(this.tempDir, "test-app.war"); - Invocation invocation = this.cli.invoke("war", war.getAbsolutePath(), - "war.groovy"); - invocation.await(); - assertThat(war.exists()).isTrue(); - Process process = new JavaExecutable() - .processBuilder("-jar", war.getAbsolutePath(), "--server.port=0").start(); - invocation = new Invocation(process); - invocation.await(); - assertThat(invocation.getOutput()).contains("onStart error"); - assertThat(invocation.getOutput()).contains("Tomcat started"); - assertThat(invocation.getOutput()) - .contains("/WEB-INF/lib-provided/tomcat-embed-core"); - assertThat(invocation.getOutput()).contains("WEB-INF/classes!/root.properties"); - process.destroy(); - } - -} diff --git a/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/infrastructure/CommandLineInvoker.java b/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/infrastructure/CommandLineInvoker.java deleted file mode 100644 index b1e1c0cd78..0000000000 --- a/spring-boot-project/spring-boot-cli/src/it/java/org/springframework/boot/cli/infrastructure/CommandLineInvoker.java +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.cli.infrastructure; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.PrintWriter; -import java.io.StringReader; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -import org.springframework.boot.testsupport.BuildOutput; -import org.springframework.util.Assert; -import org.springframework.util.StreamUtils; - -/** - * Utility to invoke the command line in the same way as a user would, i.e. via the shell - * script in the package's bin directory. - * - * @author Andy Wilkinson - * @author Phillip Webb - */ -public final class CommandLineInvoker { - - private final File workingDirectory; - - private final File temp; - - public CommandLineInvoker(File temp) { - this(new File("."), temp); - } - - public CommandLineInvoker(File workingDirectory, File temp) { - this.workingDirectory = workingDirectory; - this.temp = temp; - } - - public Invocation invoke(String... args) throws IOException { - return new Invocation(runCliProcess(args)); - } - - private Process runCliProcess(String... args) throws IOException { - List command = new ArrayList<>(); - command.add(findLaunchScript().getAbsolutePath()); - command.addAll(Arrays.asList(args)); - ProcessBuilder processBuilder = new ProcessBuilder(command) - .directory(this.workingDirectory); - processBuilder.environment().remove("JAVA_OPTS"); - return processBuilder.start(); - } - - private File findLaunchScript() throws IOException { - File unpacked = new File(this.temp, "unpacked-cli"); - if (!unpacked.isDirectory()) { - File zip = new BuildOutput(getClass()).getRootLocation() - .listFiles((pathname) -> pathname.getName().endsWith("-bin.zip"))[0]; - try (ZipInputStream input = new ZipInputStream(new FileInputStream(zip))) { - ZipEntry entry; - while ((entry = input.getNextEntry()) != null) { - File file = new File(unpacked, entry.getName()); - if (entry.isDirectory()) { - file.mkdirs(); - } - else { - file.getParentFile().mkdirs(); - try (FileOutputStream output = new FileOutputStream(file)) { - StreamUtils.copy(input, output); - if (entry.getName().endsWith("/bin/spring")) { - file.setExecutable(true); - } - } - } - } - } - } - File bin = new File(unpacked.listFiles()[0], "bin"); - File launchScript = new File(bin, isWindows() ? "spring.bat" : "spring"); - Assert.state(launchScript.exists() && launchScript.isFile(), - () -> "Could not find CLI launch script " - + launchScript.getAbsolutePath()); - return launchScript; - } - - private boolean isWindows() { - return File.separatorChar == '\\'; - } - - /** - * An ongoing Process invocation. - */ - public static final class Invocation { - - private final StringBuffer err = new StringBuffer(); - - private final StringBuffer out = new StringBuffer(); - - private final StringBuffer combined = new StringBuffer(); - - private final Process process; - - private final List streamReaders = new ArrayList<>(); - - public Invocation(Process process) { - this.process = process; - this.streamReaders.add(new Thread(new StreamReadingRunnable( - this.process.getErrorStream(), this.err, this.combined))); - this.streamReaders.add(new Thread(new StreamReadingRunnable( - this.process.getInputStream(), this.out, this.combined))); - for (Thread streamReader : this.streamReaders) { - streamReader.start(); - } - } - - public String getOutput() { - return postProcessLines(getLines(this.combined)); - } - - public String getErrorOutput() { - return postProcessLines(getLines(this.err)); - } - - public String getStandardOutput() { - return postProcessLines(getStandardOutputLines()); - } - - public List getStandardOutputLines() { - return getLines(this.out); - } - - private String postProcessLines(List lines) { - StringWriter out = new StringWriter(); - PrintWriter printOut = new PrintWriter(out); - for (String line : lines) { - if (!line.startsWith("Maven settings decryption failed")) { - printOut.println(line); - } - } - return out.toString(); - } - - private List getLines(StringBuffer buffer) { - BufferedReader reader = new BufferedReader( - new StringReader(buffer.toString())); - return reader.lines().filter((line) -> !line.startsWith("Picked up ")) - .collect(Collectors.toList()); - } - - public int await() throws InterruptedException { - for (Thread streamReader : this.streamReaders) { - streamReader.join(); - } - return this.process.waitFor(); - } - - /** - * {@link Runnable} to copy stream output. - */ - private final class StreamReadingRunnable implements Runnable { - - private final InputStream stream; - - private final StringBuffer[] outputs; - - private final byte[] buffer = new byte[4096]; - - private StreamReadingRunnable(InputStream stream, StringBuffer... outputs) { - this.stream = stream; - this.outputs = outputs; - } - - @Override - public void run() { - int read; - try { - while ((read = this.stream.read(this.buffer)) > 0) { - for (StringBuffer output : this.outputs) { - output.append(new String(this.buffer, 0, read)); - } - } - } - catch (IOException ex) { - // Allow thread to die - } - } - - } - - } - -} diff --git a/spring-boot-project/spring-boot-cli/src/main/homebrew/springboot.rb b/spring-boot-project/spring-boot-cli/src/main/homebrew/springboot.rb index 4c9d0e7590..5f338dcceb 100644 --- a/spring-boot-project/spring-boot-cli/src/main/homebrew/springboot.rb +++ b/spring-boot-project/spring-boot-cli/src/main/homebrew/springboot.rb @@ -4,7 +4,7 @@ class Springboot < Formula homepage 'https://spring.io/projects/spring-boot' url 'https://repo.spring.io/${repo}/org/springframework/boot/spring-boot-cli/${project.version}/spring-boot-cli-${project.version}-bin.tar.gz' version '${project.version}' - sha256 '${checksum}' + sha256 '${hash}' head 'https://github.com/spring-projects/spring-boot.git' if build.head? diff --git a/spring-boot-project/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/dependencies/SpringBootDependenciesDependencyManagement.java b/spring-boot-project/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/dependencies/SpringBootDependenciesDependencyManagement.java index 694c278542..7f79b5c08a 100644 --- a/spring-boot-project/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/dependencies/SpringBootDependenciesDependencyManagement.java +++ b/spring-boot-project/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/dependencies/SpringBootDependenciesDependencyManagement.java @@ -42,8 +42,8 @@ public class SpringBootDependenciesDependencyManagement extends MavenModelDepend modelProcessor.setModelReader(new DefaultModelReader()); try { - return modelProcessor.read( - SpringBootDependenciesDependencyManagement.class.getResourceAsStream("effective-pom.xml"), null); + return modelProcessor.read(SpringBootDependenciesDependencyManagement.class + .getResourceAsStream("spring-boot-dependencies-effective-bom.xml"), null); } catch (IOException ex) { throw new IllegalStateException("Failed to build model from effective pom", ex); diff --git a/spring-boot-project/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/maven/MavenSettingsReader.java b/spring-boot-project/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/maven/MavenSettingsReader.java index 10a8e7b02a..c1ae15b6d5 100644 --- a/spring-boot-project/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/maven/MavenSettingsReader.java +++ b/spring-boot-project/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/maven/MavenSettingsReader.java @@ -17,7 +17,6 @@ package org.springframework.boot.cli.compiler.maven; import java.io.File; -import java.lang.reflect.Field; import org.apache.maven.settings.Settings; import org.apache.maven.settings.building.DefaultSettingsBuilderFactory; @@ -83,21 +82,7 @@ public class MavenSettingsReader { } private SettingsDecrypter createSettingsDecrypter() { - SettingsDecrypter settingsDecrypter = new DefaultSettingsDecrypter(); - setField(DefaultSettingsDecrypter.class, "securityDispatcher", settingsDecrypter, - new SpringBootSecDispatcher()); - return settingsDecrypter; - } - - private void setField(Class sourceClass, String fieldName, Object target, Object value) { - try { - Field field = sourceClass.getDeclaredField(fieldName); - field.setAccessible(true); - field.set(target, value); - } - catch (Exception ex) { - throw new IllegalStateException("Failed to set field '" + fieldName + "' on '" + target + "'", ex); - } + return new DefaultSettingsDecrypter(new SpringBootSecDispatcher()); } private class SpringBootSecDispatcher extends DefaultSecDispatcher { diff --git a/spring-boot-project/spring-boot-cli/src/main/scoop/springboot.json b/spring-boot-project/spring-boot-cli/src/main/scoop/springboot.json index b8b3ad73f2..dbfe2308cc 100644 --- a/spring-boot-project/spring-boot-cli/src/main/scoop/springboot.json +++ b/spring-boot-project/spring-boot-cli/src/main/scoop/springboot.json @@ -1,11 +1,11 @@ { "homepage": "https://projects.spring.io/spring-boot/", - "version": "${scoop-version}", + "version": "${scoopVersion}", "license": "Apache 2.0", "hash": "${hash}", "url": "https://repo.spring.io/${repo}/org/springframework/boot/spring-boot-cli/${project.version}/spring-boot-cli-${project.version}-bin.zip", "extract_dir": "spring-${project.version}", - "bin": "bin\\spring.bat", + "bin": "bin\\\\spring.bat", "suggest": { "JDK": [ "java/oraclejdk", @@ -14,13 +14,13 @@ }, "checkver": { "github": "https://github.com/spring-projects/spring-boot", - "re": "/releases/tag/(?:v)?(2[\\d.]+)\\.RELEASE" + "re": "/releases/tag/(?:v)?(2[\\d.]+)\\\\.RELEASE" }, "autoupdate": { - "url": "https://repo.spring.io/release/org/springframework/boot/spring-boot-cli/$version.RELEASE/spring-boot-cli-$version.RELEASE-bin.zip", - "extract_dir": "spring-$version.RELEASE", + "url": "https://repo.spring.io/release/org/springframework/boot/spring-boot-cli/\$version.RELEASE/spring-boot-cli-\$version.RELEASE-bin.zip", + "extract_dir": "spring-\$version.RELEASE", "hash": { - "url": "$url.sha256" + "url": "\$url.sha256" } } } diff --git a/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/CliTester.java b/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/CliTester.java index f9015b196f..0586e792af 100644 --- a/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/CliTester.java +++ b/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/CliTester.java @@ -96,12 +96,14 @@ public class CliTester implements BeforeEachCallback, AfterEachCallback { for (String arg : args) { if (arg.startsWith("--classpath=")) { arg = arg + ":" + this.buildOutput.getTestClassesLocation().getAbsolutePath(); + arg = arg + ":" + this.buildOutput.getTestResourcesLocation().getAbsolutePath(); classpathUpdated = true; } updatedArgs.add(arg); } if (!classpathUpdated) { - updatedArgs.add("--classpath=.:" + this.buildOutput.getTestClassesLocation().getAbsolutePath()); + updatedArgs.add("--classpath=.:" + this.buildOutput.getTestClassesLocation().getAbsolutePath() + ":" + + this.buildOutput.getTestResourcesLocation().getAbsolutePath()); } Future future = submitCommand(new RunCommand(), StringUtils.toStringArray(updatedArgs)); this.commands.add(future.get(this.timeout, TimeUnit.MILLISECONDS)); @@ -134,6 +136,8 @@ public class CliTester implements BeforeEachCallback, AfterEachCallback { "org.springframework.boot.cli.CliTesterSpringApplication"); this.serverPortFile = new File(this.temp, "server.port"); System.setProperty("portfile", this.serverPortFile.getAbsolutePath()); + String userHome = System.getProperty("user.home"); + System.setProperty("user.home", "src/test/resources/cli-tester"); try { command.run(sources); return command; @@ -142,6 +146,7 @@ public class CliTester implements BeforeEachCallback, AfterEachCallback { System.clearProperty("server.port"); System.clearProperty("spring.application.class.name"); System.clearProperty("portfile"); + System.setProperty("user.home", userHome); Thread.currentThread().setContextClassLoader(loader); } }); diff --git a/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/GrabCommandIntegrationTests.java b/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/GrabCommandIntegrationTests.java index 8790f3f314..fec42a0efc 100644 --- a/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/GrabCommandIntegrationTests.java +++ b/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/GrabCommandIntegrationTests.java @@ -57,15 +57,12 @@ class GrabCommandIntegrationTests { @Test void grab() throws Exception { - System.setProperty("grape.root", this.cli.getTemp().getAbsolutePath()); System.setProperty("groovy.grape.report.downloads", "true"); - // Use --autoconfigure=false to limit the amount of downloaded dependencies String output = this.cli.grab("grab.groovy", "--autoconfigure=false"); assertThat(new File(this.cli.getTemp(), "repository/joda-time/joda-time")).isDirectory(); - // Should be resolved from local repository cache - assertThat(output.contains("Downloading: file:")).isTrue(); + assertThat(output).contains("Downloading: "); } @Test diff --git a/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/RunCommandIntegrationTests.java b/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/RunCommandIntegrationTests.java index d16fa45684..28c5991d5b 100644 --- a/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/RunCommandIntegrationTests.java +++ b/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/RunCommandIntegrationTests.java @@ -42,7 +42,7 @@ class RunCommandIntegrationTests { CliTester cli; RunCommandIntegrationTests(CapturedOutput output) { - this.cli = new CliTester("src/it/resources/run-command/", output); + this.cli = new CliTester("src/test/resources/run-command/", output); } private Properties systemProperties = new Properties(); diff --git a/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/compiler/dependencies/SpringBootDependenciesDependencyManagementTests.java b/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/compiler/dependencies/SpringBootDependenciesDependencyManagementTests.java index abf868f0f7..b6677248c5 100644 --- a/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/compiler/dependencies/SpringBootDependenciesDependencyManagementTests.java +++ b/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/compiler/dependencies/SpringBootDependenciesDependencyManagementTests.java @@ -19,7 +19,6 @@ package org.springframework.boot.cli.compiler.dependencies; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -import static org.hamcrest.Matchers.empty; /** * Tests for {@link SpringBootDependenciesDependencyManagement} @@ -45,7 +44,7 @@ class SpringBootDependenciesDependencyManagementTests { @Test void getDependencies() { - assertThat(this.dependencyManagement.getDependencies()).isNotEqualTo(empty()); + assertThat(this.dependencyManagement.getDependencies()).isNotEmpty(); } } diff --git a/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/compiler/grape/AetherGrapeEngineTests.java b/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/compiler/grape/AetherGrapeEngineTests.java index 95377e122b..2c1d15329c 100644 --- a/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/compiler/grape/AetherGrapeEngineTests.java +++ b/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/compiler/grape/AetherGrapeEngineTests.java @@ -47,9 +47,12 @@ class AetherGrapeEngineTests { private final GroovyClassLoader groovyClassLoader = new GroovyClassLoader(); - private final RepositoryConfiguration springMilestones = new RepositoryConfiguration("spring-milestones", + private final RepositoryConfiguration springMilestone = new RepositoryConfiguration("spring-milestone", URI.create("https://repo.spring.io/milestone"), false); + private final RepositoryConfiguration springSnaphot = new RepositoryConfiguration("spring-snapshot", + URI.create("https://repo.spring.io/snapshot"), true); + private AetherGrapeEngine createGrapeEngine(RepositoryConfiguration... additionalRepositories) { List repositoryConfigurations = new ArrayList<>(); repositoryConfigurations @@ -64,7 +67,7 @@ class AetherGrapeEngineTests { @Test void dependencyResolution() { Map args = new HashMap<>(); - createGrapeEngine(this.springMilestones).grab(args, + createGrapeEngine(this.springMilestone, this.springSnaphot).grab(args, createDependency("org.springframework", "spring-jdbc", null)); assertThat(this.groovyClassLoader.getURLs()).hasSize(5); } @@ -104,7 +107,7 @@ class AetherGrapeEngineTests { Map args = new HashMap<>(); args.put("excludes", Arrays.asList(createExclusion("org.springframework", "spring-core"))); - createGrapeEngine(this.springMilestones).grab(args, + createGrapeEngine(this.springMilestone, this.springSnaphot).grab(args, createDependency("org.springframework", "spring-jdbc", "3.2.4.RELEASE"), createDependency("org.springframework", "spring-beans", "3.2.4.RELEASE")); @@ -126,7 +129,7 @@ class AetherGrapeEngineTests { GroovyClassLoader customClassLoader = new GroovyClassLoader(); args.put("classLoader", customClassLoader); - createGrapeEngine(this.springMilestones).grab(args, + createGrapeEngine(this.springMilestone, this.springSnaphot).grab(args, createDependency("org.springframework", "spring-jdbc", null)); assertThat(this.groovyClassLoader.getURLs()).isEmpty(); diff --git a/spring-boot-project/spring-boot-cli/src/test/resources/.m2/settings.xml b/spring-boot-project/spring-boot-cli/src/test/resources/.m2/settings.xml index 8ae764f39d..7aff364114 100644 --- a/spring-boot-project/spring-boot-cli/src/test/resources/.m2/settings.xml +++ b/spring-boot-project/spring-boot-cli/src/test/resources/.m2/settings.xml @@ -2,7 +2,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"> - + build/local-m2-repository central-mirror @@ -10,7 +10,6 @@ central - central-mirror @@ -18,7 +17,6 @@ password - true @@ -29,5 +27,4 @@ password - diff --git a/spring-boot-project/spring-boot-cli/src/test/resources/cli-tester/.m2/settings.xml b/spring-boot-project/spring-boot-cli/src/test/resources/cli-tester/.m2/settings.xml new file mode 100644 index 0000000000..504eb80a05 --- /dev/null +++ b/spring-boot-project/spring-boot-cli/src/test/resources/cli-tester/.m2/settings.xml @@ -0,0 +1,44 @@ + + + build/local-m2-repository + + + cli-test-repo + + true + + + + local.central + file:build/test-repository + + true + + + true + + + + spring-snapshot + https://repo.spring.io/snapshot + + false + + + true + + + + spring-milestone + https://repo.spring.io/milestone + + true + + + false + + + + + + diff --git a/spring-boot-project/spring-boot-cli/src/test/resources/run-command/quiet.groovy b/spring-boot-project/spring-boot-cli/src/test/resources/run-command/quiet.groovy new file mode 100644 index 0000000000..32640370e1 --- /dev/null +++ b/spring-boot-project/spring-boot-cli/src/test/resources/run-command/quiet.groovy @@ -0,0 +1,10 @@ +package org.test + +@Component +class Example implements CommandLineRunner { + + void run(String... args) { + print "Ssshh" + } + +} \ No newline at end of file diff --git a/spring-boot-project/spring-boot-dependencies/build.gradle b/spring-boot-project/spring-boot-dependencies/build.gradle new file mode 100644 index 0000000000..f3d7d7ec17 --- /dev/null +++ b/spring-boot-project/spring-boot-dependencies/build.gradle @@ -0,0 +1,1900 @@ +plugins { + id 'org.springframework.boot.bom' + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.deployed' +} + +description = 'Spring Boot Dependencies' + +bom { + upgrade { + policy = 'same-major-version' + gitHub { + issueLabels = ['type: dependency-upgrade'] + } + } + library('ActiveMQ', '5.15.11') { + group('org.apache.activemq') { + modules = [ + 'activemq-amqp', + 'activemq-blueprint', + 'activemq-broker', + 'activemq-camel', + 'activemq-client', + 'activemq-console' { + exclude group: 'commons-logging', module: 'commons-logging' + }, + 'activemq-http', + 'activemq-jaas', + 'activemq-jdbc-store', + 'activemq-jms-pool', + 'activemq-kahadb-store', + 'activemq-karaf', + 'activemq-leveldb-store' { + exclude group: 'commons-logging', module: 'commons-logging' + }, + 'activemq-log4j-appender', + 'activemq-mqtt', + 'activemq-openwire-generator', + 'activemq-openwire-legacy', + 'activemq-osgi', + 'activemq-partition', + 'activemq-pool', + 'activemq-ra', + 'activemq-run', + 'activemq-runtime-config', + 'activemq-shiro', + 'activemq-spring' { + exclude group: 'commons-logging', module: 'commons-logging' + }, + 'activemq-stomp', + 'activemq-web' + ] + } + } + library('ANTLR2', '2.7.7') { + group('antlr') { + modules = [ + 'antlr' + ] + } + } + library('AppEngine SDK', '1.9.77') { + group('com.google.appengine') { + modules = [ + 'appengine-api-1.0-sdk' + ] + } + } + library('Artemis', '2.10.1') { + group('org.apache.activemq') { + modules = [ + 'artemis-amqp-protocol', + 'artemis-commons' { + exclude group: 'commons-logging', module: 'commons-logging' + }, + 'artemis-core-client' { + exclude group: 'org.apache.geronimo.specs', module: 'geronimo-json_1.0_spec' + }, + 'artemis-jms-client' { + exclude group: 'org.apache.geronimo.specs', module: 'geronimo-json_1.0_spec' + }, + 'artemis-jms-server' { + exclude group: 'org.apache.geronimo.specs', module: 'geronimo-json_1.0_spec' + }, + 'artemis-journal', + 'artemis-selector', + 'artemis-server' { + exclude group: 'commons-logging', module: 'commons-logging' + exclude group: 'org.apache.geronimo.specs', module: 'geronimo-json_1.0_spec' + }, + 'artemis-service-extensions' + ] + } + } + library('AspectJ', '1.9.5') { + group('org.aspectj') { + modules = [ + 'aspectjrt', + 'aspectjtools', + 'aspectjweaver' + ] + } + } + library('AssertJ', '3.14.0') { + group('org.assertj') { + modules = [ + 'assertj-core' + ] + } + } + library('Atomikos', '4.0.6') { + group('com.atomikos') { + modules = [ + 'transactions-jdbc', + 'transactions-jms', + 'transactions-jta' + ] + } + } + library('Awaitility', '4.0.1') { + group('org.awaitility') { + modules = [ + 'awaitility', + 'awaitility-groovy', + 'awaitility-kotlin', + 'awaitility-scala' + ] + } + } + library('Bitronix', '2.1.4') { + group('org.codehaus.btm') { + modules = [ + 'btm' + ] + } + } + library('Build Helper Maven Plugin', '3.0.0') { + group('org.codehaus.mojo') { + plugins = [ + 'build-helper-maven-plugin' + ] + } + } + library('Byte Buddy', '1.10.4') { + group('net.bytebuddy') { + modules = [ + 'byte-buddy', + 'byte-buddy-agent' + ] + } + } + library('Caffeine', '2.8.0') { + group('com.github.ben-manes.caffeine') { + modules = [ + 'caffeine', + 'guava', + 'jcache', + 'simulator' + ] + } + } + library('Cassandra Driver', '3.7.2') { + group('com.datastax.cassandra') { + modules = [ + 'cassandra-driver-core', + 'cassandra-driver-mapping' + ] + } + } + library('Classmate', '1.5.1') { + group('com.fasterxml') { + modules = [ + 'classmate' + ] + } + } + library('Commons Codec', '1.13') { + group('commons-codec') { + modules = [ + 'commons-codec' + ] + } + } + library('Commons DBCP2', '2.7.0') { + group('org.apache.commons') { + modules = [ + 'commons-dbcp2' { + exclude group: 'commons-logging', module: 'commons-logging' + } + ] + } + } + library('Commons Lang3', '3.9') { + group('org.apache.commons') { + modules = [ + 'commons-lang3' + ] + } + } + library('Commons Pool', '1.6') { + group('commons-pool') { + modules = [ + 'commons-pool' + ] + } + } + library('Commons Pool2', '2.7.0') { + group('org.apache.commons') { + modules = [ + 'commons-pool2' + ] + } + } + library('Couchbase Cache Client', '2.1.0') { + group('com.couchbase.client') { + modules = [ + 'couchbase-spring-cache' + ] + } + } + library('Couchbase Client', '2.7.11') { + group('com.couchbase.client') { + modules = [ + 'java-client' + ] + } + } + library('DB2 JDBC', '11.5.0.0') { + group('com.ibm.db2') { + modules = [ + 'jcc' + ] + } + } + library('Dependency Management Plugin', '1.0.8.RELEASE') { + group('io.spring.gradle') { + modules = [ + 'dependency-management-plugin' + ] + } + } + library('Derby', '10.14.2.0') { + prohibit('[10.15,)') { + because 'it requires Java 9' + } + group('org.apache.derby') { + modules = [ + 'derby', + 'derbyclient' + ] + } + } + library('Dropwizard Metrics', '4.1.1') { + group('io.dropwizard.metrics') { + modules = [ + 'metrics-annotation', + 'metrics-core', + 'metrics-ehcache', + 'metrics-graphite', + 'metrics-healthchecks', + 'metrics-httpasyncclient', + 'metrics-jdbi', + 'metrics-jersey2', + 'metrics-jetty9', + 'metrics-jmx', + 'metrics-json', + 'metrics-jvm', + 'metrics-log4j2', + 'metrics-logback', + 'metrics-servlet', + 'metrics-servlets' + ] + } + } + library('Ehcache', '2.10.6') { + group('net.sf.ehcache') { + modules = [ + 'ehcache' + ] + } + } + library('Ehcache3', '3.8.1') { + group('org.ehcache') { + modules = [ + 'ehcache', + 'ehcache-clustered', + 'ehcache-transactions' + ] + } + } + library('Elasticsearch', '6.8.5') { + group('org.elasticsearch') { + modules = [ + 'elasticsearch' + ] + } + group('org.elasticsearch.client') { + modules = [ + 'transport', + 'elasticsearch-rest-client' { + exclude group: 'commons-logging', module: 'commons-logging' + }, + 'elasticsearch-rest-high-level-client' + ] + } + group('org.elasticsearch.distribution.integ-test-zip') { + modules = [ + 'elasticsearch' + ] + } + group('org.elasticsearch.plugin') { + modules = [ + 'transport-netty4-client' + ] + } + } + library('Embedded Mongo', '2.2.0') { + group('de.flapdoodle.embed') { + modules = [ + 'de.flapdoodle.embed.mongo' + ] + } + } + library('Exec Maven Plugin', '1.6.0') { + group('org.codehaus.mojo') { + plugins = [ + 'exec-maven-plugin' + ] + } + } + library('Flatten Maven Plugin', '1.1.0') { + group('org.codehaus.mojo') { + plugins = [ + 'flatten-maven-plugin' + ] + } + } + library('Flyway', '6.1.3') { + group('org.flywaydb') { + modules = [ + 'flyway-core' + ] + plugins = [ + 'flyway-maven-plugin' + ] + } + } + library('FreeMarker', '2.3.29') { + group('org.freemarker') { + modules = [ + 'freemarker' + ] + } + } + library('Git Commit ID Plugin', '3.0.1') { + group('pl.project13.maven') { + plugins = [ + 'git-commit-id-plugin' + ] + } + } + library('Glassfish EL', '3.0.3') { + group('org.glassfish') { + modules = [ + 'jakarta.el' + ] + } + } + library('Glassfish JAXB', '2.3.2') { + group('org.glassfish.jaxb') { + modules = [ + 'codemodel', + 'codemodel-annotation-compiler', + 'jaxb-jxc', + 'jaxb-runtime', + 'jaxb-xjc', + 'txw2', + 'txwc2', + 'xsom' + ] + } + } + library('Groovy', '2.5.8') { + group('org.codehaus.groovy') { + modules = [ + 'groovy', + 'groovy-ant', + 'groovy-backports-compat23', + 'groovy-bsf', + 'groovy-cli-commons', + 'groovy-cli-picocli', + 'groovy-console', + 'groovy-datetime', + 'groovy-dateutil', + 'groovy-docgenerator', + 'groovy-groovydoc', + 'groovy-groovysh', + 'groovy-jaxb', + 'groovy-jmx', + 'groovy-json', + 'groovy-json-direct', + 'groovy-jsr223', + 'groovy-macro', + 'groovy-nio', + 'groovy-servlet', + 'groovy-sql', + 'groovy-swing', + 'groovy-templates', + 'groovy-test', + 'groovy-test-junit5', + 'groovy-testng', + 'groovy-xml' + ] + } + } + library('Gson', '2.8.6') { + group('com.google.code.gson') { + modules = [ + 'gson' + ] + } + } + library('H2', '1.4.200') { + group('com.h2database') { + modules = [ + 'h2' + ] + } + } + library('Hamcrest', '2.2') { + group('org.hamcrest') { + modules = [ + 'hamcrest', + 'hamcrest-core', + 'hamcrest-library' + ] + } + } + library('Hazelcast', '3.12.4') { + group('com.hazelcast') { + modules = [ + 'hazelcast', + 'hazelcast-client', + 'hazelcast-spring' + ] + } + } + library('Hazelcast Hibernate5', '1.3.2') { + group('com.hazelcast') { + modules = [ + 'hazelcast-hibernate52', + 'hazelcast-hibernate53' + ] + } + } + library('Hibernate', '5.4.9.Final') { + group('org.hibernate') { + modules = [ + 'hibernate-c3p0', + 'hibernate-core', + 'hibernate-ehcache', + 'hibernate-entitymanager', + 'hibernate-envers', + 'hibernate-hikaricp', + 'hibernate-java8', + 'hibernate-jcache', + 'hibernate-jpamodelgen', + 'hibernate-proxool', + 'hibernate-spatial', + 'hibernate-testing', + 'hibernate-vibur' + ] + } + } + library('Hibernate Validator', '6.1.0.Final') { + group('org.hibernate.validator') { + modules = [ + 'hibernate-validator', + 'hibernate-validator-annotation-processor' + ] + } + } + library('HikariCP', '3.4.1') { + group('com.zaxxer') { + modules = [ + 'HikariCP' + ] + } + } + library('HSQLDB', '2.5.0') { + group('org.hsqldb') { + modules = [ + 'hsqldb' + ] + } + } + library('HtmlUnit', '2.36.0') { + group('net.sourceforge.htmlunit') { + modules = [ + 'htmlunit' { + exclude group: 'commons-logging', module: 'commons-logging' + } + ] + } + } + library('HttpAsyncClient', '4.1.4') { + group('org.apache.httpcomponents') { + modules = [ + 'httpasyncclient' { + exclude group: 'commons-logging', module: 'commons-logging' + } + ] + } + } + library('HttpClient', '4.5.10') { + group('org.apache.httpcomponents') { + modules = [ + 'fluent-hc', + 'httpclient' { + exclude group: 'commons-logging', module: 'commons-logging' + }, + 'httpclient-cache', + 'httpclient-osgi', + 'httpclient-win', + 'httpmime' + ] + } + } + library('HttpCore', '4.4.12') { + group('org.apache.httpcomponents') { + modules = [ + 'httpcore', + 'httpcore-nio' + ] + } + } + library('Infinispan', '9.4.16.Final') { + group('org.infinispan') { + modules = [ + 'infinispan-cachestore-jdbc', + 'infinispan-cachestore-jpa', + 'infinispan-cachestore-leveldb', + 'infinispan-cachestore-remote', + 'infinispan-cachestore-rest', + 'infinispan-cachestore-rocksdb', + 'infinispan-cdi-common', + 'infinispan-cdi-embedded', + 'infinispan-cdi-remote', + 'infinispan-client-hotrod', + 'infinispan-cloud', + 'infinispan-clustered-counter', + 'infinispan-clustered-lock', + 'infinispan-commons', + 'infinispan-core', + 'infinispan-directory-provider', + 'infinispan-hibernate-cache-v53', + 'infinispan-jcache', + 'infinispan-jcache-commons', + 'infinispan-jcache-remote', + 'infinispan-lucene-directory', + 'infinispan-objectfilter', + 'infinispan-osgi', + 'infinispan-persistence-cli', + 'infinispan-persistence-soft-index', + 'infinispan-query', + 'infinispan-query-dsl', + 'infinispan-remote-query-client', + 'infinispan-remote-query-server', + 'infinispan-scripting', + 'infinispan-server-core', + 'infinispan-server-hotrod', + 'infinispan-server-memcached', + 'infinispan-server-router', + 'infinispan-spring4-common', + 'infinispan-spring4-embedded', + 'infinispan-spring4-remote', + 'infinispan-spring5-common', + 'infinispan-spring5-embedded', + 'infinispan-spring5-remote', + 'infinispan-tasks', + 'infinispan-tasks-api', + 'infinispan-tools', + 'infinispan-tree' + ] + plugins = [ + 'infinispan-protocol-parser-generator-maven-plugin' + ] + } + } + library('InfluxDB Java', '2.16') { + group('org.influxdb') { + modules = [ + 'influxdb-java' + ] + } + } + library('Jackson Bom', '2.10.1') { + group('com.fasterxml.jackson') { + imports = [ + 'jackson-bom' + ] + } + } + library('Jakarta Activation', '1.2.1') { + group('com.sun.activation') { + modules = [ + 'jakarta.activation' + ] + } + group('jakarta.activation') { + modules = [ + 'jakarta.activation-api' + ] + } + } + library('Jakarta Annotation', '1.3.5') { + group('jakarta.annotation') { + modules = [ + 'jakarta.annotation-api' + ] + } + } + library('Jakarta JMS', '2.0.3') { + group('jakarta.jms') { + modules = [ + 'jakarta.jms-api' + ] + } + } + library('Jakarta Json', '1.1.6') { + group('jakarta.json') { + modules = [ + 'jakarta.json-api' + ] + } + } + library('Jakarta Json Bind', '1.0.2') { + group('jakarta.json.bind') { + modules = [ + 'jakarta.json.bind-api' + ] + } + } + library('Jakarta Mail', '1.6.4') { + group('jakarta.mail') { + modules = [ + 'jakarta.mail-api' + ] + } + } + library('Jakarta Persistence', '2.2.3') { + group('jakarta.persistence') { + modules = [ + 'jakarta.persistence-api' + ] + } + } + library('Jakarta Servlet', '4.0.3') { + group('jakarta.servlet') { + modules = [ + 'jakarta.servlet-api' + ] + } + } + library('Jakarta Servlet JSP JSTL', '1.2.7') { + group('jakarta.servlet.jsp.jstl') { + modules = [ + 'jakarta.servlet.jsp.jstl-api' + ] + } + } + library('Jakarta Transaction', '1.3.3') { + group('jakarta.transaction') { + modules = [ + 'jakarta.transaction-api' + ] + } + } + library('Jakarta Validation', '2.0.1') { + group('jakarta.validation') { + modules = [ + 'jakarta.validation-api' + ] + } + } + library('Jakarta WebSocket', '1.1.2') { + group('jakarta.websocket') { + modules = [ + 'jakarta.websocket-api' + ] + } + } + library('Jakarta WS RS', '2.1.6') { + group('jakarta.ws.rs') { + modules = [ + 'jakarta.ws.rs-api' + ] + } + } + library('Jakarta XML Bind', '2.3.2') { + group('jakarta.xml.bind') { + modules = [ + 'jakarta.xml.bind-api' + ] + } + } + library('Jakarta XML WS', '2.3.2') { + group('jakarta.xml.ws') { + modules = [ + 'jakarta.xml.ws-api' + ] + } + } + library('Janino', '3.1.0') { + group('org.codehaus.janino') { + modules = [ + 'commons-compiler', + 'commons-compiler-jdk', + 'janino' + ] + } + } + library('Javax Activation', '1.2.0') { + group('javax.activation') { + modules = [ + 'javax.activation-api' + ] + } + } + library('Javax Annotation', '1.3.2') { + group('javax.annotation') { + modules = [ + 'javax.annotation-api' + ] + } + } + library('Javax Cache', '1.1.1') { + group('javax.cache') { + modules = [ + 'cache-api' + ] + } + } + library('Javax JAXB', '2.3.1') { + group('javax.xml.bind') { + modules = [ + 'jaxb-api' + ] + } + } + library('Javax JAXWS', '2.3.1') { + group('javax.xml.ws') { + modules = [ + 'jaxws-api' + ] + } + } + library('Javax JMS', '2.0.1') { + group('javax.jms') { + modules = [ + 'javax.jms-api' + ] + } + } + library('Javax Json', '1.1.4') { + group('javax.json') { + modules = [ + 'javax.json-api' + ] + } + } + library('Javax JsonB', '1.0') { + group('javax.json.bind') { + modules = [ + 'javax.json.bind-api' + ] + } + } + library('Javax Mail', '1.6.2') { + group('javax.mail') { + modules = [ + 'javax.mail-api' + ] + } + } + library('Javax Money', '1.0.3') { + group('javax.money') { + modules = [ + 'money-api' + ] + } + } + library('Javax Persistence', '2.2') { + group('javax.persistence') { + modules = [ + 'javax.persistence-api' + ] + } + } + library('Javax Transaction', '1.3') { + group('javax.transaction') { + modules = [ + 'javax.transaction-api' + ] + } + } + library('Javax Validation', '2.0.1.Final') { + group('javax.validation') { + modules = [ + 'validation-api' + ] + } + } + library('Javax WebSocket', '1.1') { + group('javax.websocket') { + modules = [ + 'javax.websocket-api' + ] + } + } + library('Jaxen', '1.2.0') { + group('jaxen') { + modules = [ + 'jaxen' + ] + } + } + library('Jaybird', '3.0.8') { + group('org.firebirdsql.jdbc') { + modules = [ + 'jaybird-jdk17', + 'jaybird-jdk18' + ] + } + } + library('JBoss Logging', '3.4.1.Final') { + group('org.jboss.logging') { + modules = [ + 'jboss-logging' + ] + } + } + library('JBoss Transaction SPI', '7.6.0.Final') { + group('org.jboss') { + modules = [ + 'jboss-transaction-spi' + ] + } + } + library('JDOM2', '2.0.6') { + group('org.jdom') { + modules = [ + 'jdom2' + ] + } + } + library('Jedis', '3.1.0') { + group('redis.clients') { + modules = [ + 'jedis' + ] + } + } + library('Jersey', '2.29.1') { + group('org.glassfish.jersey') { + imports = [ + 'jersey-bom' + ] + } + } + library('Jest', '6.3.1') { + group('io.searchbox') { + modules = [ + 'jest' + ] + } + } + library('Jetty EL', '8.5.40') { + group('org.mortbay.jasper') { + modules = [ + 'apache-el' + ] + } + } + library('Jetty JSP', '2.2.0.v201112011158') { + group('org.eclipse.jetty.orbit') { + modules = [ + 'javax.servlet.jsp' + ] + } + } + library('Jetty Reactive HTTPClient', '1.1.0') { + group('org.eclipse.jetty') { + modules = [ + 'jetty-reactive-httpclient' + ] + } + } + library('Jetty', '9.4.24.v20191120') { + group('org.eclipse.jetty') { + imports = [ + 'jetty-bom' + ] + } + } + library('JMustache', '1.15') { + group('com.samskivert') { + modules = [ + 'jmustache' + ] + } + } + library('JNA', '4.5.2') { + group('net.java.dev.jna') { + modules = [ + 'jna', + 'jna-platform' + ] + } + } + library('Joda Time', '2.10.5') { + group('joda-time') { + modules = [ + 'joda-time' + ] + } + } + library('Johnzon', '1.2.2') { + group('org.apache.johnzon') { + modules = [ + 'johnzon-core', + 'johnzon-jaxrs', + 'johnzon-jsonb', + 'johnzon-jsonb-extras', + 'johnzon-jsonschema', + 'johnzon-mapper', + 'johnzon-websocket' + ] + plugins = [ + 'johnzon-maven-plugin' + ] + } + } + library('Jolokia', '1.6.2') { + group('org.jolokia') { + modules = [ + 'jolokia-core' + ] + } + } + library('jOOQ', '3.12.3') { + group('org.jooq') { + modules = [ + 'jooq', + 'jooq-meta', + 'jooq-codegen' + ] + plugins = [ + 'jooq-codegen-maven' + ] + } + } + library('Json Path', '2.4.0') { + group('com.jayway.jsonpath') { + modules = [ + 'json-path', + 'json-path-assert' + ] + } + } + library('JsonAssert', '1.5.0') { + group('org.skyscreamer') { + modules = [ + 'jsonassert' + ] + } + } + library('JSTL', '1.2') { + group('javax.servlet') { + modules = [ + 'jstl' + ] + } + } + library('JTDS', '1.3.1') { + group('net.sourceforge.jtds') { + modules = [ + 'jtds' + ] + } + } + library('JUnit', '4.12') { + group('junit') { + modules = [ + 'junit' + ] + } + } + library('JUnit Jupiter', '5.5.2') { + group('org.junit') { + imports = [ + 'junit-bom' + ] + } + } + library('Kafka', '2.3.1') { + group('org.apache.kafka') { + modules = [ + 'connect-api', + 'connect-basic-auth-extension', + 'connect-file', + 'connect-json', + 'connect-runtime', + 'connect-transforms', + 'kafka-clients', + 'kafka-log4j-appender', + 'kafka-streams', + 'kafka-streams-scala_2.11', + 'kafka-streams-scala_2.12', + 'kafka-streams-test-utils', + 'kafka-tools', + 'kafka_2.11', + 'kafka_2.12' + ] + } + } + library('Kotlin', "$kotlinVersion") { + group('org.jetbrains.kotlin') { + imports = [ + 'kotlin-bom' + ] + plugins = [ + 'kotlin-maven-plugin' + ] + } + } + library('Kotlin Coroutines', '1.3.2') { + group('org.jetbrains.kotlinx') { + imports = [ + 'kotlinx-coroutines-bom' + ] + } + } + library('Lettuce', '5.2.1.RELEASE') { + group('io.lettuce') { + modules = [ + 'lettuce-core' + ] + } + } + library('Liquibase', '3.8.2') { + group('org.liquibase') { + modules = [ + 'liquibase-core' { + exclude group: 'ch.qos.logback', module: 'logback-classic' + } + ] + } + } + library('Log4j2', '2.12.1') { + group('org.apache.logging.log4j') { + modules = [ + 'log4j-to-slf4j' + ] + imports = [ + 'log4j-bom' + ] + } + } + library('Logback', '1.2.3') { + group('ch.qos.logback') { + modules = [ + 'logback-access', + 'logback-classic', + 'logback-core' + ] + } + } + library('Lombok', '1.18.10') { + group('org.projectlombok') { + modules = [ + 'lombok' + ] + } + } + library('MariaDB', '2.5.2') { + group('org.mariadb.jdbc') { + modules = [ + 'mariadb-java-client' + ] + } + } + library('Maven AntRun Plugin', '1.8') { + group('org.apache.maven.plugins') { + plugins = [ + 'maven-antrun-plugin' + ] + } + } + library('Maven Assembly Plugin', '3.2.0') { + group('org.apache.maven.plugins') { + plugins = [ + 'maven-assembly-plugin' + ] + } + } + library('Maven Clean Plugin', '3.1.0') { + group('org.apache.maven.plugins') { + plugins = [ + 'maven-clean-plugin' + ] + } + } + library('Maven Compiler Plugin', '3.8.1') { + group('org.apache.maven.plugins') { + plugins = [ + 'maven-compiler-plugin' + ] + } + } + library('Maven Dependency Plugin', '3.1.1') { + group('org.apache.maven.plugins') { + plugins = [ + 'maven-dependency-plugin' + ] + } + } + library('Maven Deploy Plugin', '2.8.2') { + group('org.apache.maven.plugins') { + plugins = [ + 'maven-deploy-plugin' + ] + } + } + library('Maven Enforcer Plugin', '3.0.0-M3') { + group('org.apache.maven.plugins') { + plugins = [ + 'maven-enforcer-plugin' + ] + } + } + library('Maven Failsafe Plugin', '2.22.2') { + group('org.apache.maven.plugins') { + plugins = [ + 'maven-failsafe-plugin' + ] + } + } + library('Maven Help Plugin', '3.2.0') { + group('org.apache.maven.plugins') { + plugins = [ + 'maven-help-plugin' + ] + } + } + library('Maven Install Plugin', '2.5.2') { + group('org.apache.maven.plugins') { + plugins = [ + 'maven-install-plugin' + ] + } + } + library('Maven Invoker Plugin', '3.2.1') { + group('org.apache.maven.plugins') { + plugins = [ + 'maven-invoker-plugin' + ] + } + } + library('Maven Jar Plugin', '3.2.0') { + group('org.apache.maven.plugins') { + plugins = [ + 'maven-jar-plugin' + ] + } + } + library('Maven Javadoc Plugin', '3.1.1') { + group('org.apache.maven.plugins') { + plugins = [ + 'maven-javadoc-plugin' + ] + } + } + library('Maven Resources Plugin', '3.1.0') { + group('org.apache.maven.plugins') { + plugins = [ + 'maven-resources-plugin' + ] + } + } + library('Maven Shade Plugin', '3.2.1') { + group('org.apache.maven.plugins') { + plugins = [ + 'maven-shade-plugin' + ] + } + } + library('Maven Source Plugin', '3.2.0') { + group('org.apache.maven.plugins') { + plugins = [ + 'maven-source-plugin' + ] + } + } + library('Maven Surefire Plugin', '2.22.2') { + group('org.apache.maven.plugins') { + plugins = [ + 'maven-surefire-plugin' + ] + } + } + library('Maven War Plugin', '3.2.3') { + group('org.apache.maven.plugins') { + plugins = [ + 'maven-war-plugin' + ] + } + } + library('Micrometer', '1.3.1') { + group('io.micrometer') { + modules = [ + 'micrometer-registry-stackdriver' { + exclude group: 'javax.annotation', module: 'javax.annotation-api' + } + ] + imports = [ + 'micrometer-bom' + ] + } + } + library('MIMEPull', '1.9.12') { + group('org.jvnet.mimepull') { + modules = [ + 'mimepull' + ] + } + } + library('Mockito', '3.2.0') { + group('org.mockito') { + modules = [ + 'mockito-core', + 'mockito-inline', + 'mockito-junit-jupiter' + ] + } + } + library('Mongo Driver ReactiveStreams', '1.12.0') { + group('org.mongodb') { + modules = [ + 'mongodb-driver-reactivestreams' + ] + } + } + library('MongoDB', '3.11.2') { + group('org.mongodb') { + modules = [ + 'bson', + 'mongodb-driver', + 'mongodb-driver-async', + 'mongodb-driver-core', + 'mongo-java-driver' + ] + } + } + library('MSSQL JDBC', '7.4.1.jre8') { + group('com.microsoft.sqlserver') { + modules = [ + 'mssql-jdbc' + ] + } + } + library('MySQL', '8.0.18') { + group('mysql') { + modules = [ + 'mysql-connector-java' { + exclude group: 'com.google.protobuf', module: 'protobuf-java' + } + ] + } + } + library('NekoHTML', '1.9.22') { + group('net.sourceforge.nekohtml') { + modules = [ + 'nekohtml' + ] + } + } + library('Neo4j OGM', '3.2.3') { + group('org.neo4j') { + modules = [ + 'neo4j-ogm-api', + 'neo4j-ogm-bolt-driver', + 'neo4j-ogm-bolt-native-types', + 'neo4j-ogm-core', + 'neo4j-ogm-embedded-driver', + 'neo4j-ogm-embedded-native-types', + 'neo4j-ogm-http-driver' + ] + } + } + library('Netty', '4.1.43.Final') { + group('io.netty') { + imports = [ + 'netty-bom' + ] + } + } + library('Netty tcNative', '2.0.28.Final') { + group('io.netty') { + modules = [ + 'netty-tcnative-boringssl-static' + ] + } + } + library('NIO Multipart Parser', '1.1.0') { + group('org.synchronoss.cloud') { + modules = [ + 'nio-multipart-parser' + ] + } + } + library('OJDBC', '19.3.0.0') { + group('com.oracle.ojdbc') { + modules = [ + 'dms', + 'ojdbc10', + 'ojdbc10_g', + 'ojdbc10dms', + 'ojdbc10dms_g', + 'ojdbc8', + 'ojdbc8_g', + 'ojdbc8dms', + 'ojdbc8dms_g', + 'ons', + 'oraclepki', + 'orai18n', + 'osdt_cert', + 'osdt_core', + 'simplefan', + 'ucp', + 'xdb', + 'xmlparserv2' + ] + } + } + library('OkHttp3', '3.14.4') { + group('com.squareup.okhttp3') { + modules = [ + 'logging-interceptor', + 'mockwebserver', + 'okcurl', + 'okhttp', + 'okhttp-dnsoverhttps', + 'okhttp-sse', + 'okhttp-testing-support', + 'okhttp-tls', + 'okhttp-urlconnection' + ] + } + } + library('Pooled JMS', '1.1.0') { + group('org.messaginghub') { + modules = [ + 'pooled-jms' + ] + } + } + library('Postgresql', '42.2.8') { + group('org.postgresql') { + modules = [ + 'postgresql' + ] + } + } + library('Prometheus PushGateway', '0.8.0') { + group('io.prometheus') { + modules = [ + 'simpleclient_pushgateway' + ] + } + } + library('Quartz', '2.3.2') { + group('org.quartz-scheduler') { + modules = [ + 'quartz' { + exclude group: 'com.mchange', module: 'c3p0' + exclude group: 'com.zaxxer', module: '*' + }, + 'quartz-jobs' + ] + } + } + library('QueryDSL', '4.2.2') { + group('com.querydsl') { + modules = [ + 'querydsl-apt', + 'querydsl-collections', + 'querydsl-core', + 'querydsl-jpa', + 'querydsl-mongodb' { + exclude group: 'org.mongodb', module: 'mongo-java-driver' + } + ] + } + } + library('Rabbit AMQP Client', '5.7.3') { + group('com.rabbitmq') { + modules = [ + 'amqp-client' + ] + } + } + library('Reactive Streams', '1.0.3') { + group('org.reactivestreams') { + modules = [ + 'reactive-streams' + ] + } + } + library('Reactor Bom', 'Dysprosium-SR2') { + group('io.projectreactor') { + imports = [ + 'reactor-bom' + ] + } + } + library('REST Assured', '3.3.0') { + group('io.rest-assured') { + modules = [ + 'json-path', + 'json-schema-validator', + 'rest-assured', + 'scala-support', + 'spring-mock-mvc', + 'spring-web-test-client', + 'xml-path' + ] + } + } + library('RSocket', '1.0.0-RC5') { + group('io.rsocket') { + imports = [ + 'rsocket-bom' + ] + } + } + library('RxJava', '1.3.8') { + group('io.reactivex') { + modules = [ + 'rxjava' + ] + } + } + library('RxJava Adapter', '1.2.1') { + group('io.reactivex') { + modules = [ + 'rxjava-reactive-streams' + ] + } + } + library('RxJava2', '2.2.15') { + group('io.reactivex.rxjava2') { + modules = [ + 'rxjava' + ] + } + } + library('Spring Boot', '2.3.0.GRADLE-SNAPSHOT') { + group('org.springframework.boot') { + modules = [ + 'spring-boot', + 'spring-boot-test', + 'spring-boot-test-autoconfigure', + 'spring-boot-actuator', + 'spring-boot-actuator-autoconfigure', + 'spring-boot-autoconfigure', + 'spring-boot-autoconfigure-processor', + 'spring-boot-configuration-metadata', + 'spring-boot-configuration-processor', + 'spring-boot-devtools', + 'spring-boot-loader', + 'spring-boot-loader-tools', + 'spring-boot-properties-migrator', + 'spring-boot-starter', + 'spring-boot-starter-activemq', + 'spring-boot-starter-actuator', + 'spring-boot-starter-amqp', + 'spring-boot-starter-aop', + 'spring-boot-starter-artemis', + 'spring-boot-starter-batch', + 'spring-boot-starter-cache', + 'spring-boot-starter-cloud-connectors', + 'spring-boot-starter-data-cassandra', + 'spring-boot-starter-data-cassandra-reactive', + 'spring-boot-starter-data-couchbase', + 'spring-boot-starter-data-couchbase-reactive', + 'spring-boot-starter-data-elasticsearch', + 'spring-boot-starter-data-jdbc', + 'spring-boot-starter-data-jpa', + 'spring-boot-starter-data-ldap', + 'spring-boot-starter-data-mongodb', + 'spring-boot-starter-data-mongodb-reactive', + 'spring-boot-starter-data-redis', + 'spring-boot-starter-data-redis-reactive', + 'spring-boot-starter-data-neo4j', + 'spring-boot-starter-data-rest', + 'spring-boot-starter-data-solr', + 'spring-boot-starter-freemarker', + 'spring-boot-starter-groovy-templates', + 'spring-boot-starter-hateoas', + 'spring-boot-starter-integration', + 'spring-boot-starter-jdbc', + 'spring-boot-starter-jersey', + 'spring-boot-starter-jetty', + 'spring-boot-starter-jooq', + 'spring-boot-starter-json', + 'spring-boot-starter-jta-atomikos', + 'spring-boot-starter-jta-bitronix', + 'spring-boot-starter-log4j2', + 'spring-boot-starter-logging', + 'spring-boot-starter-mail', + 'spring-boot-starter-mustache', + 'spring-boot-starter-oauth2-client', + 'spring-boot-starter-oauth2-resource-server', + 'spring-boot-starter-quartz', + 'spring-boot-starter-reactor-netty', + 'spring-boot-starter-rsocket', + 'spring-boot-starter-security', + 'spring-boot-starter-test', + 'spring-boot-starter-thymeleaf', + 'spring-boot-starter-tomcat', + 'spring-boot-starter-undertow', + 'spring-boot-starter-validation', + 'spring-boot-starter-web', + 'spring-boot-starter-webflux', + 'spring-boot-starter-websocket', + 'spring-boot-starter-web-services' + ] + plugins = [ + 'spring-boot-maven-plugin' + ] + } + } + library('SAAJ Impl', '1.5.1') { + group('com.sun.xml.messaging.saaj') { + modules = [ + 'saaj-impl' + ] + } + } + library('Selenium', '3.141.59') { + group('org.seleniumhq.selenium') { + modules = [ + 'selenium-api', + 'selenium-chrome-driver', + 'selenium-edge-driver', + 'selenium-firefox-driver', + 'selenium-ie-driver', + 'selenium-java', + 'selenium-opera-driver', + 'selenium-remote-driver' { + exclude group: 'commons-logging', module: 'commons-logging' + }, + 'selenium-safari-driver', + 'selenium-support' { + exclude group: 'commons-logging', module: 'commons-logging' + } + ] + } + } + library('Selenium HtmlUnit', '2.36.0') { + group('org.seleniumhq.selenium') { + modules = [ + 'htmlunit-driver' + ] + } + } + library('SendGrid', '4.4.1') { + group('com.sendgrid') { + modules = [ + 'sendgrid-java' + ] + } + } + library('Servlet API', '4.0.1') { + group('javax.servlet') { + modules = [ + 'javax.servlet-api' + ] + } + } + library('SLF4J', '1.7.29') { + group('org.slf4j') { + modules = [ + 'jcl-over-slf4j', + 'jul-to-slf4j', + 'log4j-over-slf4j', + 'slf4j-api', + 'slf4j-ext', + 'slf4j-jcl', + 'slf4j-jdk14', + 'slf4j-log4j12', + 'slf4j-nop', + 'slf4j-simple' + ] + } + } + library('SnakeYAML', '1.25') { + group('org.yaml') { + modules = [ + 'snakeyaml' + ] + } + } + library('Solr', '8.2.0') { + group('org.apache.solr') { + modules = [ + 'solr-analysis-extras', + 'solr-analytics', + 'solr-cell', + 'solr-clustering', + 'solr-core', + 'solr-dataimporthandler', + 'solr-dataimporthandler-extras', + 'solr-langid', + 'solr-ltr', + 'solr-solrj' { + exclude group: 'org.slf4j', module: 'jcl-over-slf4j' + }, + 'solr-test-framework', + 'solr-velocity' + ] + } + } + library('Spring AMQP', '2.2.2.RELEASE') { + group('org.springframework.amqp') { + modules = [ + 'spring-amqp', + 'spring-rabbit', + 'spring-rabbit-junit', + 'spring-rabbit-test' + ] + } + } + library('Spring Batch', '4.2.1.RELEASE') { + group('org.springframework.batch') { + modules = [ + 'spring-batch-core', + 'spring-batch-infrastructure', + 'spring-batch-integration', + 'spring-batch-test' + ] + } + } + library('Spring Cloud Connectors', '2.0.7.RELEASE') { + group('org.springframework.cloud') { + modules = [ + 'spring-cloud-cloudfoundry-connector', + 'spring-cloud-connectors-core', + 'spring-cloud-heroku-connector', + 'spring-cloud-localconfig-connector', + 'spring-cloud-spring-service-connector' + ] + } + } + library('Spring Data Releasetrain', 'Moore-SR3') { + group('org.springframework.data') { + imports = [ + 'spring-data-releasetrain' + ] + } + } + library('Spring Framework', '5.2.3.BUILD-SNAPSHOT') { + group('org.springframework') { + imports = [ + 'spring-framework-bom' + ] + } + } + library('Spring HATEOAS', '1.0.2.RELEASE') { + group('org.springframework.hateoas') { + modules = [ + 'spring-hateoas' + ] + } + } + library('Spring Integration', '5.2.2.RELEASE') { + group('org.springframework.integration') { + modules = [ + 'spring-integration-http' { + exclude group: 'commons-logging', module: 'commons-logging' + exclude group: 'commons-logging', module: 'commons-logging-api' + } + ] + imports = [ + 'spring-integration-bom' + ] + } + } + library('Spring Kafka', '2.3.4.RELEASE') { + group('org.springframework.kafka') { + modules = [ + 'spring-kafka', + 'spring-kafka-test' + ] + } + } + library('Spring LDAP', '2.3.2.RELEASE') { + group('org.springframework.ldap') { + modules = [ + 'spring-ldap-core', + 'spring-ldap-core-tiger', + 'spring-ldap-ldif-batch', + 'spring-ldap-ldif-core', + 'spring-ldap-odm', + 'spring-ldap-test' + ] + } + } + library('Spring RESTDocs', '2.0.4.RELEASE') { + group('org.springframework.restdocs') { + modules = [ + 'spring-restdocs-asciidoctor', + 'spring-restdocs-core', + 'spring-restdocs-mockmvc', + 'spring-restdocs-restassured', + 'spring-restdocs-webtestclient' + ] + } + } + library('Spring Retry', '1.2.4.RELEASE') { + group('org.springframework.retry') { + modules = [ + 'spring-retry' + ] + } + } + library('Spring Security', '5.2.1.RELEASE') { + group('org.springframework.security') { + imports = [ + 'spring-security-bom' + ] + } + } + library('Spring Session Bom', 'Corn-RELEASE') { + group('org.springframework.session') { + imports = [ + 'spring-session-bom' + ] + } + } + library('Spring WS', '3.0.8.RELEASE') { + group('org.springframework.ws') { + modules = [ + 'spring-ws-core' { + exclude group: 'commons-logging', module: 'commons-logging' + }, + 'spring-ws-security' { + exclude group: 'commons-logging', module: 'commons-logging' + }, + 'spring-ws-support' { + exclude group: 'commons-logging', module: 'commons-logging' + }, + 'spring-ws-test' { + exclude group: 'commons-logging', module: 'commons-logging' + }, + 'spring-xml' + ] + } + } + library('SQLite JDBC', '3.28.0') { + group('org.xerial') { + modules = [ + 'sqlite-jdbc' + ] + } + } + library('Sun Mail', '1.6.4') { + group('com.sun.mail') { + modules = [ + 'jakarta.mail' + ] + } + } + library('Thymeleaf', '3.0.11.RELEASE') { + group('org.thymeleaf') { + modules = [ + 'thymeleaf', + 'thymeleaf-spring5' + ] + } + } + library('Thymeleaf Extras Data Attribute', '2.0.1') { + group('com.github.mxab.thymeleaf.extras') { + modules = [ + 'thymeleaf-extras-data-attribute' + ] + } + } + library('Thymeleaf Extras Java8Time', '3.0.4.RELEASE') { + group('org.thymeleaf.extras') { + modules = [ + 'thymeleaf-extras-java8time' + ] + } + } + library('Thymeleaf Extras SpringSecurity', '3.0.4.RELEASE') { + group('org.thymeleaf.extras') { + modules = [ + 'thymeleaf-extras-springsecurity5' + ] + } + } + library('Thymeleaf Layout Dialect', '2.4.1') { + group('nz.net.ultraq.thymeleaf') { + modules = [ + 'thymeleaf-layout-dialect' + ] + } + } + library('Tomcat', '9.0.30') { + group('org.apache.tomcat') { + modules = [ + 'tomcat-annotations-api', + 'tomcat-jdbc', + 'tomcat-jsp-api' + ] + } + group('org.apache.tomcat.embed') { + modules = [ + 'tomcat-embed-core', + 'tomcat-embed-el', + 'tomcat-embed-jasper', + 'tomcat-embed-websocket' + ] + } + } + library('UnboundID LDAPSDK', '4.0.13') { + group('com.unboundid') { + modules = [ + 'unboundid-ldapsdk' + ] + } + } + library('Undertow', '2.0.28.Final') { + group('io.undertow') { + modules = [ + 'undertow-core', + 'undertow-servlet', + 'undertow-websockets-jsr' + ] + } + } + library('Versions Maven Plugin', '2.7') { + group('org.codehaus.mojo') { + plugins = [ + 'versions-maven-plugin' + ] + } + } + library('WebJars HAL Browser', '3325375') { + group('org.webjars') { + modules = [ + 'hal-browser' + ] + } + } + library('WebJars Locator Core', '0.43') { + group('org.webjars') { + modules = [ + 'webjars-locator-core' + ] + } + } + library('WSDL4j', '1.6.3') { + group('wsdl4j') { + modules = [ + 'wsdl4j' + ] + } + } + library('XML Maven Plugin', '1.0.2') { + group('org.codehaus.mojo') { + plugins = [ + 'xml-maven-plugin' + ] + } + } + library('XmlUnit2', '2.6.3') { + group('org.xmlunit') { + modules = [ + 'xmlunit-assertj', + 'xmlunit-core', + 'xmlunit-legacy', + 'xmlunit-matchers', + 'xmlunit-placeholders' + ] + } + } +} diff --git a/spring-boot-project/spring-boot-dependencies/pom.xml b/spring-boot-project/spring-boot-dependencies/pom.xml deleted file mode 100644 index ce2763d9eb..0000000000 --- a/spring-boot-project/spring-boot-dependencies/pom.xml +++ /dev/null @@ -1,3531 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-build - ${revision} - ../.. - - spring-boot-dependencies - pom - Spring Boot Dependencies - Spring Boot Dependencies - https://projects.spring.io/spring-boot/# - - - Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0 - - - - https://github.com/spring-projects/spring-boot - - - - Pivotal - info@pivotal.io - Pivotal Software, Inc. - https://www.spring.io - - - - ${basedir}/../.. - - 5.15.11 - 2.7.7 - 1.9.77 - 2.10.1 - 1.9.5 - 3.14.0 - 4.0.6 - 4.0.1 - 2.1.4 - 1.10.4 - 2.8.0 - 3.7.2 - 1.5.1 - 1.13 - 2.7.0 - 3.9 - 1.6 - 2.7.0 - 2.7.11 - 2.1.0 - 1.0.8.RELEASE - 11.5.0.0 - 10.14.2.0 - 4.1.1 - 2.10.6 - 3.8.1 - 2.2.0 - 6.1.3 - 2.3.29 - 6.8.5 - 3.0.3 - 2.3.2 - 2.5.8 - 2.8.6 - 1.4.200 - 2.2 - 3.12.4 - 1.3.2 - 5.4.9.Final - 6.1.0.Final - 3.4.1 - 2.5.0 - 2.36.0 - 4.1.4 - 4.5.10 - 4.4.12 - 9.4.16.Final - 2.16 - - 2.10.1 - ${jackson.version} - 1.2.1 - 1.3.5 - 2.0.3 - 1.1.6 - 1.0.2 - 1.6.4 - 2.2.3 - 4.0.3 - 2.3.5 - 1.2.7 - 1.3.3 - 2.0.1 - 1.1.2 - 2.1.6 - 2.3.2 - 2.3.2 - 3.1.0 - 1.2.0 - 1.3.2 - 1.1.1 - 2.3.1 - 2.3.1 - 2.0.1 - 1.1.4 - 1.0 - 1.6.2 - 1.0.3 - 2.2 - 1.3 - 2.0.1.Final - 1.1 - 1.2.0 - 3.0.8 - 3.4.1.Final - 7.6.0.Final - 2.0.6 - 3.1.0 - 2.29.1 - 6.3.1 - 9.4.24.v20191120 - 2.2.0.v201112011158 - 8.5.49 - 1.1.0 - 1.15 - 4.5.2 - 2.10.5 - 1.6.2 - - 1.2.2 - ${johnzon-jsonb.version} - 3.12.3 - 1.5.0 - 2.4.0 - 1.2 - 1.3.1 - 4.12 - 5.5.2 - 2.3.1 - 1.3.61 - 1.3.2 - 5.2.1.RELEASE - 3.8.2 - 2.12.1 - 1.2.3 - 1.18.10 - 2.5.2 - 1.3.1 - 1.9.12 - 3.2.0 - 1.12.0 - 3.11.2 - 7.4.1.jre8 - 8.0.18 - 1.9.22 - 3.2.3 - 4.1.43.Final - 2.0.28.Final - 1.1.0 - 19.3.0.0 - 3.14.4 - 1.1.0 - 42.2.8 - 0.8.0 - 2.3.2 - 4.2.2 - 5.7.3 - Dysprosium-SR2 - 3.3.0 - 1.0.3 - 1.0.0-RC5 - 1.3.8 - 1.2.1 - 2.2.15 - 3.141.59 - 2.36.0 - 4.4.1 - 4.0.1 - 1.7.29 - 1.25 - 8.2.0 - 2.2.2.RELEASE - 4.2.1.RELEASE - 2.0.7.RELEASE - Moore-SR3 - 5.2.3.BUILD-SNAPSHOT - 1.0.2.RELEASE - 5.2.2.RELEASE - 2.3.4.RELEASE - 2.3.2.RELEASE - 2.0.4.RELEASE - 1.2.4.RELEASE - 5.2.1.RELEASE - Corn-RELEASE - 3.0.8.RELEASE - 3.28.0 - ${jakarta-mail.version} - 1.5.1 - 3.0.11.RELEASE - 3.0.4.RELEASE - 2.4.1 - 2.0.1 - 3.0.4.RELEASE - 9.0.30 - 4.0.13 - 2.0.28.Final - 3325375 - 0.43 - 1.6.3 - 2.6.3 - - 3.0.0 - 1.6.0 - 3.0.1 - 1.8 - 3.2.0 - 3.1.0 - 3.8.1 - 3.1.1 - 2.8.2 - 3.0.0-M3 - 2.22.2 - 2.5.2 - 3.2.1 - 3.2.0 - 3.2.0 - 3.1.1 - 3.1.0 - 3.2.1 - 3.2.0 - 2.22.2 - 3.0.0 - 3.2.3 - 2.7 - 1.0.2 - 1.1.0 - - - - - - org.springframework.boot - spring-boot - ${revision} - - - org.springframework.boot - spring-boot-test - ${revision} - - - org.springframework.boot - spring-boot-test-autoconfigure - ${revision} - - - org.springframework.boot - spring-boot-actuator - ${revision} - - - org.springframework.boot - spring-boot-actuator-autoconfigure - ${revision} - - - org.springframework.boot - spring-boot-autoconfigure - ${revision} - - - org.springframework.boot - spring-boot-autoconfigure-processor - ${revision} - - - org.springframework.boot - spring-boot-configuration-metadata - ${revision} - - - org.springframework.boot - spring-boot-configuration-processor - ${revision} - - - org.springframework.boot - spring-boot-devtools - ${revision} - - - org.springframework.boot - spring-boot-loader - ${revision} - - - org.springframework.boot - spring-boot-loader-tools - ${revision} - - - org.springframework.boot - spring-boot-properties-migrator - ${revision} - - - org.springframework.boot - spring-boot-starter - ${revision} - - - org.springframework.boot - spring-boot-starter-activemq - ${revision} - - - org.springframework.boot - spring-boot-starter-actuator - ${revision} - - - org.springframework.boot - spring-boot-starter-amqp - ${revision} - - - org.springframework.boot - spring-boot-starter-aop - ${revision} - - - org.springframework.boot - spring-boot-starter-artemis - ${revision} - - - org.springframework.boot - spring-boot-starter-batch - ${revision} - - - org.springframework.boot - spring-boot-starter-cache - ${revision} - - - org.springframework.boot - spring-boot-starter-cloud-connectors - ${revision} - - - org.springframework.boot - spring-boot-starter-data-cassandra - ${revision} - - - org.springframework.boot - spring-boot-starter-data-cassandra-reactive - ${revision} - - - org.springframework.boot - spring-boot-starter-data-couchbase - ${revision} - - - org.springframework.boot - spring-boot-starter-data-couchbase-reactive - ${revision} - - - org.springframework.boot - spring-boot-starter-data-elasticsearch - ${revision} - - - org.springframework.boot - spring-boot-starter-data-jdbc - ${revision} - - - org.springframework.boot - spring-boot-starter-data-jpa - ${revision} - - - org.springframework.boot - spring-boot-starter-data-ldap - ${revision} - - - org.springframework.boot - spring-boot-starter-data-mongodb - ${revision} - - - org.springframework.boot - spring-boot-starter-data-mongodb-reactive - ${revision} - - - org.springframework.boot - spring-boot-starter-data-redis - ${revision} - - - org.springframework.boot - spring-boot-starter-data-redis-reactive - ${revision} - - - org.springframework.boot - spring-boot-starter-data-neo4j - ${revision} - - - org.springframework.boot - spring-boot-starter-data-rest - ${revision} - - - org.springframework.boot - spring-boot-starter-data-solr - ${revision} - - - org.springframework.boot - spring-boot-starter-freemarker - ${revision} - - - org.springframework.boot - spring-boot-starter-groovy-templates - ${revision} - - - org.springframework.boot - spring-boot-starter-hateoas - ${revision} - - - org.springframework.boot - spring-boot-starter-integration - ${revision} - - - org.springframework.boot - spring-boot-starter-jdbc - ${revision} - - - org.springframework.boot - spring-boot-starter-jersey - ${revision} - - - org.springframework.boot - spring-boot-starter-jetty - ${revision} - - - org.springframework.boot - spring-boot-starter-jooq - ${revision} - - - org.springframework.boot - spring-boot-starter-json - ${revision} - - - org.springframework.boot - spring-boot-starter-jta-atomikos - ${revision} - - - org.springframework.boot - spring-boot-starter-jta-bitronix - ${revision} - - - org.springframework.boot - spring-boot-starter-log4j2 - ${revision} - - - org.springframework.boot - spring-boot-starter-logging - ${revision} - - - org.springframework.boot - spring-boot-starter-mail - ${revision} - - - org.springframework.boot - spring-boot-starter-mustache - ${revision} - - - org.springframework.boot - spring-boot-starter-oauth2-client - ${revision} - - - org.springframework.boot - spring-boot-starter-oauth2-resource-server - ${revision} - - - org.springframework.boot - spring-boot-starter-quartz - ${revision} - - - org.springframework.boot - spring-boot-starter-reactor-netty - ${revision} - - - org.springframework.boot - spring-boot-starter-rsocket - ${revision} - - - org.springframework.boot - spring-boot-starter-security - ${revision} - - - org.springframework.boot - spring-boot-starter-test - ${revision} - - - org.springframework.boot - spring-boot-starter-thymeleaf - ${revision} - - - org.springframework.boot - spring-boot-starter-tomcat - ${revision} - - - org.springframework.boot - spring-boot-starter-undertow - ${revision} - - - org.springframework.boot - spring-boot-starter-validation - ${revision} - - - org.springframework.boot - spring-boot-starter-web - ${revision} - - - org.springframework.boot - spring-boot-starter-webflux - ${revision} - - - org.springframework.boot - spring-boot-starter-websocket - ${revision} - - - org.springframework.boot - spring-boot-starter-web-services - ${revision} - - - - antlr - antlr - ${antlr2.version} - - - ch.qos.logback - logback-access - ${logback.version} - - - ch.qos.logback - logback-classic - ${logback.version} - - - ch.qos.logback - logback-core - ${logback.version} - - - com.atomikos - transactions-jdbc - ${atomikos.version} - - - com.atomikos - transactions-jms - ${atomikos.version} - - - com.atomikos - transactions-jta - ${atomikos.version} - - - com.couchbase.client - java-client - ${couchbase-client.version} - - - com.couchbase.client - couchbase-spring-cache - ${couchbase-cache-client.version} - - - com.datastax.cassandra - cassandra-driver-core - ${cassandra-driver.version} - - - com.datastax.cassandra - cassandra-driver-mapping - ${cassandra-driver.version} - - - com.fasterxml - classmate - ${classmate.version} - - - com.fasterxml.jackson - jackson-bom - ${jackson-bom.version} - import - pom - - - com.github.ben-manes.caffeine - caffeine - ${caffeine.version} - - - com.github.ben-manes.caffeine - guava - ${caffeine.version} - - - com.github.ben-manes.caffeine - jcache - ${caffeine.version} - - - com.github.ben-manes.caffeine - simulator - ${caffeine.version} - - - com.github.mxab.thymeleaf.extras - thymeleaf-extras-data-attribute - ${thymeleaf-extras-data-attribute.version} - - - com.google.appengine - appengine-api-1.0-sdk - ${appengine-sdk.version} - - - com.google.code.gson - gson - ${gson.version} - - - com.h2database - h2 - ${h2.version} - - - com.hazelcast - hazelcast - ${hazelcast.version} - - - com.hazelcast - hazelcast-client - ${hazelcast.version} - - - com.hazelcast - hazelcast-hibernate52 - ${hazelcast-hibernate5.version} - - - com.hazelcast - hazelcast-hibernate53 - ${hazelcast-hibernate5.version} - - - com.hazelcast - hazelcast-spring - ${hazelcast.version} - - - com.ibm.db2 - jcc - ${db2-jdbc.version} - - - com.jayway.jsonpath - json-path - ${json-path.version} - - - com.jayway.jsonpath - json-path-assert - ${json-path.version} - - - com.microsoft.sqlserver - mssql-jdbc - ${mssql-jdbc.version} - - - com.oracle.ojdbc - dms - ${ojdbc.version} - - - com.oracle.ojdbc - ojdbc10 - ${ojdbc.version} - - - com.oracle.ojdbc - ojdbc10_g - ${ojdbc.version} - - - com.oracle.ojdbc - ojdbc10dms - ${ojdbc.version} - - - com.oracle.ojdbc - ojdbc10dms_g - ${ojdbc.version} - - - com.oracle.ojdbc - ojdbc8 - ${ojdbc.version} - - - com.oracle.ojdbc - ojdbc8_g - ${ojdbc.version} - - - com.oracle.ojdbc - ojdbc8dms - ${ojdbc.version} - - - com.oracle.ojdbc - ojdbc8dms_g - ${ojdbc.version} - - - com.oracle.ojdbc - ons - ${ojdbc.version} - - - com.oracle.ojdbc - oraclepki - ${ojdbc.version} - - - com.oracle.ojdbc - orai18n - ${ojdbc.version} - - - com.oracle.ojdbc - osdt_cert - ${ojdbc.version} - - - com.oracle.ojdbc - osdt_core - ${ojdbc.version} - - - com.oracle.ojdbc - simplefan - ${ojdbc.version} - - - com.oracle.ojdbc - ucp - ${ojdbc.version} - - - com.oracle.ojdbc - xdb - ${ojdbc.version} - - - com.oracle.ojdbc - xmlparserv2 - ${ojdbc.version} - - - com.querydsl - querydsl-apt - ${querydsl.version} - - - com.querydsl - querydsl-collections - ${querydsl.version} - - - com.querydsl - querydsl-core - ${querydsl.version} - - - com.querydsl - querydsl-jpa - ${querydsl.version} - - - com.querydsl - querydsl-mongodb - ${querydsl.version} - - - org.mongodb - mongo-java-driver - - - - - com.rabbitmq - amqp-client - ${rabbit-amqp-client.version} - - - com.samskivert - jmustache - ${jmustache.version} - - - com.sendgrid - sendgrid-java - ${sendgrid.version} - - - com.squareup.okhttp3 - logging-interceptor - ${okhttp3.version} - - - com.squareup.okhttp3 - mockwebserver - ${okhttp3.version} - - - com.squareup.okhttp3 - okcurl - ${okhttp3.version} - - - com.squareup.okhttp3 - okhttp - ${okhttp3.version} - - - com.squareup.okhttp3 - okhttp-dnsoverhttps - ${okhttp3.version} - - - com.squareup.okhttp3 - okhttp-sse - ${okhttp3.version} - - - com.squareup.okhttp3 - okhttp-testing-support - ${okhttp3.version} - - - com.squareup.okhttp3 - okhttp-tls - ${okhttp3.version} - - - com.squareup.okhttp3 - okhttp-urlconnection - ${okhttp3.version} - - - com.sun.activation - jakarta.activation - ${jakarta-activation.version} - - - com.sun.mail - jakarta.mail - ${sun-mail.version} - - - com.sun.xml.messaging.saaj - saaj-impl - ${saaj-impl.version} - - - com.unboundid - unboundid-ldapsdk - ${unboundid-ldapsdk.version} - - - com.zaxxer - HikariCP - ${hikaricp.version} - - - commons-codec - commons-codec - ${commons-codec.version} - - - commons-pool - commons-pool - ${commons-pool.version} - - - de.flapdoodle.embed - de.flapdoodle.embed.mongo - ${embedded-mongo.version} - - - io.dropwizard.metrics - metrics-annotation - ${dropwizard-metrics.version} - - - io.dropwizard.metrics - metrics-core - ${dropwizard-metrics.version} - - - io.dropwizard.metrics - metrics-ehcache - ${dropwizard-metrics.version} - - - io.dropwizard.metrics - metrics-graphite - ${dropwizard-metrics.version} - - - io.dropwizard.metrics - metrics-healthchecks - ${dropwizard-metrics.version} - - - io.dropwizard.metrics - metrics-httpasyncclient - ${dropwizard-metrics.version} - - - io.dropwizard.metrics - metrics-jdbi - ${dropwizard-metrics.version} - - - io.dropwizard.metrics - metrics-jersey2 - ${dropwizard-metrics.version} - - - io.dropwizard.metrics - metrics-jetty9 - ${dropwizard-metrics.version} - - - io.dropwizard.metrics - metrics-jmx - ${dropwizard-metrics.version} - - - io.dropwizard.metrics - metrics-json - ${dropwizard-metrics.version} - - - io.dropwizard.metrics - metrics-jvm - ${dropwizard-metrics.version} - - - io.dropwizard.metrics - metrics-log4j2 - ${dropwizard-metrics.version} - - - io.dropwizard.metrics - metrics-logback - ${dropwizard-metrics.version} - - - io.dropwizard.metrics - metrics-servlet - ${dropwizard-metrics.version} - - - io.dropwizard.metrics - metrics-servlets - ${dropwizard-metrics.version} - - - io.lettuce - lettuce-core - ${lettuce.version} - - - io.micrometer - micrometer-registry-stackdriver - ${micrometer.version} - - - javax.annotation - javax.annotation-api - - - - - io.micrometer - micrometer-bom - ${micrometer.version} - pom - import - - - io.netty - netty-bom - ${netty.version} - import - pom - - - io.netty - netty-tcnative-boringssl-static - ${netty-tcnative.version} - - - io.projectreactor - reactor-bom - ${reactor-bom.version} - import - pom - - - io.prometheus - simpleclient_pushgateway - ${prometheus-pushgateway.version} - - - io.reactivex - rxjava - ${rxjava.version} - - - io.reactivex - rxjava-reactive-streams - ${rxjava-adapter.version} - - - io.reactivex.rxjava2 - rxjava - ${rxjava2.version} - - - io.rest-assured - json-path - ${rest-assured.version} - - - io.rest-assured - json-schema-validator - ${rest-assured.version} - - - io.rest-assured - rest-assured - ${rest-assured.version} - - - io.rest-assured - scala-support - ${rest-assured.version} - - - io.rest-assured - spring-mock-mvc - ${rest-assured.version} - - - io.rest-assured - spring-web-test-client - ${rest-assured.version} - - - io.rest-assured - xml-path - ${rest-assured.version} - - - io.rsocket - rsocket-bom - ${rsocket.version} - pom - import - - - io.searchbox - jest - ${jest.version} - - - io.spring.gradle - dependency-management-plugin - ${dependency-management-plugin.version} - - - io.undertow - undertow-core - ${undertow.version} - - - io.undertow - undertow-servlet - ${undertow.version} - - - io.undertow - undertow-websockets-jsr - ${undertow.version} - - - jakarta.activation - jakarta.activation-api - ${jakarta-activation.version} - - - jakarta.annotation - jakarta.annotation-api - ${jakarta-annotation.version} - - - jakarta.jms - jakarta.jms-api - ${jakarta-jms.version} - - - jakarta.json - jakarta.json-api - ${jakarta-json.version} - - - jakarta.json.bind - jakarta.json.bind-api - ${jakarta-json-bind.version} - - - jakarta.mail - jakarta.mail-api - ${jakarta-mail.version} - - - jakarta.persistence - jakarta.persistence-api - ${jakarta-persistence.version} - - - jakarta.servlet - jakarta.servlet-api - ${jakarta-servlet.version} - - - jakarta.servlet.jsp.jstl - jakarta.servlet.jsp.jstl-api - ${jakarta-servlet-jsp-jstl.version} - - - jakarta.transaction - jakarta.transaction-api - ${jakarta-transaction.version} - - - jakarta.validation - jakarta.validation-api - ${jakarta-validation.version} - - - jakarta.websocket - jakarta.websocket-api - ${jakarta-websocket.version} - - - jakarta.ws.rs - jakarta.ws.rs-api - ${jakarta-ws-rs.version} - - - jakarta.xml.bind - jakarta.xml.bind-api - ${jakarta-xml-bind.version} - - - jakarta.xml.ws - jakarta.xml.ws-api - ${jakarta-xml-ws.version} - - - javax.activation - javax.activation-api - ${javax-activation.version} - - - javax.annotation - javax.annotation-api - ${javax-annotation.version} - - - javax.cache - cache-api - ${javax-cache.version} - - - javax.jms - javax.jms-api - ${javax-jms.version} - - - javax.json - javax.json-api - ${javax-json.version} - - - javax.json.bind - javax.json.bind-api - ${javax-jsonb.version} - - - javax.mail - javax.mail-api - ${javax-mail.version} - - - javax.money - money-api - ${javax-money.version} - - - javax.persistence - javax.persistence-api - ${javax-persistence.version} - - - javax.servlet - javax.servlet-api - ${servlet-api.version} - - - javax.servlet - jstl - ${jstl.version} - - - javax.transaction - javax.transaction-api - ${javax-transaction.version} - - - javax.validation - validation-api - ${javax-validation.version} - - - javax.websocket - javax.websocket-api - ${javax-websocket.version} - - - javax.xml.bind - jaxb-api - ${javax-jaxb.version} - - - javax.xml.ws - jaxws-api - ${javax-jaxws.version} - - - jaxen - jaxen - ${jaxen.version} - - - joda-time - joda-time - ${joda-time.version} - - - junit - junit - ${junit.version} - - - mysql - mysql-connector-java - ${mysql.version} - - - com.google.protobuf - protobuf-java - - - - - net.bytebuddy - byte-buddy - ${byte-buddy.version} - - - net.bytebuddy - byte-buddy-agent - ${byte-buddy.version} - - - net.java.dev.jna - jna - ${jna.version} - - - net.java.dev.jna - jna-platform - ${jna.version} - - - net.sf.ehcache - ehcache - ${ehcache.version} - - - net.sourceforge.htmlunit - htmlunit - ${htmlunit.version} - - - commons-logging - commons-logging - - - - - net.sourceforge.jtds - jtds - ${jtds.version} - - - net.sourceforge.nekohtml - nekohtml - ${nekohtml.version} - - - nz.net.ultraq.thymeleaf - thymeleaf-layout-dialect - ${thymeleaf-layout-dialect.version} - - - org.apache.activemq - activemq-amqp - ${activemq.version} - - - org.apache.activemq - activemq-blueprint - ${activemq.version} - - - org.apache.activemq - activemq-broker - ${activemq.version} - - - org.apache.activemq - activemq-camel - ${activemq.version} - - - org.apache.activemq - activemq-client - ${activemq.version} - - - org.apache.activemq - activemq-console - ${activemq.version} - - - commons-logging - commons-logging - - - - - org.apache.activemq - activemq-http - ${activemq.version} - - - org.apache.activemq - activemq-jaas - ${activemq.version} - - - org.apache.activemq - activemq-jdbc-store - ${activemq.version} - - - org.apache.activemq - activemq-jms-pool - ${activemq.version} - - - org.apache.activemq - activemq-kahadb-store - ${activemq.version} - - - org.apache.activemq - activemq-karaf - ${activemq.version} - - - org.apache.activemq - activemq-leveldb-store - ${activemq.version} - - - commons-logging - commons-logging - - - - - org.apache.activemq - activemq-log4j-appender - ${activemq.version} - - - org.apache.activemq - activemq-mqtt - ${activemq.version} - - - org.apache.activemq - activemq-openwire-generator - ${activemq.version} - - - org.apache.activemq - activemq-openwire-legacy - ${activemq.version} - - - org.apache.activemq - activemq-osgi - ${activemq.version} - - - org.apache.activemq - activemq-partition - ${activemq.version} - - - org.apache.activemq - activemq-pool - ${activemq.version} - - - org.apache.activemq - activemq-ra - ${activemq.version} - - - org.apache.activemq - activemq-run - ${activemq.version} - - - org.apache.activemq - activemq-runtime-config - ${activemq.version} - - - org.apache.activemq - activemq-shiro - ${activemq.version} - - - org.apache.activemq - activemq-spring - ${activemq.version} - - - commons-logging - commons-logging - - - - - org.apache.activemq - activemq-stomp - ${activemq.version} - - - org.apache.activemq - activemq-web - ${activemq.version} - - - org.apache.activemq - artemis-amqp-protocol - ${artemis.version} - - - org.apache.activemq - artemis-commons - ${artemis.version} - - - commons-logging - commons-logging - - - - - org.apache.activemq - artemis-core-client - ${artemis.version} - - - org.apache.geronimo.specs - geronimo-json_1.0_spec - - - - - org.apache.activemq - artemis-jms-client - ${artemis.version} - - - org.apache.geronimo.specs - geronimo-json_1.0_spec - - - - - org.apache.activemq - artemis-jms-server - ${artemis.version} - - - org.apache.geronimo.specs - geronimo-json_1.0_spec - - - - - org.apache.activemq - artemis-journal - ${artemis.version} - - - org.apache.activemq - artemis-selector - ${artemis.version} - - - org.apache.activemq - artemis-server - ${artemis.version} - - - commons-logging - commons-logging - - - org.apache.geronimo.specs - geronimo-json_1.0_spec - - - - - org.apache.activemq - artemis-service-extensions - ${artemis.version} - - - org.apache.commons - commons-dbcp2 - ${commons-dbcp2.version} - - - commons-logging - commons-logging - - - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - org.apache.commons - commons-pool2 - ${commons-pool2.version} - - - org.apache.derby - derby - ${derby.version} - - - org.apache.httpcomponents - httpasyncclient - ${httpasyncclient.version} - - - commons-logging - commons-logging - - - - - org.apache.httpcomponents - fluent-hc - ${httpclient.version} - - - org.apache.httpcomponents - httpclient - ${httpclient.version} - - - commons-logging - commons-logging - - - - - org.apache.httpcomponents - httpclient-cache - ${httpclient.version} - - - org.apache.httpcomponents - httpclient-osgi - ${httpclient.version} - - - org.apache.httpcomponents - httpclient-win - ${httpclient.version} - - - org.apache.httpcomponents - httpcore - ${httpcore.version} - - - org.apache.httpcomponents - httpcore-nio - ${httpcore.version} - - - org.apache.httpcomponents - httpmime - ${httpclient.version} - - - org.apache.johnzon - johnzon-core - ${johnzon.version} - - - org.apache.johnzon - johnzon-jaxrs - ${johnzon.version} - - - org.apache.johnzon - johnzon-jsonb - ${johnzon.version} - - - org.apache.johnzon - johnzon-jsonb-extras - ${johnzon.version} - - - org.apache.johnzon - johnzon-jsonschema - ${johnzon.version} - - - org.apache.johnzon - johnzon-mapper - ${johnzon.version} - - - org.apache.johnzon - johnzon-websocket - ${johnzon.version} - - - org.apache.kafka - connect-api - ${kafka.version} - - - org.apache.kafka - connect-basic-auth-extension - ${kafka.version} - - - org.apache.kafka - connect-file - ${kafka.version} - - - org.apache.kafka - connect-json - ${kafka.version} - - - org.apache.kafka - connect-runtime - ${kafka.version} - - - org.apache.kafka - connect-transforms - ${kafka.version} - - - org.apache.kafka - kafka-clients - ${kafka.version} - - - org.apache.kafka - kafka-log4j-appender - ${kafka.version} - - - org.apache.kafka - kafka-streams - ${kafka.version} - - - org.apache.kafka - kafka-streams-scala_2.11 - ${kafka.version} - - - org.apache.kafka - kafka-streams-scala_2.12 - ${kafka.version} - - - org.apache.kafka - kafka-streams-test-utils - ${kafka.version} - - - org.apache.kafka - kafka-tools - ${kafka.version} - - - org.apache.kafka - kafka_2.11 - ${kafka.version} - - - org.apache.kafka - kafka_2.12 - ${kafka.version} - - - org.apache.logging.log4j - log4j-bom - ${log4j2.version} - pom - import - - - org.apache.logging.log4j - log4j-to-slf4j - ${log4j2.version} - - - org.apache.solr - solr-analysis-extras - ${solr.version} - - - org.apache.solr - solr-analytics - ${solr.version} - - - org.apache.solr - solr-cell - ${solr.version} - - - org.apache.solr - solr-clustering - ${solr.version} - - - org.apache.solr - solr-core - ${solr.version} - - - org.apache.solr - solr-dataimporthandler - ${solr.version} - - - org.apache.solr - solr-dataimporthandler-extras - ${solr.version} - - - org.apache.solr - solr-langid - ${solr.version} - - - org.apache.solr - solr-ltr - ${solr.version} - - - org.apache.solr - solr-solrj - ${solr.version} - - - org.slf4j - jcl-over-slf4j - - - - - org.apache.solr - solr-test-framework - ${solr.version} - - - org.apache.solr - solr-velocity - ${solr.version} - - - org.apache.tomcat - tomcat-annotations-api - ${tomcat.version} - - - org.apache.tomcat - tomcat-jdbc - ${tomcat.version} - - - org.apache.tomcat - tomcat-jsp-api - ${tomcat.version} - - - org.apache.tomcat.embed - tomcat-embed-core - ${tomcat.version} - - - org.apache.tomcat.embed - tomcat-embed-el - ${tomcat.version} - - - org.apache.tomcat.embed - tomcat-embed-jasper - ${tomcat.version} - - - org.apache.tomcat.embed - tomcat-embed-websocket - ${tomcat.version} - - - org.aspectj - aspectjrt - ${aspectj.version} - - - org.aspectj - aspectjtools - ${aspectj.version} - - - org.aspectj - aspectjweaver - ${aspectj.version} - - - org.assertj - assertj-core - ${assertj.version} - - - org.awaitility - awaitility - ${awaitility.version} - - - org.awaitility - awaitility-groovy - ${awaitility.version} - - - org.awaitility - awaitility-kotlin - ${awaitility.version} - - - org.awaitility - awaitility-scala - ${awaitility.version} - - - org.codehaus.btm - btm - ${bitronix.version} - - - org.codehaus.groovy - groovy - ${groovy.version} - - - org.codehaus.groovy - groovy-ant - ${groovy.version} - - - org.codehaus.groovy - groovy-backports-compat23 - ${groovy.version} - - - org.codehaus.groovy - groovy-bsf - ${groovy.version} - - - org.codehaus.groovy - groovy-cli-commons - ${groovy.version} - - - org.codehaus.groovy - groovy-cli-picocli - ${groovy.version} - - - org.codehaus.groovy - groovy-console - ${groovy.version} - - - org.codehaus.groovy - groovy-datetime - ${groovy.version} - - - org.codehaus.groovy - groovy-dateutil - ${groovy.version} - - - org.codehaus.groovy - groovy-docgenerator - ${groovy.version} - - - org.codehaus.groovy - groovy-groovydoc - ${groovy.version} - - - org.codehaus.groovy - groovy-groovysh - ${groovy.version} - - - org.codehaus.groovy - groovy-jaxb - ${groovy.version} - - - org.codehaus.groovy - groovy-jmx - ${groovy.version} - - - org.codehaus.groovy - groovy-json - ${groovy.version} - - - org.codehaus.groovy - groovy-json-direct - ${groovy.version} - - - org.codehaus.groovy - groovy-jsr223 - ${groovy.version} - - - org.codehaus.groovy - groovy-macro - ${groovy.version} - - - org.codehaus.groovy - groovy-nio - ${groovy.version} - - - org.codehaus.groovy - groovy-servlet - ${groovy.version} - - - org.codehaus.groovy - groovy-sql - ${groovy.version} - - - org.codehaus.groovy - groovy-swing - ${groovy.version} - - - org.codehaus.groovy - groovy-templates - ${groovy.version} - - - org.codehaus.groovy - groovy-test - ${groovy.version} - - - org.codehaus.groovy - groovy-test-junit5 - ${groovy.version} - - - org.codehaus.groovy - groovy-testng - ${groovy.version} - - - org.codehaus.groovy - groovy-xml - ${groovy.version} - - - org.codehaus.janino - commons-compiler - ${janino.version} - - - org.codehaus.janino - commons-compiler-jdk - ${janino.version} - - - org.codehaus.janino - janino - ${janino.version} - - - org.eclipse.jetty - jetty-bom - ${jetty.version} - import - pom - - - org.eclipse.jetty - jetty-reactive-httpclient - ${jetty-reactive-httpclient.version} - - - org.eclipse.jetty.orbit - javax.servlet.jsp - ${jetty-jsp.version} - - - org.ehcache - ehcache - ${ehcache3.version} - - - org.ehcache - ehcache-clustered - ${ehcache3.version} - - - org.ehcache - ehcache-transactions - ${ehcache3.version} - - - org.elasticsearch - elasticsearch - ${elasticsearch.version} - - - org.elasticsearch.client - transport - ${elasticsearch.version} - - - org.elasticsearch.distribution.integ-test-zip - elasticsearch - ${elasticsearch.version} - zip - - - org.elasticsearch.plugin - transport-netty4-client - ${elasticsearch.version} - - - org.elasticsearch.client - elasticsearch-rest-client - ${elasticsearch.version} - - - commons-logging - commons-logging - - - - - org.elasticsearch.client - elasticsearch-rest-high-level-client - ${elasticsearch.version} - - - org.firebirdsql.jdbc - jaybird-jdk17 - ${jaybird.version} - - - org.firebirdsql.jdbc - jaybird-jdk18 - ${jaybird.version} - - - org.flywaydb - flyway-core - ${flyway.version} - - - org.freemarker - freemarker - ${freemarker.version} - - - org.glassfish - jakarta.el - ${glassfish-el.version} - - - org.glassfish.jaxb - codemodel - ${glassfish-jaxb.version} - - - org.glassfish.jaxb - codemodel-annotation-compiler - ${glassfish-jaxb.version} - - - org.glassfish.jaxb - jaxb-jxc - ${glassfish-jaxb.version} - - - org.glassfish.jaxb - jaxb-runtime - ${glassfish-jaxb.version} - - - org.glassfish.jaxb - jaxb-xjc - ${glassfish-jaxb.version} - - - org.glassfish.jaxb - txw2 - ${glassfish-jaxb.version} - - - org.glassfish.jaxb - txwc2 - ${glassfish-jaxb.version} - - - org.glassfish.jaxb - xsom - ${glassfish-jaxb.version} - - - org.glassfish.jersey - jersey-bom - ${jersey.version} - import - pom - - - org.hamcrest - hamcrest - ${hamcrest.version} - - - org.hamcrest - hamcrest-core - ${hamcrest.version} - - - org.hamcrest - hamcrest-library - ${hamcrest.version} - - - org.hibernate - hibernate-c3p0 - ${hibernate.version} - - - org.hibernate - hibernate-core - ${hibernate.version} - - - org.hibernate - hibernate-ehcache - ${hibernate.version} - - - org.hibernate - hibernate-entitymanager - ${hibernate.version} - - - org.hibernate - hibernate-envers - ${hibernate.version} - - - org.hibernate - hibernate-hikaricp - ${hibernate.version} - - - org.hibernate - hibernate-java8 - ${hibernate.version} - - - org.hibernate - hibernate-jcache - ${hibernate.version} - - - org.hibernate - hibernate-jpamodelgen - ${hibernate.version} - - - org.hibernate - hibernate-proxool - ${hibernate.version} - - - org.hibernate - hibernate-spatial - ${hibernate.version} - - - org.hibernate - hibernate-testing - ${hibernate.version} - - - org.hibernate - hibernate-vibur - ${hibernate.version} - - - org.hibernate.validator - hibernate-validator - ${hibernate-validator.version} - - - org.hibernate.validator - hibernate-validator-annotation-processor - ${hibernate-validator.version} - - - org.hsqldb - hsqldb - ${hsqldb.version} - - - org.infinispan - infinispan-cachestore-jdbc - ${infinispan.version} - - - org.infinispan - infinispan-cachestore-jpa - ${infinispan.version} - - - org.infinispan - infinispan-cachestore-leveldb - ${infinispan.version} - - - org.infinispan - infinispan-cachestore-remote - ${infinispan.version} - - - org.infinispan - infinispan-cachestore-rest - ${infinispan.version} - - - org.infinispan - infinispan-cachestore-rocksdb - ${infinispan.version} - - - org.infinispan - infinispan-cdi-common - ${infinispan.version} - - - org.infinispan - infinispan-cdi-embedded - ${infinispan.version} - - - org.infinispan - infinispan-cdi-remote - ${infinispan.version} - - - org.infinispan - infinispan-client-hotrod - ${infinispan.version} - - - org.infinispan - infinispan-cloud - ${infinispan.version} - - - org.infinispan - infinispan-clustered-counter - ${infinispan.version} - - - org.infinispan - infinispan-clustered-lock - ${infinispan.version} - - - org.infinispan - infinispan-commons - ${infinispan.version} - - - org.infinispan - infinispan-core - ${infinispan.version} - - - org.infinispan - infinispan-directory-provider - ${infinispan.version} - - - org.infinispan - infinispan-hibernate-cache-v53 - ${infinispan.version} - - - org.infinispan - infinispan-jcache - ${infinispan.version} - - - org.infinispan - infinispan-jcache-commons - ${infinispan.version} - - - org.infinispan - infinispan-jcache-remote - ${infinispan.version} - - - org.infinispan - infinispan-lucene-directory - ${infinispan.version} - - - org.infinispan - infinispan-objectfilter - ${infinispan.version} - - - org.infinispan - infinispan-osgi - ${infinispan.version} - - - org.infinispan - infinispan-persistence-cli - ${infinispan.version} - - - org.infinispan - infinispan-persistence-soft-index - ${infinispan.version} - - - org.infinispan - infinispan-query - ${infinispan.version} - - - org.infinispan - infinispan-query-dsl - ${infinispan.version} - - - org.infinispan - infinispan-remote-query-client - ${infinispan.version} - - - org.infinispan - infinispan-remote-query-server - ${infinispan.version} - - - org.infinispan - infinispan-scripting - ${infinispan.version} - - - org.infinispan - infinispan-server-core - ${infinispan.version} - - - org.infinispan - infinispan-server-hotrod - ${infinispan.version} - - - org.infinispan - infinispan-server-memcached - ${infinispan.version} - - - org.infinispan - infinispan-server-router - ${infinispan.version} - - - org.infinispan - infinispan-spring4-common - ${infinispan.version} - - - org.infinispan - infinispan-spring4-embedded - ${infinispan.version} - - - org.infinispan - infinispan-spring4-remote - ${infinispan.version} - - - org.infinispan - infinispan-spring5-common - ${infinispan.version} - - - org.infinispan - infinispan-spring5-embedded - ${infinispan.version} - - - org.infinispan - infinispan-spring5-remote - ${infinispan.version} - - - org.infinispan - infinispan-tasks - ${infinispan.version} - - - org.infinispan - infinispan-tasks-api - ${infinispan.version} - - - org.infinispan - infinispan-tools - ${infinispan.version} - - - org.infinispan - infinispan-tree - ${infinispan.version} - - - org.influxdb - influxdb-java - ${influxdb-java.version} - - - org.jboss - jboss-transaction-spi - ${jboss-transaction-spi.version} - - - org.jboss.logging - jboss-logging - ${jboss-logging.version} - - - org.jdom - jdom2 - ${jdom2.version} - - - org.jetbrains.kotlin - kotlin-bom - ${kotlin.version} - import - pom - - - org.jetbrains.kotlinx - kotlinx-coroutines-bom - ${kotlin-coroutines.version} - import - pom - - - org.jolokia - jolokia-core - ${jolokia.version} - - - org.jooq - jooq - ${jooq.version} - - - org.jooq - jooq-meta - ${jooq.version} - - - org.jooq - jooq-codegen - ${jooq.version} - - - org.junit - junit-bom - ${junit-jupiter.version} - import - pom - - - org.jvnet.mimepull - mimepull - ${mimepull.version} - - - org.liquibase - liquibase-core - ${liquibase.version} - - - ch.qos.logback - logback-classic - - - - - org.mariadb.jdbc - mariadb-java-client - ${mariadb.version} - - - org.messaginghub - pooled-jms - ${pooled-jms.version} - - - org.mockito - mockito-core - ${mockito.version} - - - org.mockito - mockito-inline - ${mockito.version} - - - org.mockito - mockito-junit-jupiter - ${mockito.version} - - - org.mongodb - bson - ${mongodb.version} - - - org.mongodb - mongodb-driver - ${mongodb.version} - - - org.mongodb - mongodb-driver-async - ${mongodb.version} - - - org.mongodb - mongodb-driver-core - ${mongodb.version} - - - org.mongodb - mongodb-driver-reactivestreams - ${mongo-driver-reactivestreams.version} - - - org.mongodb - mongo-java-driver - ${mongodb.version} - - - org.mortbay.jasper - apache-el - ${jetty-el.version} - - - org.neo4j - neo4j-ogm-api - ${neo4j-ogm.version} - - - org.neo4j - neo4j-ogm-bolt-driver - ${neo4j-ogm.version} - - - org.neo4j - neo4j-ogm-bolt-native-types - ${neo4j-ogm.version} - - - org.neo4j - neo4j-ogm-core - ${neo4j-ogm.version} - - - org.neo4j - neo4j-ogm-embedded-driver - ${neo4j-ogm.version} - - - org.neo4j - neo4j-ogm-embedded-native-types - ${neo4j-ogm.version} - - - org.neo4j - neo4j-ogm-http-driver - ${neo4j-ogm.version} - - - org.postgresql - postgresql - ${postgresql.version} - - - org.projectlombok - lombok - ${lombok.version} - - - org.quartz-scheduler - quartz - ${quartz.version} - - - com.mchange - c3p0 - - - com.zaxxer - * - - - - - org.quartz-scheduler - quartz-jobs - ${quartz.version} - - - org.reactivestreams - reactive-streams - ${reactive-streams.version} - - - org.seleniumhq.selenium - htmlunit-driver - ${selenium-htmlunit.version} - - - org.seleniumhq.selenium - selenium-api - ${selenium.version} - - - org.seleniumhq.selenium - selenium-chrome-driver - ${selenium.version} - - - org.seleniumhq.selenium - selenium-edge-driver - ${selenium.version} - - - org.seleniumhq.selenium - selenium-firefox-driver - ${selenium.version} - - - org.seleniumhq.selenium - selenium-ie-driver - ${selenium.version} - - - org.seleniumhq.selenium - selenium-java - ${selenium.version} - - - org.seleniumhq.selenium - selenium-opera-driver - ${selenium.version} - - - org.seleniumhq.selenium - selenium-remote-driver - ${selenium.version} - - - commons-logging - commons-logging - - - - - org.seleniumhq.selenium - selenium-safari-driver - ${selenium.version} - - - org.seleniumhq.selenium - selenium-support - ${selenium.version} - - - commons-logging - commons-logging - - - - - org.skyscreamer - jsonassert - ${jsonassert.version} - - - org.slf4j - jcl-over-slf4j - ${slf4j.version} - - - org.slf4j - jul-to-slf4j - ${slf4j.version} - - - org.slf4j - log4j-over-slf4j - ${slf4j.version} - - - org.slf4j - slf4j-api - ${slf4j.version} - - - org.slf4j - slf4j-ext - ${slf4j.version} - - - org.slf4j - slf4j-jcl - ${slf4j.version} - - - org.slf4j - slf4j-jdk14 - ${slf4j.version} - - - org.slf4j - slf4j-log4j12 - ${slf4j.version} - - - org.slf4j - slf4j-nop - ${slf4j.version} - - - org.slf4j - slf4j-simple - ${slf4j.version} - - - org.springframework - spring-framework-bom - ${spring-framework.version} - import - pom - - - org.springframework.amqp - spring-amqp - ${spring-amqp.version} - - - org.springframework.amqp - spring-rabbit - ${spring-amqp.version} - - - org.springframework.amqp - spring-rabbit-junit - ${spring-amqp.version} - - - org.springframework.amqp - spring-rabbit-test - ${spring-amqp.version} - - - org.springframework.batch - spring-batch-core - ${spring-batch.version} - - - org.springframework.batch - spring-batch-infrastructure - ${spring-batch.version} - - - org.springframework.batch - spring-batch-integration - ${spring-batch.version} - - - org.springframework.batch - spring-batch-test - ${spring-batch.version} - - - org.springframework.cloud - spring-cloud-cloudfoundry-connector - ${spring-cloud-connectors.version} - - - org.springframework.cloud - spring-cloud-connectors-core - ${spring-cloud-connectors.version} - - - org.springframework.cloud - spring-cloud-heroku-connector - ${spring-cloud-connectors.version} - - - org.springframework.cloud - spring-cloud-localconfig-connector - ${spring-cloud-connectors.version} - - - org.springframework.cloud - spring-cloud-spring-service-connector - ${spring-cloud-connectors.version} - - - org.springframework.data - spring-data-releasetrain - ${spring-data-releasetrain.version} - import - pom - - - org.springframework.hateoas - spring-hateoas - ${spring-hateoas.version} - - - org.springframework.integration - spring-integration-bom - ${spring-integration.version} - import - pom - - - org.springframework.integration - spring-integration-http - ${spring-integration.version} - - - commons-logging - commons-logging - - - commons-logging - commons-logging-api - - - - - org.springframework.kafka - spring-kafka - ${spring-kafka.version} - - - org.springframework.kafka - spring-kafka-test - ${spring-kafka.version} - - - org.springframework.ldap - spring-ldap-core - ${spring-ldap.version} - - - org.springframework.ldap - spring-ldap-core-tiger - ${spring-ldap.version} - - - org.springframework.ldap - spring-ldap-ldif-batch - ${spring-ldap.version} - - - org.springframework.ldap - spring-ldap-ldif-core - ${spring-ldap.version} - - - org.springframework.ldap - spring-ldap-odm - ${spring-ldap.version} - - - org.springframework.ldap - spring-ldap-test - ${spring-ldap.version} - - - org.springframework.restdocs - spring-restdocs-asciidoctor - ${spring-restdocs.version} - - - org.springframework.restdocs - spring-restdocs-core - ${spring-restdocs.version} - - - org.springframework.restdocs - spring-restdocs-mockmvc - ${spring-restdocs.version} - - - org.springframework.restdocs - spring-restdocs-restassured - ${spring-restdocs.version} - - - org.springframework.restdocs - spring-restdocs-webtestclient - ${spring-restdocs.version} - - - org.springframework.retry - spring-retry - ${spring-retry.version} - - - org.springframework.security - spring-security-bom - ${spring-security.version} - import - pom - - - org.springframework.session - spring-session-bom - ${spring-session-bom.version} - import - pom - - - org.springframework.ws - spring-ws-core - ${spring-ws.version} - - - commons-logging - commons-logging - - - - - org.springframework.ws - spring-ws-security - ${spring-ws.version} - - - commons-logging - commons-logging - - - - - org.springframework.ws - spring-ws-support - ${spring-ws.version} - - - commons-logging - commons-logging - - - - - org.springframework.ws - spring-ws-test - ${spring-ws.version} - - - commons-logging - commons-logging - - - - - org.springframework.ws - spring-xml - ${spring-ws.version} - - - org.synchronoss.cloud - nio-multipart-parser - ${nio-multipart-parser.version} - - - org.thymeleaf - thymeleaf - ${thymeleaf.version} - - - org.thymeleaf - thymeleaf-spring5 - ${thymeleaf.version} - - - org.thymeleaf.extras - thymeleaf-extras-java8time - ${thymeleaf-extras-java8time.version} - - - org.thymeleaf.extras - thymeleaf-extras-springsecurity5 - ${thymeleaf-extras-springsecurity.version} - - - org.webjars - hal-browser - ${webjars-hal-browser.version} - - - org.webjars - webjars-locator-core - ${webjars-locator-core.version} - - - org.xerial - sqlite-jdbc - ${sqlite-jdbc.version} - - - org.xmlunit - xmlunit-assertj - ${xmlunit2.version} - - - org.xmlunit - xmlunit-core - ${xmlunit2.version} - - - org.xmlunit - xmlunit-legacy - ${xmlunit2.version} - - - org.xmlunit - xmlunit-matchers - ${xmlunit2.version} - - - org.xmlunit - xmlunit-placeholders - ${xmlunit2.version} - - - org.yaml - snakeyaml - ${snakeyaml.version} - - - redis.clients - jedis - ${jedis.version} - - - wsdl4j - wsdl4j - ${wsdl4j.version} - - - - - - - - org.apache.johnzon - johnzon-maven-plugin - ${johnzon.version} - - - org.jetbrains.kotlin - kotlin-maven-plugin - ${kotlin.version} - - - org.jooq - jooq-codegen-maven - ${jooq.version} - - - org.springframework.boot - spring-boot-maven-plugin - ${revision} - - - org.apache.maven.plugins - maven-antrun-plugin - ${maven-antrun-plugin.version} - - - org.apache.maven.plugins - maven-assembly-plugin - ${maven-assembly-plugin.version} - - false - - - - org.apache.maven.plugins - maven-clean-plugin - ${maven-clean-plugin.version} - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - - org.apache.maven.plugins - maven-deploy-plugin - ${maven-deploy-plugin.version} - - - org.apache.maven.plugins - maven-dependency-plugin - ${maven-dependency-plugin.version} - - - org.apache.maven.plugins - maven-enforcer-plugin - ${maven-enforcer-plugin.version} - - - org.apache.maven.plugins - maven-failsafe-plugin - ${maven-failsafe-plugin.version} - - - org.apache.maven.plugins - maven-install-plugin - ${maven-install-plugin.version} - - - org.apache.maven.plugins - maven-invoker-plugin - ${maven-invoker-plugin.version} - - - org.apache.maven.plugins - maven-help-plugin - ${maven-help-plugin.version} - - - org.apache.maven.plugins - maven-jar-plugin - ${maven-jar-plugin.version} - - - org.apache.maven.plugins - maven-javadoc-plugin - ${maven-javadoc-plugin.version} - - - org.apache.maven.plugins - maven-resources-plugin - ${maven-resources-plugin.version} - - - org.apache.maven.plugins - maven-shade-plugin - ${maven-shade-plugin.version} - - - org.apache.maven.plugins - maven-source-plugin - ${maven-source-plugin.version} - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - - org.apache.maven.plugins - maven-toolchains-plugin - ${maven-toolchains-plugin.version} - - - org.apache.maven.plugins - maven-war-plugin - ${maven-war-plugin.version} - - - org.codehaus.mojo - build-helper-maven-plugin - ${build-helper-maven-plugin.version} - - - org.codehaus.mojo - exec-maven-plugin - ${exec-maven-plugin.version} - - - org.codehaus.mojo - versions-maven-plugin - ${versions-maven-plugin.version} - - - org.codehaus.mojo - xml-maven-plugin - ${xml-maven-plugin.version} - - - org.codehaus.mojo - flatten-maven-plugin - ${flatten-maven-plugin.version} - - - org.flywaydb - flyway-maven-plugin - ${flyway.version} - - - org.infinispan - infinispan-protocol-parser-generator-maven-plugin - ${infinispan.version} - - - pl.project13.maven - git-commit-id-plugin - ${git-commit-id-plugin.version} - - - - - - org.codehaus.mojo - flatten-maven-plugin - false - - - - flatten-effective-pom - process-resources - - flatten - - - false - ${project.build.directory}/effective-pom - spring-boot-dependencies.xml - oss - - expand - expand - remove - remove - - - - - - flatten - process-resources - - flatten - - - true - bom - - keep - keep - remove - - - - - flatten-clean - clean - - clean - - - - - - org.codehaus.mojo - xml-maven-plugin - false - - - - post-process-effective-pom - process-resources - - transform - - - - -

${project.build.directory}/effective-pom - ${project.build.directory}/effective-pom - src/main/xslt/post-process-flattened-pom.xsl - - - indent - yes - - - - - - - - - post-process-flattened-pom - process-resources - - transform - - - - - ${project.basedir} - ${project.basedir} - .flattened-pom.xml - src/main/xslt/post-process-flattened-pom.xsl - - - indent - yes - - - - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - false - - - - attach-artifacts - package - - attach-artifact - - - - - ${project.build.directory}/effective-pom/spring-boot-dependencies.xml - effective-pom - - - - - - - - -
diff --git a/spring-boot-project/spring-boot-devtools/build.gradle b/spring-boot-project/spring-boot-devtools/build.gradle new file mode 100644 index 0000000000..4120f22aea --- /dev/null +++ b/spring-boot-project/spring-boot-devtools/build.gradle @@ -0,0 +1,86 @@ +plugins { + id 'java-library' + id 'org.springframework.boot.auto-configuration' + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.deployed' + id 'org.springframework.boot.integration-test' + id 'org.springframework.boot.optional-dependencies' +} + +description = 'Spring Boot Developer Tools' + +configurations { + intTestDependencies +} + +dependencies { + implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + implementation project(':spring-boot-project:spring-boot') + implementation project(':spring-boot-project:spring-boot-autoconfigure') + + intTestDependencies project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + intTestImplementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + intTestImplementation project(':spring-boot-project:spring-boot-autoconfigure') + intTestImplementation project(':spring-boot-project:spring-boot-test') + intTestImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-test-support') + intTestImplementation 'org.apache.httpcomponents:httpclient' + intTestImplementation 'org.assertj:assertj-core' + intTestImplementation 'org.awaitility:awaitility' + intTestImplementation 'org.junit.jupiter:junit-jupiter' + intTestImplementation 'net.bytebuddy:byte-buddy' + intTestRuntimeOnly 'org.springframework:spring-web' + + optional enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + optional 'javax.servlet:javax.servlet-api' + optional 'org.apache.derby:derby' + optional 'org.hibernate:hibernate-core' + optional 'org.springframework:spring-jdbc' + optional 'org.springframework:spring-orm' + optional 'org.springframework:spring-web' + optional 'org.springframework.security:spring-security-config' + optional 'org.springframework.security:spring-security-web' + optional 'org.springframework.data:spring-data-redis' + optional 'org.springframework.session:spring-session-core' + + testImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-test-support') + testImplementation project(':spring-boot-project:spring-boot-test') + testImplementation 'ch.qos.logback:logback-classic' + testImplementation 'com.h2database:h2' + testImplementation 'com.zaxxer:HikariCP' + testImplementation 'org.apache.derby:derbyclient' + testImplementation 'org.apache.tomcat.embed:tomcat-embed-websocket' + testImplementation 'org.apache.tomcat.embed:tomcat-embed-core' + testImplementation 'org.apache.tomcat.embed:tomcat-embed-jasper' + testImplementation 'org.assertj:assertj-core' + testImplementation 'org.awaitility:awaitility' + testImplementation 'org.eclipse.jetty.websocket:websocket-client' + testImplementation 'org.hamcrest:hamcrest-library' + testImplementation 'org.hsqldb:hsqldb' + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.mockito:mockito-core' + testImplementation 'org.postgresql:postgresql' + testImplementation 'org.springframework:spring-test' + testImplementation 'org.springframework:spring-webmvc' + testImplementation 'org.springframework:spring-websocket' + testImplementation 'org.springframework.hateoas:spring-hateoas' + testImplementation 'org.springframework.security:spring-security-test' + testImplementation 'org.thymeleaf:thymeleaf' + testImplementation 'org.thymeleaf:thymeleaf-spring5' + testImplementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect' + + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + testRuntimeOnly 'org.yaml:snakeyaml' +} + +task copyIntTestDependencies(type: Copy) { + destinationDir = file("$buildDir/dependencies") + from { + configurations.intTestDependencies + } + from jar +} + +intTest { + dependsOn copyIntTestDependencies +} diff --git a/spring-boot-project/spring-boot-devtools/pom.xml b/spring-boot-project/spring-boot-devtools/pom.xml deleted file mode 100644 index 9af7e352ad..0000000000 --- a/spring-boot-project/spring-boot-devtools/pom.xml +++ /dev/null @@ -1,220 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-parent - ${revision} - ../spring-boot-parent - - spring-boot-devtools - Spring Boot Developer Tools - Spring Boot Developer Tools - - ${basedir}/../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - - org.springframework.boot - spring-boot - - - org.springframework.boot - spring-boot-autoconfigure - - - - jakarta.persistence - jakarta.persistence-api - true - - - jakarta.servlet - jakarta.servlet-api - true - - - org.apache.derby - derby - true - - - org.springframework - spring-jdbc - true - - - org.springframework - spring-orm - true - - - org.hibernate - hibernate-core - true - - - javax.activation - javax.activation-api - - - javax.xml.bind - jaxb-api - - - javax.persistence - javax.persistence-api - - - - - org.springframework - spring-web - true - - - org.springframework.security - spring-security-config - true - - - org.springframework.security - spring-security-web - true - - - org.springframework.data - spring-data-redis - true - - - org.springframework.session - spring-session-core - true - - - - org.springframework.boot - spring-boot-autoconfigure-processor - true - - - org.springframework.boot - spring-boot-configuration-processor - true - - - - org.springframework.boot - spring-boot-test-support - test - - - org.springframework.boot - spring-boot-test - test - - - ch.qos.logback - logback-classic - test - - - com.h2database - h2 - test - - - com.zaxxer - HikariCP - test - - - org.awaitility - awaitility - test - - - org.springframework - spring-webmvc - test - - - org.springframework - spring-websocket - test - - - org.springframework.hateoas - spring-hateoas - test - - - org.apache.derby - derbyclient - ${derby.version} - test - - - org.apache.tomcat.embed - tomcat-embed-websocket - test - - - org.apache.tomcat.embed - tomcat-embed-core - test - - - org.apache.tomcat.embed - tomcat-embed-jasper - test - - - org.eclipse.jetty.websocket - websocket-client - test - - - org.hsqldb - hsqldb - test - - - org.postgresql - postgresql - test - - - org.springframework.security - spring-security-test - test - - - org.thymeleaf - thymeleaf - test - - - org.thymeleaf - thymeleaf-spring5 - test - - - org.yaml - snakeyaml - test - - - nz.net.ultraq.thymeleaf - thymeleaf-layout-dialect - test - - - diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/com/example/ControllerOne.java b/spring-boot-project/spring-boot-devtools/src/intTest/java/com/example/ControllerOne.java similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/com/example/ControllerOne.java rename to spring-boot-project/spring-boot-devtools/src/intTest/java/com/example/ControllerOne.java diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/com/example/DevToolsTestApplication.java b/spring-boot-project/spring-boot-devtools/src/intTest/java/com/example/DevToolsTestApplication.java similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/com/example/DevToolsTestApplication.java rename to spring-boot-project/spring-boot-devtools/src/intTest/java/com/example/DevToolsTestApplication.java diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/AbstractApplicationLauncher.java b/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/AbstractApplicationLauncher.java similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/AbstractApplicationLauncher.java rename to spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/AbstractApplicationLauncher.java diff --git a/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/AbstractDevToolsIntegrationTests.java b/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/AbstractDevToolsIntegrationTests.java new file mode 100644 index 0000000000..e8773240a6 --- /dev/null +++ b/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/AbstractDevToolsIntegrationTests.java @@ -0,0 +1,113 @@ +/* + * Copyright 2012-2019 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.boot.devtools.tests; + +import java.io.File; +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; + +import net.bytebuddy.ByteBuddy; +import net.bytebuddy.description.annotation.AnnotationDescription; +import net.bytebuddy.description.modifier.Visibility; +import net.bytebuddy.dynamic.DynamicType; +import net.bytebuddy.implementation.FixedValue; +import org.awaitility.Awaitility; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.junit.jupiter.api.io.TempDir; + +import org.springframework.boot.testsupport.BuildOutput; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * Base class for DevTools integration tests. + * + * @author Andy Wilkinson + */ +abstract class AbstractDevToolsIntegrationTests { + + protected static final BuildOutput buildOutput = new BuildOutput(AbstractDevToolsIntegrationTests.class); + + protected final File serverPortFile = new File(buildOutput.getRootLocation(), "server.port"); + + @RegisterExtension + protected final JvmLauncher javaLauncher = new JvmLauncher(); + + @TempDir + protected static File temp; + + protected LaunchedApplication launchedApplication; + + protected void launchApplication(ApplicationLauncher applicationLauncher, String... args) throws Exception { + this.serverPortFile.delete(); + this.launchedApplication = applicationLauncher.launchApplication(this.javaLauncher, this.serverPortFile, args); + } + + @AfterEach + void stopApplication() throws InterruptedException { + this.launchedApplication.stop(); + } + + protected int awaitServerPort() throws Exception { + int port = Awaitility.waitAtMost(Duration.ofSeconds(30)) + .until(() -> new ApplicationState(this.serverPortFile, this.launchedApplication), + ApplicationState::hasServerPort) + .getServerPort(); + this.serverPortFile.delete(); + this.launchedApplication.restartRemote(port); + Thread.sleep(1000); + return port; + } + + protected ControllerBuilder controller(String name) { + return new ControllerBuilder(name, this.launchedApplication.getClassesDirectory()); + } + + protected static final class ControllerBuilder { + + private final List mappings = new ArrayList<>(); + + private final String name; + + private final File classesDirectory; + + protected ControllerBuilder(String name, File classesDirectory) { + this.name = name; + this.classesDirectory = classesDirectory; + } + + protected ControllerBuilder withRequestMapping(String mapping) { + this.mappings.add(mapping); + return this; + } + + protected void build() throws Exception { + DynamicType.Builder builder = new ByteBuddy().subclass(Object.class).name(this.name) + .annotateType(AnnotationDescription.Builder.ofType(RestController.class).build()); + for (String mapping : this.mappings) { + builder = builder.defineMethod(mapping, String.class, Visibility.PUBLIC) + .intercept(FixedValue.value(mapping)).annotateMethod(AnnotationDescription.Builder + .ofType(RequestMapping.class).defineArray("value", mapping).build()); + } + builder.make().saveIn(this.classesDirectory); + } + + } + +} diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/ApplicationLauncher.java b/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/ApplicationLauncher.java similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/ApplicationLauncher.java rename to spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/ApplicationLauncher.java diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/ApplicationState.java b/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/ApplicationState.java similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/ApplicationState.java rename to spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/ApplicationState.java diff --git a/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/DevToolsIntegrationTests.java b/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/DevToolsIntegrationTests.java new file mode 100644 index 0000000000..91d5290783 --- /dev/null +++ b/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/DevToolsIntegrationTests.java @@ -0,0 +1,163 @@ +/* + * Copyright 2012-2019 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.boot.devtools.tests; + +import java.io.File; +import java.io.IOException; + +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.client.StandardHttpRequestRetryHandler; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.http.HttpStatus; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Integration tests for DevTools. + * + * @author Andy Wilkinson + */ +class DevToolsIntegrationTests extends AbstractDevToolsIntegrationTests { + + private final TestRestTemplate template = new TestRestTemplate( + new RestTemplateBuilder().requestFactory(() -> new HttpComponentsClientHttpRequestFactory( + HttpClients.custom().setRetryHandler(new StandardHttpRequestRetryHandler(10, false)).build()))); + + @ParameterizedTest(name = "{0}") + @MethodSource("parameters") + void addARequestMappingToAnExistingController(ApplicationLauncher applicationLauncher) throws Exception { + launchApplication(applicationLauncher); + String urlBase = "http://localhost:" + awaitServerPort(); + assertThat(this.template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); + assertThat(this.template.getForEntity(urlBase + "/two", String.class).getStatusCode()) + .isEqualTo(HttpStatus.NOT_FOUND); + controller("com.example.ControllerOne").withRequestMapping("one").withRequestMapping("two").build(); + urlBase = "http://localhost:" + awaitServerPort(); + assertThat(this.template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); + assertThat(this.template.getForObject(urlBase + "/two", String.class)).isEqualTo("two"); + } + + @ParameterizedTest(name = "{0}") + @MethodSource("parameters") + void removeARequestMappingFromAnExistingController(ApplicationLauncher applicationLauncher) throws Exception { + launchApplication(applicationLauncher); + String urlBase = "http://localhost:" + awaitServerPort(); + assertThat(this.template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); + controller("com.example.ControllerOne").build(); + urlBase = "http://localhost:" + awaitServerPort(); + assertThat(this.template.getForEntity(urlBase + "/one", String.class).getStatusCode()) + .isEqualTo(HttpStatus.NOT_FOUND); + } + + @ParameterizedTest(name = "{0}") + @MethodSource("parameters") + void createAController(ApplicationLauncher applicationLauncher) throws Exception { + launchApplication(applicationLauncher); + String urlBase = "http://localhost:" + awaitServerPort(); + assertThat(this.template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); + assertThat(this.template.getForEntity(urlBase + "/two", String.class).getStatusCode()) + .isEqualTo(HttpStatus.NOT_FOUND); + controller("com.example.ControllerTwo").withRequestMapping("two").build(); + urlBase = "http://localhost:" + awaitServerPort(); + assertThat(this.template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); + assertThat(this.template.getForObject(urlBase + "/two", String.class)).isEqualTo("two"); + + } + + @ParameterizedTest(name = "{0}") + @MethodSource("parameters") + void createAControllerAndThenAddARequestMapping(ApplicationLauncher applicationLauncher) throws Exception { + launchApplication(applicationLauncher); + String urlBase = "http://localhost:" + awaitServerPort(); + assertThat(this.template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); + assertThat(this.template.getForEntity(urlBase + "/two", String.class).getStatusCode()) + .isEqualTo(HttpStatus.NOT_FOUND); + controller("com.example.ControllerTwo").withRequestMapping("two").build(); + urlBase = "http://localhost:" + awaitServerPort(); + assertThat(this.template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); + assertThat(this.template.getForObject(urlBase + "/two", String.class)).isEqualTo("two"); + controller("com.example.ControllerTwo").withRequestMapping("two").withRequestMapping("three").build(); + urlBase = "http://localhost:" + awaitServerPort(); + assertThat(this.template.getForObject(urlBase + "/three", String.class)).isEqualTo("three"); + } + + @ParameterizedTest(name = "{0}") + @MethodSource("parameters") + void createAControllerAndThenAddARequestMappingToAnExistingController(ApplicationLauncher applicationLauncher) + throws Exception { + launchApplication(applicationLauncher); + String urlBase = "http://localhost:" + awaitServerPort(); + assertThat(this.template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); + assertThat(this.template.getForEntity(urlBase + "/two", String.class).getStatusCode()) + .isEqualTo(HttpStatus.NOT_FOUND); + controller("com.example.ControllerTwo").withRequestMapping("two").build(); + urlBase = "http://localhost:" + awaitServerPort(); + assertThat(this.template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); + assertThat(this.template.getForObject(urlBase + "/two", String.class)).isEqualTo("two"); + controller("com.example.ControllerOne").withRequestMapping("one").withRequestMapping("three").build(); + urlBase = "http://localhost:" + awaitServerPort(); + assertThat(this.template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); + assertThat(this.template.getForObject(urlBase + "/two", String.class)).isEqualTo("two"); + assertThat(this.template.getForObject(urlBase + "/three", String.class)).isEqualTo("three"); + } + + @ParameterizedTest(name = "{0}") + @MethodSource("parameters") + void deleteAController(ApplicationLauncher applicationLauncher) throws Exception { + launchApplication(applicationLauncher); + String urlBase = "http://localhost:" + awaitServerPort(); + assertThat(this.template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); + assertThat(new File(this.launchedApplication.getClassesDirectory(), "com/example/ControllerOne.class").delete()) + .isTrue(); + urlBase = "http://localhost:" + awaitServerPort(); + assertThat(this.template.getForEntity(urlBase + "/one", String.class).getStatusCode()) + .isEqualTo(HttpStatus.NOT_FOUND); + + } + + @ParameterizedTest(name = "{0}") + @MethodSource("parameters") + void createAControllerAndThenDeleteIt(ApplicationLauncher applicationLauncher) throws Exception { + launchApplication(applicationLauncher); + String urlBase = "http://localhost:" + awaitServerPort(); + assertThat(this.template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); + assertThat(this.template.getForEntity(urlBase + "/two", String.class).getStatusCode()) + .isEqualTo(HttpStatus.NOT_FOUND); + controller("com.example.ControllerTwo").withRequestMapping("two").build(); + urlBase = "http://localhost:" + awaitServerPort(); + assertThat(this.template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); + assertThat(this.template.getForObject(urlBase + "/two", String.class)).isEqualTo("two"); + assertThat(new File(this.launchedApplication.getClassesDirectory(), "com/example/ControllerTwo.class").delete()) + .isTrue(); + urlBase = "http://localhost:" + awaitServerPort(); + assertThat(this.template.getForEntity(urlBase + "/two", String.class).getStatusCode()) + .isEqualTo(HttpStatus.NOT_FOUND); + } + + static Object[] parameters() throws IOException { + Directories directories = new Directories(buildOutput, temp); + return new Object[] { new Object[] { new LocalApplicationLauncher(directories) }, + new Object[] { new ExplodedRemoteApplicationLauncher(directories) }, + new Object[] { new JarFileRemoteApplicationLauncher(directories) } }; + } + +} diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/DevToolsWithLazyInitializationIntegrationTests.java b/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/DevToolsWithLazyInitializationIntegrationTests.java similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/DevToolsWithLazyInitializationIntegrationTests.java rename to spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/DevToolsWithLazyInitializationIntegrationTests.java diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/Directories.java b/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/Directories.java similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/Directories.java rename to spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/Directories.java diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/ExplodedRemoteApplicationLauncher.java b/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/ExplodedRemoteApplicationLauncher.java similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/ExplodedRemoteApplicationLauncher.java rename to spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/ExplodedRemoteApplicationLauncher.java diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/FileContents.java b/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/FileContents.java similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/FileContents.java rename to spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/FileContents.java diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/JarFileRemoteApplicationLauncher.java b/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/JarFileRemoteApplicationLauncher.java similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/JarFileRemoteApplicationLauncher.java rename to spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/JarFileRemoteApplicationLauncher.java diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/JvmLauncher.java b/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/JvmLauncher.java similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/JvmLauncher.java rename to spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/JvmLauncher.java diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/LaunchedApplication.java b/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/LaunchedApplication.java similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/LaunchedApplication.java rename to spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/LaunchedApplication.java diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/LocalApplicationLauncher.java b/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/LocalApplicationLauncher.java similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/LocalApplicationLauncher.java rename to spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/LocalApplicationLauncher.java diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/RemoteApplicationLauncher.java b/spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/RemoteApplicationLauncher.java similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/RemoteApplicationLauncher.java rename to spring-boot-project/spring-boot-devtools/src/intTest/java/org/springframework/boot/devtools/tests/RemoteApplicationLauncher.java diff --git a/spring-boot-project/spring-boot-devtools/src/main/resources/META-INF/spring-devtools.properties b/spring-boot-project/spring-boot-devtools/src/main/resources/META-INF/spring-devtools.properties index 9810d8d63e..88ee28a8f8 100644 --- a/spring-boot-project/spring-boot-devtools/src/main/resources/META-INF/spring-devtools.properties +++ b/spring-boot-project/spring-boot-devtools/src/main/resources/META-INF/spring-devtools.properties @@ -1,6 +1,6 @@ -restart.exclude.spring-boot=/spring-boot/target/classes/ -restart.exclude.spring-boot-devtools=/spring-boot-devtools/target/classes/ -restart.exclude.spring-boot-autoconfigure=/spring-boot-autoconfigure/target/classes/ -restart.exclude.spring-boot-actuator=/spring-boot-actuator/target/classes/ -restart.exclude.spring-boot-starter=/spring-boot-starter/target/classes/ +restart.exclude.spring-boot=/spring-boot/(bin|build|out)/ +restart.exclude.spring-boot-devtools=/spring-boot-devtools/(bin|build|out)/ +restart.exclude.spring-boot-autoconfigure=/spring-boot-autoconfigure/(bin|build|out)/ +restart.exclude.spring-boot-actuator=/spring-boot-actuator/(bin|build|out)/ +restart.exclude.spring-boot-starter=/spring-boot-starter/(bin|build|out)/ restart.exclude.spring-boot-starters=/spring-boot-starter-[\\w-]+/ diff --git a/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/filewatch/FileSystemWatcherTests.java b/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/filewatch/FileSystemWatcherTests.java index f698822000..e82daac477 100644 --- a/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/filewatch/FileSystemWatcherTests.java +++ b/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/filewatch/FileSystemWatcherTests.java @@ -100,11 +100,12 @@ class FileSystemWatcherTests { } @Test - void sourceFolderMustNotBeAFile() { - File folder = new File("pom.xml"); - assertThat(folder.isFile()).isTrue(); - assertThatIllegalArgumentException().isThrownBy(() -> this.watcher.addSourceFolder(new File("pom.xml"))) - .withMessageContaining("Folder 'pom.xml' must not be a file"); + void sourceFolderMustNotBeAFile() throws IOException { + File file = new File(this.tempDir, "file"); + assertThat(file.createNewFile()).isTrue(); + assertThat(file.isFile()).isTrue(); + assertThatIllegalArgumentException().isThrownBy(() -> this.watcher.addSourceFolder(file)) + .withMessageContaining("Folder '" + file + "' must not be a file"); } @Test diff --git a/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/restart/ChangeableUrlsTests.java b/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/restart/ChangeableUrlsTests.java index 85567ef2c5..f51b34b422 100644 --- a/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/restart/ChangeableUrlsTests.java +++ b/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/restart/ChangeableUrlsTests.java @@ -104,7 +104,7 @@ class ChangeableUrlsTests { private URL makeUrl(String name) throws IOException { File file = new File(this.tempDir, UUID.randomUUID().toString()); file = new File(file, name); - file = new File(file, "target"); + file = new File(file, "build"); file = new File(file, "classes"); file.mkdirs(); return file.toURI().toURL(); diff --git a/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/restart/DefaultRestartInitializerTests.java b/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/restart/DefaultRestartInitializerTests.java index 9602bfc0c4..4b1edbbdac 100644 --- a/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/restart/DefaultRestartInitializerTests.java +++ b/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/restart/DefaultRestartInitializerTests.java @@ -16,6 +16,10 @@ package org.springframework.boot.devtools.restart; +import java.io.IOException; +import java.net.URL; +import java.net.URLClassLoader; + import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -82,8 +86,17 @@ class DefaultRestartInitializerTests { } @Test - void urlsCanBeRetrieved() { - assertThat(new DefaultRestartInitializer().getUrls(Thread.currentThread())).isNotEmpty(); + void urlsCanBeRetrieved() throws IOException { + Thread thread = Thread.currentThread(); + ClassLoader classLoader = thread.getContextClassLoader(); + try (URLClassLoader contextClassLoader = new URLClassLoader( + new URL[] { new URL("file:test-app/build/classes/main/") }, classLoader)) { + thread.setContextClassLoader(contextClassLoader); + assertThat(new DefaultRestartInitializer().getUrls(thread)).isNotEmpty(); + } + finally { + thread.setContextClassLoader(classLoader); + } } protected void testSkippedStacks(String s) { diff --git a/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/settings/DevToolsSettingsTests.java b/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/settings/DevToolsSettingsTests.java index 590536d4c8..5f0ca38094 100644 --- a/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/settings/DevToolsSettingsTests.java +++ b/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/settings/DevToolsSettingsTests.java @@ -62,7 +62,7 @@ class DevToolsSettingsTests { private URL makeUrl(File file, String name) throws IOException { file = new File(file, name); - file = new File(file, "target"); + file = new File(file, "build"); file = new File(file, "classes"); file.mkdirs(); return file.toURI().toURL(); diff --git a/spring-boot-project/spring-boot-docs/build.gradle b/spring-boot-project/spring-boot-docs/build.gradle new file mode 100644 index 0000000000..69fb5da90c --- /dev/null +++ b/spring-boot-project/spring-boot-docs/build.gradle @@ -0,0 +1,241 @@ +plugins { + id 'java-base' + id 'org.asciidoctor.jvm.convert' + id 'org.asciidoctor.jvm.pdf' + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.deployed' +} + +configurations { + actuatorApiDocumentation + autoConfiguration + configurationProperties + gradlePluginDocumentation + mavenPluginDocumentation + testSlices +} + +dependencies { + testSlices project(path: ':spring-boot-project:spring-boot-test-autoconfigure', configuration: 'testSliceMetadata') + autoConfiguration project(path: ':spring-boot-project:spring-boot-autoconfigure', configuration: 'autoConfigurationMetadata') + autoConfiguration project(path: ':spring-boot-project:spring-boot-actuator-autoconfigure', configuration: 'autoConfigurationMetadata') + autoConfiguration project(path: ':spring-boot-project:spring-boot-devtools', configuration: 'autoConfigurationMetadata') + configurationProperties project(path: ':spring-boot-project:spring-boot', configuration: 'configurationPropertiesMetadata') + configurationProperties project(path: ':spring-boot-project:spring-boot-actuator', configuration: 'configurationPropertiesMetadata') + configurationProperties project(path: ':spring-boot-project:spring-boot-actuator-autoconfigure', configuration: 'configurationPropertiesMetadata') + configurationProperties project(path: ':spring-boot-project:spring-boot-autoconfigure', configuration: 'configurationPropertiesMetadata') + configurationProperties project(path: ':spring-boot-project:spring-boot-devtools', configuration: 'configurationPropertiesMetadata') + gradlePluginDocumentation project(path: ':spring-boot-project:spring-boot-tools:spring-boot-gradle-plugin', configuration: 'documentation') + actuatorApiDocumentation project(path: ':spring-boot-project:spring-boot-actuator-autoconfigure', configuration: 'documentation') + mavenPluginDocumentation project(path: ':spring-boot-project:spring-boot-tools:spring-boot-maven-plugin', configuration: 'documentation') +} + +task dependencyVersions(type: org.springframework.boot.build.constraints.ExtractVersionConstraints) { + enforcedPlatform(':spring-boot-project:spring-boot-dependencies') +} + +task javadoc(type: Javadoc) { + dependsOn dependencyVersions + project.rootProject.gradle.projectsEvaluated { + Set publishedProjects = rootProject.subprojects.findAll { it != project} + .findAll { it.plugins.hasPlugin(JavaPlugin) && it.plugins.hasPlugin(MavenPublishPlugin) } + .findAll { it.name != 'spring-boot-maven-plugin' && it.name != 'spring-boot-gradle-plugin' } + dependsOn publishedProjects.javadoc + source publishedProjects.javadoc.source + classpath = project.files(publishedProjects.javadoc.classpath) + destinationDir = project.file "$buildDir/docs/javadoc" + options { + author = true + docTitle = "Spring Boot ${project.version} API" + encoding = 'UTF-8' + memberLevel = 'protected' + outputLevel = 'quiet' + source = '1.8' + splitIndex = true + stylesheetFile = file('src/main/javadoc/spring-javadoc.css') + use = true + windowTitle = "Spring Boot ${project.version} API" + } + doFirst { + def versionConstraints = dependencyVersions.versionConstraints + options.links = [ + 'https://docs.oracle.com/javase/8/docs/api/', + 'https://docs.oracle.com/javaee/7/api/', + "https://docs.spring.io/spring-framework/docs/${versionConstraints['org.springframework:spring-core']}/javadoc-api/", + "https://docs.spring.io/spring-security/site/docs/${versionConstraints['org.springframework.security:spring-security-core']}/api/", + 'https://tomcat.apache.org/tomcat-9.0-doc/api/', + "https://www.eclipse.org/jetty/javadoc/${versionConstraints['org.eclipse.jetty:jetty-server']}/", + "https://www.thymeleaf.org/apidocs/thymeleaf/${versionConstraints['org.thymeleaf:thymeleaf']}/" + ] as String[] + } + } +} + +task documentTestSlices(type: org.springframework.boot.build.test.autoconfigure.DocumentTestSlices) { + testSlices = configurations.testSlices + outputFile = file("$buildDir/docs/generated/test-slice-auto-configuration.adoc") +} + +task documentStarters(type: org.springframework.boot.build.starters.DocumentStarters) { + outputDir = file("$buildDir/docs/generated/starters/") +} + +task documentAutoConfigurationClasses(type: org.springframework.boot.build.autoconfigure.DocumentAutoConfigurationClasses) { + autoConfiguration = configurations.autoConfiguration + outputDir = file("$buildDir/docs/generated/auto-configuration-classes/") +} + +task documentDependencyVersions(type: org.springframework.boot.build.constraints.DocumentConstrainedVersions) { + dependsOn dependencyVersions + constrainedVersions.set(providers.provider { dependencyVersions.constrainedVersions }) + outputFile = file("$buildDir/docs/generated/dependency-versions.adoc") +} + +task documentConfigurationProperties(type: org.springframework.boot.build.context.properties.DocumentConfigurationProperties) { + configurationPropertyMetadata = configurations.configurationProperties + outputDir = file("$buildDir/docs/generated/config-docs/") +} + +tasks.withType(org.asciidoctor.gradle.jvm.AbstractAsciidoctorTask) { + dependsOn dependencyVersions + baseDirFollowsSourceDir() + doFirst { + def versionConstraints = dependencyVersions.versionConstraints + attributes 'jetty-version': versionConstraints['org.eclipse.jetty:jetty-server'], + 'jooq-version': versionConstraints['org.jooq:jooq'], + 'spring-amqp-version': versionConstraints['org.springframework.amqp:spring-amqp'], + 'spring-batch-version': versionConstraints['org.springframework.batch:spring-batch-core'], + 'spring-boot-version': project.version, + 'spring-data-commons-version': versionConstraints['org.springframework.data:spring-data-commons'], + 'spring-data-couchbase-version': versionConstraints['org.springframework.data:spring-data-couchbase'], + 'spring-data-jdbc-version': versionConstraints['org.springframework.data:spring-data-jdbc'], + 'spring-data-jpa-version': versionConstraints['org.springframework.data:spring-data-jpa'], + 'spring-data-mongodb-version': versionConstraints['org.springframework.data:spring-data-mongodb'], + 'spring-data-neo4j-version': versionConstraints['org.springframework.data:spring-data-neo4j'], + 'spring-data-rest-version': versionConstraints['org.springframework.data:spring-data-rest-core'], + 'spring-data-solr-version': versionConstraints['org.springframework.data:spring-data-solr'], + 'spring-framework-version': versionConstraints['org.springframework:spring-core'], + 'spring-integration-version': versionConstraints['org.springframework.integration:spring-integration-core'], + 'spring-security-version': versionConstraints['org.springframework.security:spring-security-core'], + 'spring-webservices-version': versionConstraints['org.springframework.ws:spring-ws-core'] + } +} + +asciidoctor { + sources { + include '*.htmlsingleadoc' + } +} + +asciidoctorPdf { + sources { + include '*.pdfadoc' + } +} + +task asciidoctorMultipage(type: org.asciidoctor.gradle.jvm.AsciidoctorTask) { + sources { + include '*.htmladoc' + include '*.adoc' + } +} + +syncDocumentationSourceForAsciidoctor { + dependsOn documentTestSlices + dependsOn documentStarters + dependsOn documentAutoConfigurationClasses + dependsOn documentDependencyVersions + dependsOn documentConfigurationProperties + from("$buildDir/docs/generated") { + into 'asciidoc' + } + from ("src/main/java") { + into 'main/java' + } + from ("src/test/java") { + into 'test/java' + } +} + +syncDocumentationSourceForAsciidoctorMultipage { + dependsOn documentTestSlices + dependsOn documentStarters + dependsOn documentAutoConfigurationClasses + dependsOn documentDependencyVersions + dependsOn documentConfigurationProperties + from("$buildDir/docs/generated") { + into 'asciidoc' + } + from ("src/main/java") { + into 'main/java' + } + from ("src/test/java") { + into 'test/java' + } +} + +syncDocumentationSourceForAsciidoctorPdf { + dependsOn documentTestSlices + dependsOn documentStarters + dependsOn documentAutoConfigurationClasses + dependsOn documentDependencyVersions + dependsOn documentConfigurationProperties + from("$buildDir/docs/generated") { + into 'asciidoc' + } + from ("src/main/java") { + into 'main/java' + } + from ("src/test/java") { + into 'test/java' + } +} + +task zip(type: Zip) { + dependsOn asciidoctor, + asciidoctorMultipage, + asciidoctorPdf, + configurations.gradlePluginDocumentation, + configurations.actuatorApiDocumentation, + configurations.mavenPluginDocumentation + duplicatesStrategy 'fail' + from(asciidoctor.outputDir) { + into 'reference/htmlsingle' + } + from(asciidoctorPdf.outputDir) { + into 'reference/pdf' + } + from(asciidoctorMultipage.outputDir) { + into 'reference/html' + } + from(javadoc) { + into 'api' + } + into('gradle-plugin') { + from { + zipTree(configurations.gradlePluginDocumentation.singleFile) + } + } + into('actuator-api') { + from { + zipTree(configurations.actuatorApiDocumentation.singleFile) + } + } + into('maven-plugin') { + from { + zipTree(configurations.mavenPluginDocumentation.singleFile) + } + } +} + +artifacts { + archives zip +} + +publishing { + publications { + deployment(MavenPublication) { + artifact zip + } + } +} diff --git a/spring-boot-project/spring-boot-docs/pom.xml b/spring-boot-project/spring-boot-docs/pom.xml deleted file mode 100644 index 1ff020f128..0000000000 --- a/spring-boot-project/spring-boot-docs/pom.xml +++ /dev/null @@ -1,1760 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-parent - ${revision} - ../spring-boot-parent - - spring-boot-docs - Spring Boot Docs - Spring Boot Docs - - ${basedir}/../.. - ${project.build.directory}/refdocs/ - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot - - - org.springframework.boot - spring-boot-actuator - - - org.springframework.boot - spring-boot-actuator-autoconfigure - - - org.springframework.boot - spring-boot-autoconfigure - - - org.springframework.boot - spring-boot-cli - ${revision} - - - org.springframework.boot - spring-boot-starters - ${revision} - pom - - - org.springframework.boot - spring-boot-devtools - - - org.springframework.boot - spring-boot-loader - - - org.springframework.boot - spring-boot-loader-tools - - - org.springframework.boot - spring-boot-configuration-docs - ${revision} - - - org.springframework.boot - spring-boot-test - - - org.springframework.boot - spring-boot-test-autoconfigure - - - jakarta.persistence - jakarta.persistence-api - - - jakarta.ws.rs - jakarta.ws.rs-api - - - io.rest-assured - rest-assured - - - javax.xml.bind - jaxb-api - - - javax.activation - activation - - - org.hamcrest - hamcrest-core - - - org.hamcrest - hamcrest-library - - - - - org.springframework.restdocs - spring-restdocs-restassured - - - - ch.qos.logback - logback-classic - true - - - com.atomikos - transactions-jms - true - - - com.atomikos - transactions-jta - true - - - com.atomikos - transactions-jdbc - true - - - com.couchbase.client - java-client - true - - - com.couchbase.client - couchbase-spring-cache - true - - - com.fasterxml.jackson.core - jackson-databind - true - - - com.fasterxml.jackson.datatype - jackson-datatype-joda - true - - - com.fasterxml.jackson.dataformat - jackson-dataformat-cbor - true - - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - true - - - com.fasterxml.jackson.module - jackson-module-parameter-names - true - - - com.github.ben-manes.caffeine - caffeine - true - - - com.google.code.gson - gson - true - - - com.hazelcast - hazelcast - true - - - com.hazelcast - hazelcast-client - true - - - com.hazelcast - hazelcast-spring - true - - - com.h2database - h2 - true - - - com.jayway.jsonpath - json-path - true - - - com.samskivert - jmustache - true - - - com.sendgrid - sendgrid-java - true - - - com.unboundid - unboundid-ldapsdk - true - - - com.zaxxer - HikariCP - true - - - de.flapdoodle.embed - de.flapdoodle.embed.mongo - true - - - io.dropwizard.metrics - metrics-core - true - - - io.lettuce - lettuce-core - true - - - io.micrometer - micrometer-core - true - - - io.micrometer - micrometer-jersey2 - true - - - io.micrometer - micrometer-registry-appoptics - true - - - io.micrometer - micrometer-registry-atlas - true - - - io.micrometer - micrometer-registry-datadog - true - - - io.micrometer - micrometer-registry-dynatrace - true - - - io.micrometer - micrometer-registry-elastic - true - - - io.micrometer - micrometer-registry-ganglia - true - - - io.micrometer - micrometer-registry-graphite - true - - - io.micrometer - micrometer-registry-humio - true - - - io.micrometer - micrometer-registry-influx - true - - - io.micrometer - micrometer-registry-jmx - true - - - io.micrometer - micrometer-registry-kairos - true - - - io.micrometer - micrometer-registry-new-relic - true - - - io.micrometer - micrometer-registry-prometheus - true - - - io.micrometer - micrometer-registry-signalfx - true - - - io.micrometer - micrometer-registry-stackdriver - true - - - io.micrometer - micrometer-registry-statsd - true - - - io.micrometer - micrometer-registry-wavefront - true - - - io.projectreactor - reactor-tools - true - - - io.projectreactor.netty - reactor-netty - true - - - io.rsocket - rsocket-core - true - - - io.rsocket - rsocket-transport-netty - true - - - io.prometheus - simpleclient_pushgateway - true - - - io.reactivex - rxjava-reactive-streams - true - - - io.undertow - undertow-servlet - true - - - jboss-servlet-api_3.1_spec - org.jboss.spec.javax.servlet - - - - - io.searchbox - jest - true - - - io.undertow - undertow-websockets-jsr - true - - - undertow-servlet - io.undertow - - - - - jakarta.jms - jakarta.jms-api - true - - - jakarta.json.bind - jakarta.json.bind-api - true - - - jakarta.mail - jakarta.mail-api - true - - - jakarta.servlet - jakarta.servlet-api - true - - - jakarta.validation - jakarta.validation-api - true - - - javax.cache - cache-api - true - - - junit - junit - true - - - org.hamcrest - hamcrest-core - - - - - org.junit.jupiter - junit-jupiter-api - true - - - net.sf.ehcache - ehcache - true - - - net.sourceforge.htmlunit - htmlunit - true - - - nz.net.ultraq.thymeleaf - thymeleaf-layout-dialect - true - - - org.apache.activemq - activemq-client - true - - - geronimo-jms_1.1_spec - org.apache.geronimo.specs - - - - - org.apache.activemq - artemis-jms-client - true - - - geronimo-jms_2.0_spec - org.apache.geronimo.specs - - - - - org.apache.activemq - activemq-jms-pool - true - - - geronimo-jms_1.1_spec - org.apache.geronimo.specs - - - - - org.apache.activemq - artemis-jms-server - true - - - geronimo-jms_2.0_spec - org.apache.geronimo.specs - - - - - org.apache.activemq - activemq-pool - true - - - org.apache.commons - commons-pool2 - true - - - org.apache.commons - commons-dbcp2 - true - - - org.apache.derby - derby - true - - - org.apache.kafka - kafka-streams - true - - - javax.ws.rs - javax.ws.rs-api - - - - - org.apache.logging.log4j - log4j-api - true - - - org.apache.logging.log4j - log4j-core - true - - - org.apache.httpcomponents - httpclient - true - - - org.apache.tomcat.embed - tomcat-embed-core - true - - - org.apache.tomcat.embed - tomcat-embed-jasper - true - - - org.apache.tomcat.embed - tomcat-embed-websocket - true - - - org.apache.tomcat - tomcat-jdbc - true - - - org.aspectj - aspectjweaver - true - - - org.assertj - assertj-core - true - - - org.codehaus.btm - btm - true - - - javax.transaction - jta - - - - - org.codehaus.groovy - groovy - true - - - org.codehaus.groovy - groovy-xml - true - - - org.codehaus.groovy - groovy-templates - true - - - org.eclipse.jetty - jetty-util - true - - - org.eclipse.jetty - jetty-servlets - true - - - org.eclipse.jetty - jetty-webapp - true - - - org.eclipse.jetty.websocket - javax-websocket-server-impl - true - - - javax.annotation - javax.annotation-api - - - javax.servlet - javax.servlet-api - - - javax.websocket - javax.websocket-api - - - javax.websocket - javax.websocket-client-api - - - - - org.eclipse.jetty - jetty-alpn-conscrypt-server - true - - - org.eclipse.jetty - jetty-reactive-httpclient - true - - - org.eclipse.jetty.http2 - http2-server - true - - - javax.servlet - javax.servlet-api - - - - - org.elasticsearch.client - elasticsearch-rest-high-level-client - true - - - org.flywaydb - flyway-core - true - - - org.freemarker - freemarker - true - - - org.glassfish.jersey.containers - jersey-container-servlet-core - true - - - javax.validation - validation-api - - - - - org.glassfish.jersey.ext - jersey-spring5 - true - - - org.glassfish.jersey.media - jersey-media-json-jackson - true - - - org.hamcrest - hamcrest - true - - - org.jboss - jboss-transaction-spi - true - - - org.jboss.logging - jboss-logging - true - - - org.jetbrains.kotlin - kotlin-reflect - true - - - org.jetbrains.kotlin - kotlin-stdlib - true - - - org.jooq - jooq - true - - - javax.activation - javax.activation-api - - - javax.xml.bind - jaxb-api - - - - - org.hibernate - hibernate-core - true - - - javax.activation - javax.activation-api - - - javax.persistence - javax.persistence-api - - - javax.xml.bind - jaxb-api - - - - - org.hibernate - hibernate-jcache - true - - - org.hibernate.validator - hibernate-validator - true - - - javax.validation - validation-api - - - - - org.infinispan - infinispan-jcache - true - - - org.infinispan - infinispan-spring5-embedded - true - - - org.influxdb - influxdb-java - true - - - org.jolokia - jolokia-core - true - - - org.liquibase - liquibase-core - true - - - org.messaginghub - pooled-jms - true - - - org.mockito - mockito-core - true - - - org.mongodb - mongodb-driver-async - true - - - org.mongodb - mongodb-driver-reactivestreams - true - - - org.quartz-scheduler - quartz - true - - - org.skyscreamer - jsonassert - true - - - org.slf4j - slf4j-api - true - - - org.slf4j - jul-to-slf4j - true - - - org.seleniumhq.selenium - selenium-api - true - - - org.seleniumhq.selenium - htmlunit-driver - true - - - org.springframework - spring-context-support - true - - - org.springframework - spring-jms - true - - - org.springframework - spring-messaging - true - - - org.springframework - spring-orm - true - - - org.springframework - spring-test - true - - - org.springframework - spring-web - true - - - org.springframework - spring-webflux - true - - - org.springframework - spring-webmvc - true - - - org.springframework - spring-websocket - true - - - org.springframework.amqp - spring-rabbit - true - - - org.springframework.batch - spring-batch-core - true - - - org.springframework.cloud - spring-cloud-connectors-core - true - - - org.springframework.cloud - spring-cloud-spring-service-connector - true - - - org.springframework.integration - spring-integration-core - true - - - org.springframework.integration - spring-integration-jdbc - true - - - org.springframework.integration - spring-integration-jmx - true - - - org.springframework.kafka - spring-kafka - true - - - org.springframework.security - spring-security-config - true - - - org.springframework.security - spring-security-oauth2-client - true - - - javax.activation - activation - - - com.sun.mail - javax.mail - - - - - org.springframework.security - spring-security-oauth2-jose - true - - - org.springframework.security - spring-security-oauth2-resource-server - true - - - org.springframework.security - spring-security-rsocket - - - org.springframework.security - spring-security-saml2-service-provider - true - - - org.springframework.security - spring-security-test - true - - - org.springframework.session - spring-session-core - true - - - org.springframework.session - spring-session-hazelcast - true - - - javax.annotation - javax.annotation-api - - - - - org.springframework.session - spring-session-jdbc - true - - - org.springframework.session - spring-session-data-mongodb - true - - - org.springframework.session - spring-session-data-redis - true - - - org.springframework.data - spring-data-cassandra - true - - - org.springframework.data - spring-data-commons - true - - - org.springframework.data - spring-data-couchbase - true - - - org.springframework.data - spring-data-elasticsearch - true - - - org.springframework.data - spring-data-jdbc - true - - - org.springframework.data - spring-data-jpa - true - - - org.springframework.data - spring-data-ldap - true - - - org.springframework.data - spring-data-mongodb - true - - - org.springframework.data - spring-data-neo4j - true - - - org.springframework.data - spring-data-redis - true - - - org.springframework.data - spring-data-rest-core - true - - - org.springframework.data - spring-data-rest-webmvc - true - - - org.springframework.data - spring-data-solr - true - - - org.springframework.hateoas - spring-hateoas - true - - - org.springframework.restdocs - spring-restdocs-mockmvc - true - - - javax.servlet - javax.servlet-api - - - - - org.springframework.restdocs - spring-restdocs-webtestclient - true - - - org.springframework.security - spring-security-data - true - - - javax.xml.bind - jaxb-api - - - - - org.springframework.security - spring-security-web - true - - - org.springframework.ws - spring-ws-core - true - - - org.thymeleaf - thymeleaf-spring5 - true - - - com.github.mxab.thymeleaf.extras - thymeleaf-extras-data-attribute - true - - - org.thymeleaf.extras - thymeleaf-extras-java8time - true - - - org.thymeleaf.extras - thymeleaf-extras-springsecurity5 - true - - - org.yaml - snakeyaml - true - - - redis.clients - jedis - true - - - - org.springframework.boot - spring-boot-test-support - test - - - org.springframework.boot - spring-boot-starter-web - test - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - ** - - - - - - - - full - - - full - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - - - attach-javadocs - - jar - - prepare-package - - true - - ${project.groupId}:* - - org/springframework/boot/docs/**/*.java - false - true - ${basedir}/src/main/javadoc/spring-javadoc.css - - https://docs.oracle.com/javase/8/docs/api/ - https://docs.oracle.com/javaee/7/api/ - https://docs.spring.io/spring-framework/docs/${spring-framework.version}/javadoc-api/ - https://docs.spring.io/spring-security/site/docs/${spring-security.version}/api/ - https://tomcat.apache.org/tomcat-9.0-doc/api/ - https://www.eclipse.org/jetty/javadoc/${jetty.version}/ - https://www.thymeleaf.org/apidocs/thymeleaf/${thymeleaf.version}/ - - - - - - - com.googlecode.maven-download-plugin - download-maven-plugin - - - unpack-doc-resources - generate-resources - - wget - - - ${spring-doc-resources.url} - true - ${refdocs.build.directory} - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-starters-pom - generate-resources - - copy - - - - - org.springframework.boot - spring-boot-starters - ${revision} - pom - true - ${project.build.directory}/external-resources - starters-effective-pom.xml - - - - - - unpack-maven-plugin - generate-resources - - unpack - - - - - org.springframework.boot - spring-boot-maven-plugin - ${revision} - docs - zip - - ${project.build.directory}/contents/maven-plugin - - META-INF/** - - - org.springframework.boot - spring-boot-gradle-plugin - ${revision} - docs - zip - ${project.build.directory}/contents/gradle-plugin - META-INF/** - - - org.springframework.boot - spring-boot-actuator-autoconfigure - ${revision} - docs - zip - ${project.build.directory}/contents/actuator-api - META-INF/** - - - - - - copy-dependencies-effective-pom - generate-resources - - copy - - - - - org.springframework.boot - spring-boot-dependencies - ${revision} - effective-pom - true - ${project.build.directory}/external-resources - effective-pom.xml - - - - - - unpack-spring-factories - generate-resources - - unpack - - - - - org.springframework.boot - spring-boot-autoconfigure - ${revision} - - ${project.build.directory}/auto-config/spring-boot-autoconfigure - - META-INF/spring.factories - - - org.springframework.boot - spring-boot-actuator-autoconfigure - ${revision} - - ${project.build.directory}/auto-config/spring-boot-actuator-autoconfigure - - META-INF/spring.factories - - - - - - unpack-starter-poms - generate-resources - - unpack - - - - - org.springframework.boot - spring-boot-starters - ${revision} - zip - starter-poms - ${project.build.directory}/external-resources/starter-poms - - - - - - unpack-test-slices - generate-resources - - unpack - - - - - org.springframework.boot - spring-boot-test-autoconfigure - ${revision} - - ${project.build.directory}/test-auto-config - - - - - - - - - org.apache.maven.plugins - maven-resources-plugin - - - copy-asciidoc-resources - generate-resources - - copy-resources - - - ${refdocs.build.directory} - - - src/main/asciidoc - false - - - - - - - - org.codehaus.mojo - xml-maven-plugin - 1.0.1 - - - transform-effective-pom - - transform - - - - - ${project.build.directory}/external-resources - - effective-pom.xml - - src/main/xslt/dependencyVersions.xsl - - - .adoc - - - ${project.build.directory}/generated-resources - - - - - - transform-flattened-pom - process-resources - - transform - - - - - ${project.basedir} - - .flattened-pom.xml - - src/main/xslt/versionProperties.xsl - - - .properties - - - ${project.build.directory}/generated-resources - - - - - - - - org.codehaus.gmavenplus - gmavenplus-plugin - - - - execute - - generate-resources - - - - - - - - - - - - - org.codehaus.groovy - groovy - ${groovy.version} - - - org.codehaus.groovy - groovy-ant - ${groovy.version} - - - org.springframework - spring-core - ${spring-framework.version} - - - - - org.codehaus.mojo - properties-maven-plugin - 1.0.0 - - - read-flattenedpom-versions - prepare-package - - read-project-properties - - false - - - ${project.build.directory}/generated-resources/.flattened-pom.properties - - - - - - - org.asciidoctor - asciidoctor-maven-plugin - - ${refdocs.build.directory} - - - ${refdocs.build.directory} - - **/*.*adoc - - - - - ${spring-boot-artifactory-repo} - ${github-tag} - ${project.basedir}/src - ${project.basedir}/src/main/asciidoc - ${project.basedir}/target/generated-resources - ${jetty.version} - ${jooq.version} - ${revision} - ${spring-amqp.version} - ${spring-batch.version} - ${flattenedpom.version.org.springframework.data.spring-data-couchbase} - ${flattenedpom.version.org.springframework.data.spring-data-commons} - ${flattenedpom.version.org.springframework.data.spring-data-jpa} - ${flattenedpom.version.org.springframework.data.spring-data-jdbc} - ${flattenedpom.version.org.springframework.data.spring-data-mongodb} - ${flattenedpom.version.org.springframework.data.spring-data-neo4j} - ${flattenedpom.version.org.springframework.data.spring-data-rest-core} - ${flattenedpom.version.org.springframework.data.spring-data-solr} - ${spring-framework.version} - ${spring-integration.version} - ${spring-security.version} - ${spring-ws.version} - - - - - io.spring.asciidoctor - spring-asciidoctor-extensions-spring-boot - ${spring-asciidoctor-extensions.version} - - - org.springframework.boot - spring-boot-actuator-autoconfigure - ${revision} - - - org.springframework.boot - spring-boot-autoconfigure - ${revision} - - - org.springframework.boot - spring-boot-devtools - ${revision} - - - - - generate-html-documentation - prepare-package - - process-asciidoc - - - html5 - - .adoc - .htmladoc - - ${project.build.directory}/generated-docs/reference/html - highlight.js - book - - js/highlight - github - true - ./images - font - css/ - spring.css - warn - - - false - - INFO - - - - - - generate-htmlsingle-documentation - prepare-package - - process-asciidoc - - - html5 - - .htmlsingleadoc - - ${project.build.directory}/generated-docs/reference/htmlsingle - highlight.js - book - - js/highlight - github - true - ./images - font - css/ - spring.css - - - false - - INFO - - - - - - generate-pdf-documentation - prepare-package - - process-asciidoc - - - pdf - - pdfadoc - - ${project.build.directory}/generated-docs/reference/pdf - - - ${refdocs.build.directory} - - **/* - - - - - - - - - org.apache.maven.plugins - maven-antrun-plugin - - - ant-contrib - ant-contrib - 1.0b3 - - - ant - ant - - - - - org.apache.ant - ant-nodeps - 1.8.1 - - - org.tigris.antelope - antelopetasks - 3.2.10 - - - - - package-and-attach-docs-zip - package - - run - - - - - - - - - - - - - setup-maven-properties - validate - - run - - - true - - - - - - - - - - - - - - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - attach-zip - - attach-artifact - - - - - ${project.build.directory}/${project.artifactId}-${project.version}.zip - zip - - - - - - - - - - - diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-application-properties.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-application-properties.adoc new file mode 100644 index 0000000000..723b3f609e --- /dev/null +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-application-properties.adoc @@ -0,0 +1,78 @@ +:numbered!: +[appendix] +[[common-application-properties]] += Common Application properties +include::attributes.adoc[] + +Various properties can be specified inside your `application.properties` file, inside your `application.yml` file, or as command line switches. +This appendix provides a list of common Spring Boot properties and references to the underlying classes that consume them. + +TIP: Spring Boot provides various conversion mechanism with advanced value formatting, make sure to review <>. + +NOTE: Property contributions can come from additional jar files on your classpath, so you should not consider this an exhaustive list. +Also, you can define your own properties. + + +== Core properties + +include::config-docs/core.adoc[] + +== Cache properties + +include::config-docs/cache.adoc[] + +== Mail properties + +include::config-docs/mail.adoc[] + +== JSON properties + +include::config-docs/json.adoc[] + +== Data properties + +include::config-docs/data.adoc[] + +== Transaction properties + +include::config-docs/transaction.adoc[] + +== Data migration properties + +include::config-docs/data-migration.adoc[] + +== Integration properties + +include::config-docs/integration.adoc[] + +== Web properties + +include::config-docs/web.adoc[] + +== Templating properties + +include::config-docs/templating.adoc[] + +== Server properties + +include::config-docs/server.adoc[] + +== Security properties + +include::config-docs/security.adoc[] + +== RSocket properties + +include::config-docs/rsocket.adoc[] + +== Actuator properties + +include::config-docs/actuator.adoc[] + +== Devtools properties + +include::config-docs/devtools.adoc[] + +== Testing properties + +include::config-docs/testing.adoc[] diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-auto-configuration-classes.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-auto-configuration-classes.adoc new file mode 100644 index 0000000000..a098131bea --- /dev/null +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-auto-configuration-classes.adoc @@ -0,0 +1,24 @@ +[appendix] +[[auto-configuration-classes]] += Auto-configuration Classes +include::attributes.adoc[] + +This appendix contains details of all of the auto-configuration classes provided by Spring Boot, with links to documentation and source code. +Remember to also look at the conditions report in your application for more details of which features are switched on. +(To do so, start the app with `--debug` or `-Ddebug` or, in an Actuator application, use the `conditions` endpoint). + + + +[[auto-configuration-classes-from-autoconfigure-module]] +== `spring-boot-autoconfigure` +The following auto-configuration classes are from the `spring-boot-autoconfigure` module: + +include::auto-configuration-classes/spring-boot-autoconfigure.adoc[] + + + +[[auto-configuration-classes-from-actuator]] +== `spring-boot-actuator-autoconfigure` +The following auto-configuration classes are from the `spring-boot-actuator-autoconfigure` module: + +include::auto-configuration-classes/spring-boot-actuator-autoconfigure.adoc[] diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-configuration-metadata.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-configuration-metadata.adoc new file mode 100644 index 0000000000..899c323cc7 --- /dev/null +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-configuration-metadata.adoc @@ -0,0 +1,860 @@ +[appendix] +[[configuration-metadata]] += Configuration Metadata +include::attributes.adoc[] + +Spring Boot jars include metadata files that provide details of all supported configuration properties. +The files are designed to let IDE developers offer contextual help and "`code completion`" as users are working with `application.properties` or `application.yml` files. + +The majority of the metadata file is generated automatically at compile time by processing all items annotated with `@ConfigurationProperties`. +However, it is possible to <> for corner cases or more advanced use cases. + + + +[[configuration-metadata-format]] +== Metadata Format +Configuration metadata files are located inside jars under `META-INF/spring-configuration-metadata.json`. +They use a simple JSON format with items categorized under either "`groups`" or "`properties`" and additional values hints categorized under "hints", as shown in the following example: + +[source,json,indent=0] +---- + {"groups": [ + { + "name": "server", + "type": "org.springframework.boot.autoconfigure.web.ServerProperties", + "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties" + }, + { + "name": "spring.jpa.hibernate", + "type": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate", + "sourceType": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties", + "sourceMethod": "getHibernate()" + } + ... + ],"properties": [ + { + "name": "server.port", + "type": "java.lang.Integer", + "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties" + }, + { + "name": "server.address", + "type": "java.net.InetAddress", + "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties" + }, + { + "name": "spring.jpa.hibernate.ddl-auto", + "type": "java.lang.String", + "description": "DDL mode. This is actually a shortcut for the \"hibernate.hbm2ddl.auto\" property.", + "sourceType": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate" + } + ... + ],"hints": [ + { + "name": "spring.jpa.hibernate.ddl-auto", + "values": [ + { + "value": "none", + "description": "Disable DDL handling." + }, + { + "value": "validate", + "description": "Validate the schema, make no changes to the database." + }, + { + "value": "update", + "description": "Update the schema if necessary." + }, + { + "value": "create", + "description": "Create the schema and destroy previous data." + }, + { + "value": "create-drop", + "description": "Create and then destroy the schema at the end of the session." + } + ] + } + ]} +---- + +Each "`property`" is a configuration item that the user specifies with a given value. +For example, `server.port` and `server.address` might be specified in `application.properties`, as follows: + +[source,properties,indent=0,configprops] +---- + server.port=9090 + server.address=127.0.0.1 +---- + +The "`groups`" are higher level items that do not themselves specify a value but instead provide a contextual grouping for properties. +For example, the `server.port` and `server.address` properties are part of the `server` group. + +NOTE: It is not required that every "`property`" has a "`group`". +Some properties might exist in their own right. + +Finally, "`hints`" are additional information used to assist the user in configuring a given property. +For example, when a developer is configuring the configprop:spring.jpa.hibernate.ddl-auto[] property, a tool can use the hints to offer some auto-completion help for the `none`, `validate`, `update`, `create`, and `create-drop` values. + + + +[[configuration-metadata-group-attributes]] +=== Group Attributes +The JSON object contained in the `groups` array can contain the attributes shown in the following table: + +[cols="1,1,4"] +|=== +| Name | Type | Purpose + +| `name` +| String +| The full name of the group. + This attribute is mandatory. + +| `type` +| String +| The class name of the data type of the group. + For example, if the group were based on a class annotated with `@ConfigurationProperties`, the attribute would contain the fully qualified name of that class. + If it were based on a `@Bean` method, it would be the return type of that method. + If the type is not known, the attribute may be omitted. + +| `description` +| String +| A short description of the group that can be displayed to users. + If no description is available, it may be omitted. + It is recommended that descriptions be short paragraphs, with the first line providing a concise summary. + The last line in the description should end with a period (`.`). + +| `sourceType` +| String +| The class name of the source that contributed this group. + For example, if the group were based on a `@Bean` method annotated with `@ConfigurationProperties`, this attribute would contain the fully qualified name of the `@Configuration` class that contains the method. + If the source type is not known, the attribute may be omitted. + +| `sourceMethod` +| String +| The full name of the method (include parenthesis and argument types) that contributed this group (for example, the name of a `@ConfigurationProperties` annotated `@Bean` method). + If the source method is not known, it may be omitted. +|=== + + + +[[configuration-metadata-property-attributes]] +=== Property Attributes +The JSON object contained in the `properties` array can contain the attributes described in the following table: + +[cols="1,1,4"] +|=== +| Name | Type | Purpose + +| `name` +| String +| The full name of the property. + Names are in lower-case period-separated form (for example, `server.address`). + This attribute is mandatory. + +| `type` +| String +| The full signature of the data type of the property (for example, `java.lang.String`) but also a full generic type (such as `java.util.Map`). + You can use this attribute to guide the user as to the types of values that they can enter. + For consistency, the type of a primitive is specified by using its wrapper counterpart (for example, `boolean` becomes `java.lang.Boolean`). + Note that this class may be a complex type that gets converted from a `String` as values are bound. + If the type is not known, it may be omitted. + +| `description` +| String +| A short description of the property that can be displayed to users. + If no description is available, it may be omitted. + It is recommended that descriptions be short paragraphs, with the first line providing a concise summary. + The last line in the description should end with a period (`.`). + +| `sourceType` +| String +| The class name of the source that contributed this property. + For example, if the property were from a class annotated with `@ConfigurationProperties`, this attribute would contain the fully qualified name of that class. + If the source type is unknown, it may be omitted. + +| `defaultValue` +| Object +| The default value, which is used if the property is not specified. + If the type of the property is an array, it can be an array of value(s). + If the default value is unknown, it may be omitted. + +| `deprecation` +| Deprecation +| Specify whether the property is deprecated. + If the field is not deprecated or if that information is not known, it may be omitted. + The next table offers more detail about the `deprecation` attribute. +|=== + +The JSON object contained in the `deprecation` attribute of each `properties` element can contain the following attributes: + +[cols="1,1,4"] +|=== +| Name | Type | Purpose + +| `level` +| String +| The level of deprecation, which can be either `warning` (the default) or `error`. + When a property has a `warning` deprecation level, it should still be bound in the environment. + However, when it has an `error` deprecation level, the property is no longer managed and is not bound. + +| `reason` +| String +| A short description of the reason why the property was deprecated. + If no reason is available, it may be omitted. + It is recommended that descriptions be short paragraphs, with the first line providing a concise summary. + The last line in the description should end with a period (`.`). + +| `replacement` +| String +| The full name of the property that _replaces_ this deprecated property. + If there is no replacement for this property, it may be omitted. +|=== + +NOTE: Prior to Spring Boot 1.3, a single `deprecated` boolean attribute can be used instead of the `deprecation` element. +This is still supported in a deprecated fashion and should no longer be used. +If no reason and replacement are available, an empty `deprecation` object should be set. + +Deprecation can also be specified declaratively in code by adding the `@DeprecatedConfigurationProperty` annotation to the getter exposing the deprecated property. +For instance, assume that the `app.acme.target` property was confusing and was renamed to `app.acme.name`. +The following example shows how to handle that situation: + +[source,java,indent=0] +---- + @ConfigurationProperties("app.acme") + public class AcmeProperties { + + private String name; + + public String getName() { ... } + + public void setName(String name) { ... } + + @DeprecatedConfigurationProperty(replacement = "app.acme.name") + @Deprecated + public String getTarget() { + return getName(); + } + + @Deprecated + public void setTarget(String target) { + setName(target); + } + } +---- + +NOTE: There is no way to set a `level`. +`warning` is always assumed, since code is still handling the property. + +The preceding code makes sure that the deprecated property still works (delegating to the `name` property behind the scenes). +Once the `getTarget` and `setTarget` methods can be removed from your public API, the automatic deprecation hint in the metadata goes away as well. +If you want to keep a hint, adding manual metadata with an `error` deprecation level ensures that users are still informed about that property. +Doing so is particularly useful when a `replacement` is provided. + + + +[[configuration-metadata-hints-attributes]] +=== Hint Attributes +The JSON object contained in the `hints` array can contain the attributes shown in the following table: + +[cols="1,1,4"] +|=== +| Name | Type | Purpose + +| `name` +| String +| The full name of the property to which this hint refers. + Names are in lower-case period-separated form (such as `spring.mvc.servlet.path`). + If the property refers to a map (such as `system.contexts`), the hint either applies to the _keys_ of the map (`system.contexts.keys`) or the _values_ (`system.contexts.values`) of the map. + This attribute is mandatory. + +| `values` +| ValueHint[] +| A list of valid values as defined by the `ValueHint` object (described in the next table). + Each entry defines the value and may have a description. + +| `providers` +| ValueProvider[] +| A list of providers as defined by the `ValueProvider` object (described later in this document). + Each entry defines the name of the provider and its parameters, if any. +|=== + +The JSON object contained in the `values` attribute of each `hint` element can contain the attributes described in the following table: + +[cols="1,1,4"] +|=== +| Name | Type | Purpose + +| `value` +| Object +| A valid value for the element to which the hint refers. + If the type of the property is an array, it can also be an array of value(s). + This attribute is mandatory. + +| `description` +| String +| A short description of the value that can be displayed to users. + If no description is available, it may be omitted. + It is recommended that descriptions be short paragraphs, with the first line providing a concise summary. + The last line in the description should end with a period (`.`). +|=== + +The JSON object contained in the `providers` attribute of each `hint` element can contain the attributes described in the following table: + +[cols="1,1,4"] +|=== +|Name | Type |Purpose + +| `name` +| String +| The name of the provider to use to offer additional content assistance for the element to which the hint refers. + +| `parameters` +| JSON object +| Any additional parameter that the provider supports (check the documentation of the provider for more details). +|=== + + + +[[configuration-metadata-repeated-items]] +=== Repeated Metadata Items +Objects with the same "`property`" and "`group`" name can appear multiple times within a metadata file. +For example, you could bind two separate classes to the same prefix, with each having potentially overlapping property names. +While the same names appearing in the metadata multiple times should not be common, consumers of metadata should take care to ensure that they support it. + + + +[[configuration-metadata-providing-manual-hints]] +== Providing Manual Hints +To improve the user experience and further assist the user in configuring a given property, you can provide additional metadata that: + +* Describes the list of potential values for a property. +* Associates a provider, to attach a well defined semantic to a property, so that a tool can discover the list of potential values based on the project's context. + + +=== Value Hint +The `name` attribute of each hint refers to the `name` of a property. +In the <>, we provide five values for the `spring.jpa.hibernate.ddl-auto` property: `none`, `validate`, `update`, `create`, and `create-drop`. +Each value may have a description as well. + +If your property is of type `Map`, you can provide hints for both the keys and the values (but not for the map itself). +The special `.keys` and `.values` suffixes must refer to the keys and the values, respectively. + +Assume a `sample.contexts` maps magic `String` values to an integer, as shown in the following example: + +[source,java,indent=0] +---- + @ConfigurationProperties("sample") + public class SampleProperties { + + private Map contexts; + // getters and setters + } +---- + +The magic values are (in this example) are `sample1` and `sample2`. +In order to offer additional content assistance for the keys, you could add the following JSON to <>: + +[source,json,indent=0] +---- + {"hints": [ + { + "name": "sample.contexts.keys", + "values": [ + { + "value": "sample1" + }, + { + "value": "sample2" + } + ] + } + ]} +---- + +TIP: We recommend that you use an `Enum` for those two values instead. +If your IDE supports it, this is by far the most effective approach to auto-completion. + + + +=== Value Providers +Providers are a powerful way to attach semantics to a property. +In this section, we define the official providers that you can use for your own hints. +However, your favorite IDE may implement some of these or none of them. +Also, it could eventually provide its own. + +NOTE: As this is a new feature, IDE vendors must catch up with how it works. +Adoption times naturally vary. + +The following table summarizes the list of supported providers: + +[cols="2,4"] +|=== +| Name | Description + +| `any` +| Permits any additional value to be provided. + +| `class-reference` +| Auto-completes the classes available in the project. + Usually constrained by a base class that is specified by the `target` parameter. + +| `handle-as` +| Handles the property as if it were defined by the type defined by the mandatory `target` parameter. + +| `logger-name` +| Auto-completes valid logger names and <>. + Typically, package and class names available in the current project can be auto-completed as well as defined groups. + +| `spring-bean-reference` +| Auto-completes the available bean names in the current project. + Usually constrained by a base class that is specified by the `target` parameter. + +| `spring-profile-name` +| Auto-completes the available Spring profile names in the project. +|=== + +TIP: Only one provider can be active for a given property, but you can specify several providers if they can all manage the property _in some way_. +Make sure to place the most powerful provider first, as the IDE must use the first one in the JSON section that it can handle. +If no provider for a given property is supported, no special content assistance is provided, either. + + + +==== Any +The special **any** provider value permits any additional values to be provided. +Regular value validation based on the property type should be applied if this is supported. + +This provider is typically used if you have a list of values and any extra values should still be considered as valid. + +The following example offers `on` and `off` as auto-completion values for `system.state`: + +[source,json,indent=0] +---- + {"hints": [ + { + "name": "system.state", + "values": [ + { + "value": "on" + }, + { + "value": "off" + } + ], + "providers": [ + { + "name": "any" + } + ] + } + ]} +---- + +Note that, in the preceding example, any other value is also allowed. + +==== Class Reference +The **class-reference** provider auto-completes classes available in the project. +This provider supports the following parameters: + +[cols="1,1,2,4"] +|=== +| Parameter | Type | Default value | Description + +| `target` +| `String` (`Class`) +| _none_ +| The fully qualified name of the class that should be assignable to the chosen value. + Typically used to filter out-non candidate classes. + Note that this information can be provided by the type itself by exposing a class with the appropriate upper bound. + +| `concrete` +| `boolean` +| true +| Specify whether only concrete classes are to be considered as valid candidates. +|=== + + +The following metadata snippet corresponds to the standard `server.servlet.jsp.class-name` property that defines the `JspServlet` class name to use: + +[source,json,indent=0] +---- + {"hints": [ + { + "name": "server.servlet.jsp.class-name", + "providers": [ + { + "name": "class-reference", + "parameters": { + "target": "javax.servlet.http.HttpServlet" + } + } + ] + } + ]} +---- + + + +==== Handle As +The **handle-as** provider lets you substitute the type of the property to a more high-level type. +This typically happens when the property has a `java.lang.String` type, because you do not want your configuration classes to rely on classes that may not be on the classpath. +This provider supports the following parameters: + +[cols="1,1,2,4"] +|=== +| Parameter | Type | Default value | Description + +| **`target`** +| `String` (`Class`) +| _none_ +| The fully qualified name of the type to consider for the property. + This parameter is mandatory. +|=== + +The following types can be used: + +* Any `java.lang.Enum`: Lists the possible values for the property. + (We recommend defining the property with the `Enum` type, as no further hint should be required for the IDE to auto-complete the values) +* `java.nio.charset.Charset`: Supports auto-completion of charset/encoding values (such as `UTF-8`) +* `java.util.Locale`: auto-completion of locales (such as `en_US`) +* `org.springframework.util.MimeType`: Supports auto-completion of content type values (such as `text/plain`) +* `org.springframework.core.io.Resource`: Supports auto-completion of Spring’s Resource abstraction to refer to a file on the filesystem or on the classpath (such as `classpath:/sample.properties`) + +TIP: If multiple values can be provided, use a `Collection` or _Array_ type to teach the IDE about it. + +The following metadata snippet corresponds to the standard `spring.liquibase.change-log` property that defines the path to the changelog to use. +It is actually used internally as a `org.springframework.core.io.Resource` but cannot be exposed as such, because we need to keep the original String value to pass it to the Liquibase API. + +[source,json,indent=0] +---- + {"hints": [ + { + "name": "spring.liquibase.change-log", + "providers": [ + { + "name": "handle-as", + "parameters": { + "target": "org.springframework.core.io.Resource" + } + } + ] + } + ]} +---- + + + +==== Logger Name +The **logger-name** provider auto-completes valid logger names and <>. +Typically, package and class names available in the current project can be auto-completed. +If groups are enabled (default) and if a custom logger group is identified in the configuration, auto-completion for it should be provided. +Specific frameworks may have extra magic logger names that can be supported as well. + +This provider supports the following parameters: + +[cols="1,1,2,4"] +|=== +| Parameter | Type | Default value | Description + +| `group` +| `boolean` +| `true` +| Specify whether known groups should be considered. +|=== + +Since a logger name can be any arbitrary name, this provider should allow any value but could highlight valid package and class names that are not available in the project's classpath. + +The following metadata snippet corresponds to the standard `logging.level` property. +Keys are _logger names_, and values correspond to the standard log levels or any custom level. +As Spring Boot defines a few logger groups out-of-the-box, dedicated value hints have been added for those. + +[source,json,indent=0] +---- + {"hints": [ + { + "name": "logging.level.keys", + "values": [ + { + "value": "root", + "description": "Root logger used to assign the default logging level." + }, + { + "value": "sql", + "description": "SQL logging group including Hibernate SQL logger." + }, + { + "value": "web", + "description": "Web logging group including codecs." + } + ], + "providers": [ + { + "name": "logger-name" + } + ] + }, + { + "name": "logging.level.values", + "values": [ + { + "value": "trace" + }, + { + "value": "debug" + }, + { + "value": "info" + }, + { + "value": "warn" + }, + { + "value": "error" + }, + { + "value": "fatal" + }, + { + "value": "off" + } + + ], + "providers": [ + { + "name": "any" + } + ] + } + ]} +---- + + + +==== Spring Bean Reference +The **spring-bean-reference** provider auto-completes the beans that are defined in the configuration of the current project. +This provider supports the following parameters: + +[cols="1,1,2,4"] +|=== +| Parameter | Type | Default value | Description + +| `target` +| `String` (`Class`) +| _none_ +| The fully qualified name of the bean class that should be assignable to the candidate. + Typically used to filter out non-candidate beans. +|=== + +The following metadata snippet corresponds to the standard `spring.jmx.server` property that defines the name of the `MBeanServer` bean to use: + +[source,json,indent=0] +---- + {"hints": [ + { + "name": "spring.jmx.server", + "providers": [ + { + "name": "spring-bean-reference", + "parameters": { + "target": "javax.management.MBeanServer" + } + } + ] + } + ]} +---- + +NOTE: The binder is not aware of the metadata. +If you provide that hint, you still need to transform the bean name into an actual Bean reference using by the `ApplicationContext`. + + + +==== Spring Profile Name +The **spring-profile-name** provider auto-completes the Spring profiles that are defined in the configuration of the current project. + +The following metadata snippet corresponds to the standard `spring.profiles.active` property that defines the name of the Spring profile(s) to enable: + +[source,json,indent=0] +---- + {"hints": [ + { + "name": "spring.profiles.active", + "providers": [ + { + "name": "spring-profile-name" + } + ] + } + ]} +---- + + + +[[configuration-metadata-annotation-processor]] +== Generating Your Own Metadata by Using the Annotation Processor +You can easily generate your own configuration metadata file from items annotated with `@ConfigurationProperties` by using the `spring-boot-configuration-processor` jar. +The jar includes a Java annotation processor which is invoked as your project is compiled. +To use the processor, include a dependency on `spring-boot-configuration-processor`. + +With Maven the dependency should be declared as optional, as shown in the following example: + +[source,xml,indent=0,subs="verbatim,quotes,attributes"] +---- + + org.springframework.boot + spring-boot-configuration-processor + true + +---- + +With Gradle 4.5 and earlier, the dependency should be declared in the `compileOnly` configuration, as shown in the following example: + +[source,groovy,indent=0,subs="verbatim,quotes,attributes"] +---- + dependencies { + compileOnly "org.springframework.boot:spring-boot-configuration-processor" + } +---- + +With Gradle 4.6 and later, the dependency should be declared in the `annotationProcessor` configuration, as shown in the following example: + +[source,groovy,indent=0,subs="verbatim,quotes,attributes"] +---- + dependencies { + annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" + } +---- + +If you are using an `additional-spring-configuration-metadata.json` file, the `compileJava` task should be configured to depend on the `processResources` task, as shown in the following example: + +[source,groovy,indent=0,subs="verbatim,quotes,attributes"] +---- + compileJava.dependsOn(processResources) +---- + +This dependency ensures that the additional metadata is available when the annotation processor runs during compilation. + +The processor picks up both classes and methods that are annotated with `@ConfigurationProperties`. +The Javadoc for field values within configuration classes is used to populate the `description` attribute. + +NOTE: You should only use simple text with `@ConfigurationProperties` field Javadoc, since they are not processed before being added to the JSON. + +If the class has a single constructor with at least one parameters, one property is created per constructor parameter. +Otherwise, properties are discovered through the presence of standard getters and setters with special handling for collection types (that is detected even if only a getter is present). + +The annotation processor also supports the use of the `@Data`, `@Getter`, and `@Setter` lombok annotations. + +The annotation processor cannot auto-detect default values for ``Enum``s and ``Collections``s. +In the cases where a `Collection` or `Enum` property has a non-empty default value, <> should be provided. + +Consider the following class: + +[source,java,indent=0,subs="verbatim,quotes,attributes"] +---- + @ConfigurationProperties(prefix = "acme.messaging") + public class MessagingProperties { + + private List addresses = new ArrayList<>(Arrays.asList("a", "b")); + + private ContainerType containerType = ContainerType.SIMPLE; + + // ... getter and setters + + public enum ContainerType { + + SIMPLE, + DIRECT + + } + + } +---- + +In order to document default values for properties in the class above, you could add the following content to <>: + +[source,json,indent=0] +---- + {"properties": [ + { + "name": "acme.messaging.addresses", + "defaultValue": ["a", "b"] + }, + { + "name": "acme.messaging.container-type", + "defaultValue": "simple" + } + ]} +---- + +Only the `name` of the property is required to document additional fields with manual metadata. + +[NOTE] +==== +If you are using AspectJ in your project, you need to make sure that the annotation processor runs only once. +There are several ways to do this. +With Maven, you can configure the `maven-apt-plugin` explicitly and add the dependency to the annotation processor only there. +You could also let the AspectJ plugin run all the processing and disable annotation processing in the `maven-compiler-plugin` configuration, as follows: + +[source,xml,indent=0,subs="verbatim,quotes,attributes"] +---- + + org.apache.maven.plugins + maven-compiler-plugin + + none + + +---- +==== + + + +[[configuration-metadata-nested-properties]] +=== Nested Properties +The annotation processor automatically considers inner classes as nested properties. +Consider the following class: + +[source,java,indent=0,subs="verbatim,quotes,attributes"] +---- + @ConfigurationProperties(prefix="server") + public class ServerProperties { + + private String name; + + private Host host; + + // ... getter and setters + + public static class Host { + + private String ip; + + private int port; + + // ... getter and setters + + } + + } +---- + +The preceding example produces metadata information for `server.name`, `server.host.ip`, and `server.host.port` properties. +You can use the `@NestedConfigurationProperty` annotation on a field to indicate that a regular (non-inner) class should be treated as if it were nested. + +TIP: This has no effect on collections and maps, as those types are automatically identified, and a single metadata property is generated for each of them. + + + +[[configuration-metadata-additional-metadata]] +=== Adding Additional Metadata +Spring Boot's configuration file handling is quite flexible, and it is often the case that properties may exist that are not bound to a `@ConfigurationProperties` bean. +You may also need to tune some attributes of an existing key. +To support such cases and let you provide custom "hints", the annotation processor automatically merges items from `META-INF/additional-spring-configuration-metadata.json` into the main metadata file. + +If you refer to a property that has been detected automatically, the description, default value, and deprecation information are overridden, if specified. +If the manual property declaration is not identified in the current module, it is added as a new property. + +The format of the `additional-spring-configuration-metadata.json` file is exactly the same as the regular `spring-configuration-metadata.json`. +The additional properties file is optional. +If you do not have any additional properties, do not add the file. diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-dependency-versions.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-dependency-versions.adoc new file mode 100644 index 0000000000..e5049c86dc --- /dev/null +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-dependency-versions.adoc @@ -0,0 +1,14 @@ +[appendix] +[[dependency-versions]] += Dependency versions +include::attributes.adoc[] + +This appendix provides details of the dependencies that are managed by Spring Boot. + +[[dependency-versions-coordinates]] +== Managed Dependency Coordinates + +The following table provides details of all of the dependency versions that are provided by Spring Boot in its CLI (Command Line Interface), Maven dependency management, and Gradle plugin. +When you declare a dependency on one of these artifacts without declaring a version, the version listed in the table is used. + +include::dependency-versions.adoc[] diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-executable-jar-format.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-executable-jar-format.adoc new file mode 100644 index 0000000000..dda383d71e --- /dev/null +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-executable-jar-format.adoc @@ -0,0 +1,281 @@ +[appendix] +[[executable-jar]] += The Executable Jar Format +include::attributes.adoc[] + +The `spring-boot-loader` modules lets Spring Boot support executable jar and war files. +If you use the Maven plugin or the Gradle plugin, executable jars are automatically generated, and you generally do not need to know the details of how they work. + +If you need to create executable jars from a different build system or if you are just curious about the underlying technology, this appendix provides some background. + + + +[[executable-jar-nested-jars]] +== Nested JARs +Java does not provide any standard way to load nested jar files (that is, jar files that are themselves contained within a jar). +This can be problematic if you need to distribute a self-contained application that can be run from the command line without unpacking. + +To solve this problem, many developers use "`shaded`" jars. +A shaded jar packages all classes, from all jars, into a single "`uber jar`". +The problem with shaded jars is that it becomes hard to see which libraries are actually in your application. +It can also be problematic if the same filename is used (but with different content) in multiple jars. +Spring Boot takes a different approach and lets you actually nest jars directly. + + + +[[executable-jar-jar-file-structure]] +=== The Executable Jar File Structure +Spring Boot Loader-compatible jar files should be structured in the following way: + +[indent=0] +---- + example.jar + | + +-META-INF + | +-MANIFEST.MF + +-org + | +-springframework + | +-boot + | +-loader + | +- + +-BOOT-INF + +-classes + | +-mycompany + | +-project + | +-YourClasses.class + +-lib + +-dependency1.jar + +-dependency2.jar +---- + +Application classes should be placed in a nested `BOOT-INF/classes` directory. +Dependencies should be placed in a nested `BOOT-INF/lib` directory. + + + +[[executable-jar-war-file-structure]] +=== The Executable War File Structure +Spring Boot Loader-compatible war files should be structured in the following way: + +[indent=0] +---- + example.war + | + +-META-INF + | +-MANIFEST.MF + +-org + | +-springframework + | +-boot + | +-loader + | +- + +-WEB-INF + +-classes + | +-com + | +-mycompany + | +-project + | +-YourClasses.class + +-lib + | +-dependency1.jar + | +-dependency2.jar + +-lib-provided + +-servlet-api.jar + +-dependency3.jar +---- + +Dependencies should be placed in a nested `WEB-INF/lib` directory. +Any dependencies that are required when running embedded but are not required when deploying to a traditional web container should be placed in `WEB-INF/lib-provided`. + + + +[[executable-jar-jarfile]] +== Spring Boot's "`JarFile`" Class +The core class used to support loading nested jars is `org.springframework.boot.loader.jar.JarFile`. +It lets you load jar content from a standard jar file or from nested child jar data. +When first loaded, the location of each `JarEntry` is mapped to a physical file offset of the outer jar, as shown in the following example: + +[indent=0] +---- + myapp.jar + +-------------------+-------------------------+ + | /BOOT-INF/classes | /BOOT-INF/lib/mylib.jar | + |+-----------------+||+-----------+----------+| + || A.class ||| B.class | C.class || + |+-----------------+||+-----------+----------+| + +-------------------+-------------------------+ + ^ ^ ^ + 0063 3452 3980 +---- + +The preceding example shows how `A.class` can be found in `/BOOT-INF/classes` in `myapp.jar` at position `0063`. +`B.class` from the nested jar can actually be found in `myapp.jar` at position `3452`, and `C.class` is at position `3980`. + +Armed with this information, we can load specific nested entries by seeking to the appropriate part of the outer jar. +We do not need to unpack the archive, and we do not need to read all entry data into memory. + + + +[[executable-jar-jarfile-compatibility]] +=== Compatibility with the Standard Java "`JarFile`" +Spring Boot Loader strives to remain compatible with existing code and libraries. +`org.springframework.boot.loader.jar.JarFile` extends from `java.util.jar.JarFile` and should work as a drop-in replacement. +The `getURL()` method returns a `URL` that opens a connection compatible with `java.net.JarURLConnection` and can be used with Java's `URLClassLoader`. + + + +[[executable-jar-launching]] +== Launching Executable Jars +The `org.springframework.boot.loader.Launcher` class is a special bootstrap class that is used as an executable jar's main entry point. +It is the actual `Main-Class` in your jar file, and it is used to setup an appropriate `URLClassLoader` and ultimately call your `main()` method. + +There are three launcher subclasses (`JarLauncher`, `WarLauncher`, and `PropertiesLauncher`). +Their purpose is to load resources (`.class` files and so on) from nested jar files or war files in directories (as opposed to those explicitly on the classpath). +In the case of `JarLauncher` and `WarLauncher`, the nested paths are fixed. +`JarLauncher` looks in `BOOT-INF/lib/`, and `WarLauncher` looks in `WEB-INF/lib/` and `WEB-INF/lib-provided/`. +You can add extra jars in those locations if you want more. +The `PropertiesLauncher` looks in `BOOT-INF/lib/` in your application archive by default. +You can add additional locations by setting an environment variable called `LOADER_PATH` or `loader.path` in `loader.properties` (which is a comma-separated list of directories, archives, or directories within archives). + + + +[[executable-jar-launcher-manifest]] +=== Launcher Manifest +You need to specify an appropriate `Launcher` as the `Main-Class` attribute of `META-INF/MANIFEST.MF`. +The actual class that you want to launch (that is, the class that contains a `main` method) should be specified in the `Start-Class` attribute. + +The following example shows a typical `MANIFEST.MF` for an executable jar file: + +[indent=0] +---- + Main-Class: org.springframework.boot.loader.JarLauncher + Start-Class: com.mycompany.project.MyApplication +---- + +For a war file, it would be as follows: + +[indent=0] +---- + Main-Class: org.springframework.boot.loader.WarLauncher + Start-Class: com.mycompany.project.MyApplication +---- + +NOTE: You need not specify `Class-Path` entries in your manifest file. +The classpath is deduced from the nested jars. + + + +[[executable-jar-property-launcher-features]] +== `PropertiesLauncher` Features +`PropertiesLauncher` has a few special features that can be enabled with external properties (System properties, environment variables, manifest entries, or `loader.properties`). +The following table describes these properties: + +|=== +| Key | Purpose + +| `loader.path` +| Comma-separated Classpath, such as `lib,$\{HOME}/app/lib`. + Earlier entries take precedence, like a regular `-classpath` on the `javac` command line. + +| `loader.home` +| Used to resolve relative paths in `loader.path`. + For example, given `loader.path=lib`, then `${loader.home}/lib` is a classpath location (along with all jar files in that directory). + This property is also used to locate a `loader.properties` file, as in the following example `file:///opt/app` It defaults to `${user.dir}`. + +| `loader.args` +| Default arguments for the main method (space separated). + +| `loader.main` +| Name of main class to launch (for example, `com.app.Application`). + +| `loader.config.name` +| Name of properties file (for example, `launcher`). + It defaults to `loader`. + +| `loader.config.location` +| Path to properties file (for example, `classpath:loader.properties`). + It defaults to `loader.properties`. + +| `loader.system` +| Boolean flag to indicate that all properties should be added to System properties. + It defaults to `false`. +|=== + +When specified as environment variables or manifest entries, the following names should be used: + +|=== +| Key | Manifest entry | Environment variable + +| `loader.path` +| `Loader-Path` +| `LOADER_PATH` + +| `loader.home` +| `Loader-Home` +| `LOADER_HOME` + +| `loader.args` +| `Loader-Args` +| `LOADER_ARGS` + +| `loader.main` +| `Start-Class` +| `LOADER_MAIN` + +| `loader.config.location` +| `Loader-Config-Location` +| `LOADER_CONFIG_LOCATION` + +| `loader.system` +| `Loader-System` +| `LOADER_SYSTEM` +|=== + +TIP: Build plugins automatically move the `Main-Class` attribute to `Start-Class` when the fat jar is built. +If you use that, specify the name of the class to launch by using the `Main-Class` attribute and leaving out `Start-Class`. + +The following rules apply to working with `PropertiesLauncher`: + +* `loader.properties` is searched for in `loader.home`, then in the root of the classpath, and then in `classpath:/BOOT-INF/classes`. + The first location where a file with that name exists is used. +* `loader.home` is the directory location of an additional properties file (overriding the default) only when `loader.config.location` is not specified. +* `loader.path` can contain directories (which are scanned recursively for jar and zip files), archive paths, a directory within an archive that is scanned for jar files (for example, `dependencies.jar!/lib`), or wildcard patterns (for the default JVM behavior). + Archive paths can be relative to `loader.home` or anywhere in the file system with a `jar:file:` prefix. +* `loader.path` (if empty) defaults to `BOOT-INF/lib` (meaning a local directory or a nested one if running from an archive). + Because of this, `PropertiesLauncher` behaves the same as `JarLauncher` when no additional configuration is provided. +* `loader.path` can not be used to configure the location of `loader.properties` (the classpath used to search for the latter is the JVM classpath when `PropertiesLauncher` is launched). +* Placeholder replacement is done from System and environment variables plus the properties file itself on all values before use. +* The search order for properties (where it makes sense to look in more than one place) is environment variables, system properties, `loader.properties`, the exploded archive manifest, and the archive manifest. + + + +[[executable-jar-restrictions]] +== Executable Jar Restrictions +You need to consider the following restrictions when working with a Spring Boot Loader packaged application: + + + +[[executable-jar-zip-entry-compression]] +* Zip entry compression: +The `ZipEntry` for a nested jar must be saved by using the `ZipEntry.STORED` method. +This is required so that we can seek directly to individual content within the nested jar. +The content of the nested jar file itself can still be compressed, as can any other entries in the outer jar. + + + +[[executable-jar-system-classloader]] +* System classLoader: +Launched applications should use `Thread.getContextClassLoader()` when loading classes (most libraries and frameworks do so by default). +Trying to load nested jar classes with `ClassLoader.getSystemClassLoader()` fails. +`java.util.Logging` always uses the system classloader. +For this reason, you should consider a different logging implementation. + + + +[[executable-jar-alternatives]] +== Alternative Single Jar Solutions +If the preceding restrictions mean that you cannot use Spring Boot Loader, consider the following alternatives: + +* https://maven.apache.org/plugins/maven-shade-plugin/[Maven Shade Plugin] +* http://www.jdotsoft.com/JarClassLoader.php[JarClassLoader] +* https://sourceforge.net/projects/one-jar/[OneJar] +* https://imperceptiblethoughts.com/shadow/[Gradle Shadow Plugin] + diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-test-auto-configuration.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-test-auto-configuration.adoc new file mode 100644 index 0000000000..dc33154eae --- /dev/null +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/appendix-test-auto-configuration.adoc @@ -0,0 +1,13 @@ +[appendix] +[[test-auto-configuration]] += Test Auto-configuration Annotations +include::attributes.adoc[] + +This appendix describes the `@…Test` auto-configuration annotations that Spring Boot provides to test slices of your application. + +[[test-auto-configuration-slices]] +== Test Slices + +The following table lists the various `@…Test` annotations that can be used to test slices of your application and the auto-configuration that they import by default: + +include::test-slice-auto-configuration.adoc[] diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/attributes.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/attributes.adoc new file mode 100644 index 0000000000..fb0f1f30ef --- /dev/null +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/attributes.adoc @@ -0,0 +1,108 @@ +:doctype: book +:idprefix: +:idseparator: - +:toc: left +:toclevels: 4 +:tabsize: 4 +:numbered: +:sectanchors: +:sectnums: +:icons: font +:hide-uri-scheme: +:docinfo: shared,private + +:spring-boot-artifactory-repo: snapshot +:github-tag: master +:spring-boot-version: current + +:github-repo: spring-projects/spring-boot +:github-raw: https://raw.githubusercontent.com/{github-repo}/{github-tag} +:github-issues: https://github.com/{github-repo}/issues/ +:github-wiki: https://github.com/{github-repo}/wiki + +:code-examples: ../main/java/org/springframework/boot/docs +:test-examples: ../test/java/org/springframework/boot/docs + +:spring-boot-code: https://github.com/{github-repo}/tree/{github-tag} +:spring-boot-api: https://docs.spring.io/spring-boot/docs/{spring-boot-version}/api/ +:spring-boot-docs: https://docs.spring.io/spring-boot/docs/{spring-boot-version}/reference +:spring-boot-master-code: https://github.com/{github-repo}/tree/master +:spring-boot-current-docs: https://docs.spring.io/spring-boot/docs/current/reference +:spring-boot-actuator-restapi: https://docs.spring.io/spring-boot/docs/{spring-boot-version}/actuator-api/ +:spring-boot-maven-plugin-docs: https://docs.spring.io/spring-boot/docs/{spring-boot-version}/maven-plugin/html/ +:spring-boot-gradle-plugin-docs: https://docs.spring.io/spring-boot/docs/{spring-boot-version}/gradle-plugin/reference/html/ +:spring-boot-gradle-plugin-pdfdocs: https://docs.spring.io/spring-boot/docs/{spring-boot-version}/gradle-plugin/reference/pdf/spring-boot-gradle-plugin-reference.pdf +:spring-boot-gradle-plugin-api: https://docs.spring.io/spring-boot/docs/{spring-boot-version}/gradle-plugin/reference/api/ + +:spring-boot-module-code: {spring-boot-code}/spring-boot-project/spring-boot/src/main/java/org/springframework/boot +:spring-boot-module-api: {spring-boot-api}/org/springframework/boot +:spring-boot-autoconfigure-module-code: {spring-boot-code}/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure +:spring-boot-autoconfigure-module-api: {spring-boot-api}/org/springframework/boot/autoconfigure +:spring-boot-actuator-module-code: {spring-boot-code}/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate +:spring-boot-actuator-module-api: {spring-boot-api}/org/springframework/boot/actuate +:spring-boot-actuator-autoconfigure-module-code: {spring-boot-code}/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure +:spring-boot-actuator-autoconfigure-module-api: : {spring-boot-api}/org/springframework/boot/actuate/autoconfigure +:spring-boot-cli-module-code: {spring-boot-code}/spring-boot-project/spring-boot-cli/src/main/java/org/springframework/boot/cli +:spring-boot-cli-module-api: {spring-boot-api}/org/springframework/boot/cli +:spring-boot-devtools-module-code: {spring-boot-code}/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools +:spring-boot-devtools-module-api: {spring-boot-api}/org/springframework/boot/devtools +:spring-boot-test-module-code: {spring-boot-code}/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test +:spring-boot-test-module-api: {spring-boot-api}/org/springframework/boot/test +:spring-boot-test-autoconfigure-module-code: {spring-boot-code}/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure +:spring-boot-test-autoconfigure-module-api: {spring-boot-api}/org/springframework/boot/test/autoconfigure + +:spring-amqp-api: https://docs.spring.io/spring-amqp/docs/{spring-amqp-version}/api/org/springframework/amqp +:spring-batch: https://spring.io/projects/spring-batch +:spring-batch-api: https://docs.spring.io/spring-batch/docs/{spring-batch-version}/api/org/springframework/batch +:spring-batch-docs: https://docs.spring.io/spring-batch/docs/{spring-batch-version}/reference/html/ +:spring-data: https://spring.io/projects/spring-data +:spring-data-cassandra: https://spring.io/projects/spring-data-cassandra +:spring-data-commons-api: https://docs.spring.io/spring-data/commons/docs/{spring-data-commons-version}/api/org/springframework/data +:spring-data-couchbase: https://spring.io/projects/spring-data-couchbase +:spring-data-couchbase-docs: https://docs.spring.io/spring-data/couchbase/docs/{spring-data-couchbase-version}/reference/html/ +:spring-data-elasticsearch: https://spring.io/projects/spring-data-elasticsearch +:spring-data-elasticsearch-docs: https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/ +:spring-data-gemfire: https://spring.io/projects/spring-data-gemfire +:spring-data-geode: https://spring.io/projects/spring-data-geode +:spring-data-jpa: https://spring.io/projects/spring-data-jpa +:spring-data-jpa-api: https://docs.spring.io/spring-data/jpa/docs/{spring-data-jpa-version}/api/org/springframework/data/jpa +:spring-data-jdbc-docs: https://docs.spring.io/spring-data/jdbc/docs/{spring-data-jdbc-version}/reference/html/ +:spring-data-ldap: https://spring.io/projects/spring-data-ldap +:spring-data-mongodb: https://spring.io/projects/spring-data-mongodb +:spring-data-mongodb-api: https://docs.spring.io/spring-data/mongodb/docs/{spring-data-mongodb-version}/api/org/springframework/data/mongodb +:spring-data-neo4j: https://spring.io/projects/spring-data-neo4j +:spring-data-neo4j-docs: https://docs.spring.io/spring-data/neo4j/docs/{spring-data-neo4j-version}/reference/html/ +:spring-data-redis: https://spring.io/projects/spring-data-redis +:spring-data-rest-api: https://docs.spring.io/spring-data/rest/docs/{spring-data-rest-version}/api/org/springframework/data/rest +:spring-data-solr: https://spring.io/projects/spring-data-solr +:spring-data-solr-docs: https://docs.spring.io/spring-data/solr/docs/{spring-data-solr-version}/reference/html/ +:spring-framework: https://spring.io/projects/spring-framework +:spring-framework-api: https://docs.spring.io/spring/docs/{spring-framework-version}/javadoc-api/org/springframework +:spring-framework-docs: https://docs.spring.io/spring/docs/{spring-framework-version}/spring-framework-reference/ +:spring-initializr-docs: https://docs.spring.io/initializr/docs/current/reference/html/ +:spring-integration: https://spring.io/projects/spring-integration +:spring-integration-docs: https://docs.spring.io/spring-integration/docs/{spring-integration-version}/reference/html/ +:spring-restdocs: https://spring.io/projects/spring-restdocs +:spring-security: https://spring.io/projects/spring-security +:spring-security-docs: https://docs.spring.io/spring-security/site/docs/{spring-security-version}/reference/htmlsingle/ +:spring-security-oauth2: https://spring.io/projects/spring-security-oauth +:spring-security-oauth2-docs: https://projects.spring.io/spring-security-oauth/docs/oauth2.html +:spring-session: https://spring.io/projects/spring-session +:spring-webservices-docs: https://docs.spring.io/spring-ws/docs/{spring-webservices-version}/reference/ + + + + +:ant-docs: https://ant.apache.org/manual +:dependency-management-plugin-code: https://github.com/spring-gradle-plugins/dependency-management-plugin +:gradle-docs: https://docs.gradle.org/current/userguide +:hibernate-docs: https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html +:java-api: https://docs.oracle.com/javase/8/docs/api/ +:jetty-docs: https://www.eclipse.org/jetty/documentation/{jetty-version} +:jooq-docs: https://www.jooq.org/doc/{jooq-version}/manual-single-page +:junit5-docs: https://junit.org/junit5/docs/current/user-guide +:kotlin-docs: https://kotlinlang.org/docs/reference/ +:micrometer-docs: https://micrometer.io/docs +:micrometer-concepts-docs: {micrometer-docs}/concepts +:micrometer-registry-docs: {micrometer-docs}/registry +:tomcat-docs: https://tomcat.apache.org/tomcat-9.0-doc diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/build-tool-plugins.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/build-tool-plugins.adoc similarity index 100% rename from spring-boot-project/spring-boot-docs/src/main/asciidoc/build-tool-plugins.adoc rename to spring-boot-project/spring-boot-docs/src/docs/asciidoc/build-tool-plugins.adoc diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/deployment.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/deployment.adoc similarity index 100% rename from spring-boot-project/spring-boot-docs/src/main/asciidoc/deployment.adoc rename to spring-boot-project/spring-boot-docs/src/docs/asciidoc/deployment.adoc diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/documentation-overview.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/documentation-overview.adoc similarity index 100% rename from spring-boot-project/spring-boot-docs/src/main/asciidoc/documentation-overview.adoc rename to spring-boot-project/spring-boot-docs/src/docs/asciidoc/documentation-overview.adoc diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/getting-started.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/getting-started.adoc similarity index 100% rename from spring-boot-project/spring-boot-docs/src/main/asciidoc/getting-started.adoc rename to spring-boot-project/spring-boot-docs/src/docs/asciidoc/getting-started.adoc diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/howto.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/howto.adoc similarity index 100% rename from spring-boot-project/spring-boot-docs/src/main/asciidoc/howto.adoc rename to spring-boot-project/spring-boot-docs/src/docs/asciidoc/howto.adoc diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/index-docinfo.xml b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/index-docinfo.xml similarity index 100% rename from spring-boot-project/spring-boot-docs/src/main/asciidoc/index-docinfo.xml rename to spring-boot-project/spring-boot-docs/src/docs/asciidoc/index-docinfo.xml diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/index.htmladoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/index.htmladoc similarity index 100% rename from spring-boot-project/spring-boot-docs/src/main/asciidoc/index.htmladoc rename to spring-boot-project/spring-boot-docs/src/docs/asciidoc/index.htmladoc diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/index.htmlsingleadoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/index.htmlsingleadoc similarity index 100% rename from spring-boot-project/spring-boot-docs/src/main/asciidoc/index.htmlsingleadoc rename to spring-boot-project/spring-boot-docs/src/docs/asciidoc/index.htmlsingleadoc diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/legal.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/legal.adoc similarity index 100% rename from spring-boot-project/spring-boot-docs/src/main/asciidoc/legal.adoc rename to spring-boot-project/spring-boot-docs/src/docs/asciidoc/legal.adoc diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/production-ready-features.adoc similarity index 100% rename from spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc rename to spring-boot-project/spring-boot-docs/src/docs/asciidoc/production-ready-features.adoc diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/spring-boot-cli.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/spring-boot-cli.adoc similarity index 100% rename from spring-boot-project/spring-boot-docs/src/main/asciidoc/spring-boot-cli.adoc rename to spring-boot-project/spring-boot-docs/src/docs/asciidoc/spring-boot-cli.adoc diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/spring-boot-features.adoc similarity index 100% rename from spring-boot-project/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc rename to spring-boot-project/spring-boot-docs/src/docs/asciidoc/spring-boot-features.adoc diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/spring-boot-reference.pdfadoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/spring-boot-reference.pdfadoc similarity index 100% rename from spring-boot-project/spring-boot-docs/src/main/asciidoc/spring-boot-reference.pdfadoc rename to spring-boot-project/spring-boot-docs/src/docs/asciidoc/spring-boot-reference.pdfadoc diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/using-spring-boot.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/using-spring-boot.adoc new file mode 100644 index 0000000000..04a6b817a9 --- /dev/null +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/using-spring-boot.adoc @@ -0,0 +1,1039 @@ +[[using-boot]] += Using Spring Boot +include::attributes.adoc[] + +This section goes into more detail about how you should use Spring Boot. +It covers topics such as build systems, auto-configuration, and how to run your applications. +We also cover some Spring Boot best practices. +Although there is nothing particularly special about Spring Boot (it is just another library that you can consume), there are a few recommendations that, when followed, make your development process a little easier. + +If you are starting out with Spring Boot, you should probably read the _<>_ guide before diving into this section. + + + +[[using-boot-build-systems]] +== Build Systems +It is strongly recommended that you choose a build system that supports <> and that can consume artifacts published to the "`Maven Central`" repository. +We would recommend that you choose Maven or Gradle. +It is possible to get Spring Boot to work with other build systems (Ant, for example), but they are not particularly well supported. + + + +[[using-boot-dependency-management]] +=== Dependency Management +Each release of Spring Boot provides a curated list of dependencies that it supports. +In practice, you do not need to provide a version for any of these dependencies in your build configuration, as Spring Boot manages that for you. +When you upgrade Spring Boot itself, these dependencies are upgraded as well in a consistent way. + +NOTE: You can still specify a version and override Spring Boot's recommendations if you need to do so. + +The curated list contains all the spring modules that you can use with Spring Boot as well as a refined list of third party libraries. +The list is available as a standard <> that can be used with both <> and <>. + +WARNING: Each release of Spring Boot is associated with a base version of the Spring Framework. +We **highly** recommend that you not specify its version. + + + +[[using-boot-maven]] +=== Maven +Maven users can inherit from the `spring-boot-starter-parent` project to obtain sensible defaults. +The parent project provides the following features: + +* Java 1.8 as the default compiler level. +* UTF-8 source encoding. +* A <>, inherited from the spring-boot-dependencies pom, that manages the versions of common dependencies. +This dependency management lets you omit tags for those dependencies when used in your own pom. +* An execution of the {spring-boot-maven-plugin-docs}/repackage-mojo.html[`repackage` goal] with a `repackage` execution id. +* Sensible https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html[resource filtering]. +* Sensible plugin configuration (https://www.mojohaus.org/exec-maven-plugin/[exec plugin], https://github.com/ktoso/maven-git-commit-id-plugin[Git commit ID], and https://maven.apache.org/plugins/maven-shade-plugin/[shade]). +* Sensible resource filtering for `application.properties` and `application.yml` including profile-specific files (for example, `application-dev.properties` and `application-dev.yml`) + +Note that, since the `application.properties` and `application.yml` files accept Spring style placeholders (`${...}`), the Maven filtering is changed to use `@..@` placeholders. +(You can override that by setting a Maven property called `resource.delimiter`.) + + + +[[using-boot-maven-parent-pom]] +==== Inheriting the Starter Parent +To configure your project to inherit from the `spring-boot-starter-parent`, set the `parent` as follows: + +[source,xml,indent=0,subs="verbatim,quotes,attributes"] +---- + + + org.springframework.boot + spring-boot-starter-parent + {spring-boot-version} + +---- + +NOTE: You should need to specify only the Spring Boot version number on this dependency. +If you import additional starters, you can safely omit the version number. + +With that setup, you can also override individual dependencies by overriding a property in your own project. +For instance, to upgrade to another Spring Data release train, you would add the following to your `pom.xml`: + +[source,xml,indent=0,subs="verbatim,quotes,attributes"] +---- + + Fowler-SR2 + +---- + +TIP: Check the {spring-boot-code}/spring-boot-project/spring-boot-dependencies/pom.xml[`spring-boot-dependencies` pom] for a list of supported properties. + + + +[[using-boot-maven-without-a-parent]] +==== Using Spring Boot without the Parent POM +Not everyone likes inheriting from the `spring-boot-starter-parent` POM. +You may have your own corporate standard parent that you need to use or you may prefer to explicitly declare all your Maven configuration. + +If you do not want to use the `spring-boot-starter-parent`, you can still keep the benefit of the dependency management (but not the plugin management) by using a `scope=import` dependency, as follows: + +[source,xml,indent=0,subs="verbatim,quotes,attributes"] +---- + + + + + org.springframework.boot + spring-boot-dependencies + {spring-boot-version} + pom + import + + + +---- + +The preceding sample setup does not let you override individual dependencies by using a property, as explained above. +To achieve the same result, you need to add an entry in the `dependencyManagement` of your project **before** the `spring-boot-dependencies` entry. +For instance, to upgrade to another Spring Data release train, you could add the following element to your `pom.xml`: + +[source,xml,indent=0,subs="verbatim,quotes,attributes"] +---- + + + + + org.springframework.data + spring-data-releasetrain + Fowler-SR2 + pom + import + + + org.springframework.boot + spring-boot-dependencies + {spring-boot-version} + pom + import + + + +---- + +NOTE: In the preceding example, we specify a _BOM_, but any dependency type can be overridden in the same way. + + + +[[using-boot-maven-plugin]] +==== Using the Spring Boot Maven Plugin +Spring Boot includes a <> that can package the project as an executable jar. +Add the plugin to your `` section if you want to use it, as shown in the following example: + +[source,xml,indent=0,subs="verbatim,quotes,attributes"] +---- + + + + org.springframework.boot + spring-boot-maven-plugin + + + +---- + +NOTE: If you use the Spring Boot starter parent pom, you need to add only the plugin. +There is no need to configure it unless you want to change the settings defined in the parent. + + + +[[using-boot-gradle]] +=== Gradle +To learn about using Spring Boot with Gradle, please refer to the documentation for Spring Boot's Gradle plugin: + +* Reference ({spring-boot-gradle-plugin-docs}[HTML] and {spring-boot-gradle-plugin-pdfdocs}[PDF]) +* {spring-boot-gradle-plugin-api}[API] + + + +[[using-boot-ant]] +=== Ant +It is possible to build a Spring Boot project using Apache Ant+Ivy. +The `spring-boot-antlib` "`AntLib`" module is also available to help Ant create executable jars. + +To declare dependencies, a typical `ivy.xml` file looks something like the following example: + +[source,xml,indent=0] +---- + + + + + + + + + + +---- + +A typical `build.xml` looks like the following example: + +[source,xml,indent=0,subs="verbatim,quotes,attributes"] +---- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +---- + +TIP: If you do not want to use the `spring-boot-antlib` module, see the _<>_ "`How-to`" . + + + +[[using-boot-starter]] +=== Starters +Starters are a set of convenient dependency descriptors that you can include in your application. +You get a one-stop shop for all the Spring and related technologies that you need without having to hunt through sample code and copy-paste loads of dependency descriptors. +For example, if you want to get started using Spring and JPA for database access, include the `spring-boot-starter-data-jpa` dependency in your project. + +The starters contain a lot of the dependencies that you need to get a project up and running quickly and with a consistent, supported set of managed transitive dependencies. + +.What's in a name +**** +All **official** starters follow a similar naming pattern; `+spring-boot-starter-*+`, where `+*+` is a particular type of application. +This naming structure is intended to help when you need to find a starter. +The Maven integration in many IDEs lets you search dependencies by name. +For example, with the appropriate Eclipse or STS plugin installed, you can press `ctrl-space` in the POM editor and type "`spring-boot-starter`" for a complete list. + +As explained in the "`<>`" section, third party starters should not start with `spring-boot`, as it is reserved for official Spring Boot artifacts. +Rather, a third-party starter typically starts with the name of the project. +For example, a third-party starter project called `thirdpartyproject` would typically be named `thirdpartyproject-spring-boot-starter`. +**** + +The following application starters are provided by Spring Boot under the `org.springframework.boot` group: + +.Spring Boot application starters +include::starters/application-starters.adoc[] + +In addition to the application starters, the following starters can be used to add _<>_ features: + +.Spring Boot production starters +include::starters/production-starters.adoc[] + +Finally, Spring Boot also includes the following starters that can be used if you want to exclude or swap specific technical facets: + +.Spring Boot technical starters +include::starters/technical-starters.adoc[] + +TIP: For a list of additional community contributed starters, see the {spring-boot-master-code}/spring-boot-project/spring-boot-starters/README.adoc[README file] in the `spring-boot-starters` module on GitHub. + + + +[[using-boot-structuring-your-code]] +== Structuring Your Code +Spring Boot does not require any specific code layout to work. +However, there are some best practices that help. + + + +[[using-boot-using-the-default-package]] +=== Using the "`default`" Package +When a class does not include a `package` declaration, it is considered to be in the "`default package`". +The use of the "`default package`" is generally discouraged and should be avoided. +It can cause particular problems for Spring Boot applications that use the `@ComponentScan`, `@ConfigurationPropertiesScan`, `@EntityScan`, or `@SpringBootApplication` annotations, since every class from every jar is read. + +TIP: We recommend that you follow Java's recommended package naming conventions and use a reversed domain name (for example, `com.example.project`). + + + +[[using-boot-locating-the-main-class]] +=== Locating the Main Application Class +We generally recommend that you locate your main application class in a root package above other classes. +The <> is often placed on your main class, and it implicitly defines a base "`search package`" for certain items. +For example, if you are writing a JPA application, the package of the `@SpringBootApplication` annotated class is used to search for `@Entity` items. +Using a root package also allows component scan to apply only on your project. + +TIP: If you don't want to use `@SpringBootApplication`, the `@EnableAutoConfiguration` and `@ComponentScan` annotations that it imports defines that behaviour so you can also use those instead. + +The following listing shows a typical layout: + +[indent=0] +---- + com + +- example + +- myapplication + +- Application.java + | + +- customer + | +- Customer.java + | +- CustomerController.java + | +- CustomerService.java + | +- CustomerRepository.java + | + +- order + +- Order.java + +- OrderController.java + +- OrderService.java + +- OrderRepository.java +---- + +The `Application.java` file would declare the `main` method, along with the basic `@SpringBootApplication`, as follows: + +[source,java,indent=0] +---- + package com.example.myapplication; + + import org.springframework.boot.SpringApplication; + import org.springframework.boot.autoconfigure.SpringBootApplication; + + @SpringBootApplication + public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + + } +---- + + + +[[using-boot-configuration-classes]] +== Configuration Classes +Spring Boot favors Java-based configuration. +Although it is possible to use `SpringApplication` with XML sources, we generally recommend that your primary source be a single `@Configuration` class. +Usually the class that defines the `main` method is a good candidate as the primary `@Configuration`. + +TIP: Many Spring configuration examples have been published on the Internet that use XML configuration. +If possible, always try to use the equivalent Java-based configuration. +Searching for `+Enable*+` annotations can be a good starting point. + + + +[[using-boot-importing-configuration]] +=== Importing Additional Configuration Classes +You need not put all your `@Configuration` into a single class. +The `@Import` annotation can be used to import additional configuration classes. +Alternatively, you can use `@ComponentScan` to automatically pick up all Spring components, including `@Configuration` classes. + + + +[[using-boot-importing-xml-configuration]] +=== Importing XML Configuration +If you absolutely must use XML based configuration, we recommend that you still start with a `@Configuration` class. +You can then use an `@ImportResource` annotation to load XML configuration files. + + + +[[using-boot-auto-configuration]] +== Auto-configuration +Spring Boot auto-configuration attempts to automatically configure your Spring application based on the jar dependencies that you have added. +For example, if `HSQLDB` is on your classpath, and you have not manually configured any database connection beans, then Spring Boot auto-configures an in-memory database. + +You need to opt-in to auto-configuration by adding the `@EnableAutoConfiguration` or `@SpringBootApplication` annotations to one of your `@Configuration` classes. + +TIP: You should only ever add one `@SpringBootApplication` or `@EnableAutoConfiguration` annotation. +We generally recommend that you add one or the other to your primary `@Configuration` class only. + + + +[[using-boot-replacing-auto-configuration]] +=== Gradually Replacing Auto-configuration +Auto-configuration is non-invasive. +At any point, you can start to define your own configuration to replace specific parts of the auto-configuration. +For example, if you add your own `DataSource` bean, the default embedded database support backs away. + +If you need to find out what auto-configuration is currently being applied, and why, start your application with the `--debug` switch. +Doing so enables debug logs for a selection of core loggers and logs a conditions report to the console. + + + +[[using-boot-disabling-specific-auto-configuration]] +=== Disabling Specific Auto-configuration Classes +If you find that specific auto-configuration classes that you do not want are being applied, you can use the exclude attribute of `@EnableAutoConfiguration` to disable them, as shown in the following example: + +[source,java,indent=0] +---- + import org.springframework.boot.autoconfigure.*; + import org.springframework.boot.autoconfigure.jdbc.*; + import org.springframework.context.annotation.*; + + @Configuration(proxyBeanMethods = false) + @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) + public class MyConfiguration { + } +---- + +If the class is not on the classpath, you can use the `excludeName` attribute of the annotation and specify the fully qualified name instead. +Finally, you can also control the list of auto-configuration classes to exclude by using the configprop:spring.autoconfigure.exclude[] property. + +TIP: You can define exclusions both at the annotation level and by using the property. + +NOTE: Even though auto-configuration classes are `public`, the only aspect of the class that is considered public API is the name of the class which can be used for disabling the auto-configuration. +The actual contents of those classes, such as nested configuration classes or bean methods are for internal use only and we do not recommend using those directly. + + + +[[using-boot-spring-beans-and-dependency-injection]] +== Spring Beans and Dependency Injection +You are free to use any of the standard Spring Framework techniques to define your beans and their injected dependencies. +For simplicity, we often find that using `@ComponentScan` (to find your beans) and using `@Autowired` (to do constructor injection) works well. + +If you structure your code as suggested above (locating your application class in a root package), you can add `@ComponentScan` without any arguments. +All of your application components (`@Component`, `@Service`, `@Repository`, `@Controller` etc.) are automatically registered as Spring Beans. + +The following example shows a `@Service` Bean that uses constructor injection to obtain a required `RiskAssessor` bean: + +[source,java,indent=0] +---- + package com.example.service; + + import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.stereotype.Service; + + @Service + public class DatabaseAccountService implements AccountService { + + private final RiskAssessor riskAssessor; + + @Autowired + public DatabaseAccountService(RiskAssessor riskAssessor) { + this.riskAssessor = riskAssessor; + } + + // ... + + } +---- + +If a bean has one constructor, you can omit the `@Autowired`, as shown in the following example: + +[source,java,indent=0] +---- + @Service + public class DatabaseAccountService implements AccountService { + + private final RiskAssessor riskAssessor; + + public DatabaseAccountService(RiskAssessor riskAssessor) { + this.riskAssessor = riskAssessor; + } + + // ... + + } +---- + +TIP: Notice how using constructor injection lets the `riskAssessor` field be marked as `final`, indicating that it cannot be subsequently changed. + + + +[[using-boot-using-springbootapplication-annotation]] +== Using the @SpringBootApplication Annotation +Many Spring Boot developers like their apps to use auto-configuration, component scan and be able to define extra configuration on their "application class". +A single `@SpringBootApplication` annotation can be used to enable those three features, that is: + +* `@EnableAutoConfiguration`: enable <> +* `@ComponentScan`: enable `@Component` scan on the package where the application is located (see <>) +* `@Configuration`: allow to register extra beans in the context or import additional configuration classes + +[source,java,indent=0] +---- + package com.example.myapplication; + + import org.springframework.boot.SpringApplication; + import org.springframework.boot.autoconfigure.SpringBootApplication; + + @SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan + public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + + } +---- + +NOTE: `@SpringBootApplication` also provides aliases to customize the attributes of `@EnableAutoConfiguration` and `@ComponentScan`. + +[NOTE] +==== +None of these features are mandatory and you may choose to replace this single annotation by any of the features that it enables. +For instance, you may not want to use component scan or configuration properties scan in your application: + +[source,java,indent=0] +---- + package com.example.myapplication; + + import org.springframework.boot.SpringApplication; + import org.springframework.context.annotation.ComponentScan + import org.springframework.context.annotation.Configuration; + import org.springframework.context.annotation.Import; + + @Configuration(proxyBeanMethods = false) + @EnableAutoConfiguration + @Import({ MyConfig.class, MyAnotherConfig.class }) + public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + + } +---- + +In this example, `Application` is just like any other Spring Boot application except that `@Component`-annotated classes and `@ConfigurationProperties`-annotated classes are not detected automatically and the user-defined beans are imported explicitly (see `@Import`). +==== + + + +[[using-boot-running-your-application]] +== Running Your Application +One of the biggest advantages of packaging your application as a jar and using an embedded HTTP server is that you can run your application as you would any other. +Debugging Spring Boot applications is also easy. +You do not need any special IDE plugins or extensions. + +NOTE: This section only covers jar based packaging. +If you choose to package your application as a war file, you should refer to your server and IDE documentation. + + + +[[using-boot-running-from-an-ide]] +=== Running from an IDE +You can run a Spring Boot application from your IDE as a simple Java application. +However, you first need to import your project. +Import steps vary depending on your IDE and build system. +Most IDEs can import Maven projects directly. +For example, Eclipse users can select `Import...` -> `Existing Maven Projects` from the `File` menu. + +If you cannot directly import your project into your IDE, you may be able to generate IDE metadata by using a build plugin. +Maven includes plugins for https://maven.apache.org/plugins/maven-eclipse-plugin/[Eclipse] and https://maven.apache.org/plugins/maven-idea-plugin/[IDEA]. +Gradle offers plugins for {gradle-docs}/userguide.html[various IDEs]. + +TIP: If you accidentally run a web application twice, you see a "`Port already in use`" error. +STS users can use the `Relaunch` button rather than the `Run` button to ensure that any existing instance is closed. + + + +[[using-boot-running-as-a-packaged-application]] +=== Running as a Packaged Application +If you use the Spring Boot Maven or Gradle plugins to create an executable jar, you can run your application using `java -jar`, as shown in the following example: + +[indent=0,subs="attributes"] +---- + $ java -jar target/myapplication-0.0.1-SNAPSHOT.jar +---- + +It is also possible to run a packaged application with remote debugging support enabled. +Doing so lets you attach a debugger to your packaged application, as shown in the following example: + +[indent=0,subs="attributes"] +---- + $ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \ + -jar target/myapplication-0.0.1-SNAPSHOT.jar +---- + + + +[[using-boot-running-with-the-maven-plugin]] +=== Using the Maven Plugin +The Spring Boot Maven plugin includes a `run` goal that can be used to quickly compile and run your application. +Applications run in an exploded form, as they do in your IDE. +The following example shows a typical Maven command to run a Spring Boot application: + +[indent=0,subs="attributes"] +---- + $ mvn spring-boot:run +---- + +You might also want to use the `MAVEN_OPTS` operating system environment variable, as shown in the following example: + +[indent=0,subs="attributes"] +---- + $ export MAVEN_OPTS=-Xmx1024m +---- + + + +[[using-boot-running-with-the-gradle-plugin]] +=== Using the Gradle Plugin +The Spring Boot Gradle plugin also includes a `bootRun` task that can be used to run your application in an exploded form. +The `bootRun` task is added whenever you apply the `org.springframework.boot` and `java` plugins and is shown in the following example: + +[indent=0,subs="attributes"] +---- + $ gradle bootRun +---- + +You might also want to use the `JAVA_OPTS` operating system environment variable, as shown in the following example: + +[indent=0,subs="attributes"] +---- + $ export JAVA_OPTS=-Xmx1024m +---- + + + +[[using-boot-hot-swapping]] +=== Hot Swapping +Since Spring Boot applications are just plain Java applications, JVM hot-swapping should work out of the box. +JVM hot swapping is somewhat limited with the bytecode that it can replace. +For a more complete solution, https://jrebel.com/software/jrebel/[JRebel] can be used. + +The `spring-boot-devtools` module also includes support for quick application restarts. +See the <> section later in this chapter and the <> for details. + + + +[[using-boot-devtools]] +== Developer Tools +Spring Boot includes an additional set of tools that can make the application development experience a little more pleasant. +The `spring-boot-devtools` module can be included in any project to provide additional development-time features. +To include devtools support, add the module dependency to your build, as shown in the following listings for Maven and Gradle: + +.Maven +[source,xml,indent=0,subs="verbatim,quotes,attributes"] +---- + + + org.springframework.boot + spring-boot-devtools + true + + +---- + +.Gradle +[source,groovy,indent=0,subs="attributes"] +---- + configurations { + developmentOnly + runtimeClasspath { + extendsFrom developmentOnly + } + } + dependencies { + developmentOnly("org.springframework.boot:spring-boot-devtools") + } +---- + +NOTE: Developer tools are automatically disabled when running a fully packaged application. +If your application is launched from `java -jar` or if it is started from a special classloader, then it is considered a "`production application`". +If that does not apply to you (i.e. if you run your application from a container), consider excluding devtools or set the `-Dspring.devtools.restart.enabled=false` system property. + +TIP: Flagging the dependency as optional in Maven or using a custom `developmentOnly` configuration in Gradle (as shown above) is a best practice that prevents devtools from being transitively applied to other modules that use your project. + +TIP: Repackaged archives do not contain devtools by default. +If you want to use a <>, you need to disable the `excludeDevtools` build property to include it. +The property is supported with both the Maven and Gradle plugins. + + + +[[using-boot-devtools-property-defaults]] +=== Property Defaults +Several of the libraries supported by Spring Boot use caches to improve performance. +For example, <> cache compiled templates to avoid repeatedly parsing template files. +Also, Spring MVC can add HTTP caching headers to responses when serving static resources. + +While caching is very beneficial in production, it can be counter-productive during development, preventing you from seeing the changes you just made in your application. +For this reason, spring-boot-devtools disables the caching options by default. + +Cache options are usually configured by settings in your `application.properties` file. +For example, Thymeleaf offers the configprop:spring.thymeleaf.cache[] property. +Rather than needing to set these properties manually, the `spring-boot-devtools` module automatically applies sensible development-time configuration. + +Because you need more information about web requests while developing Spring MVC and Spring WebFlux applications, developer tools will enable `DEBUG` logging for the `web` logging group. +This will give you information about the incoming request, which handler is processing it, the response outcome, etc. +If you wish to log all request details (including potentially sensitive information), you can turn on the configprop:spring.http.log-request-details[] configuration property. + +NOTE: If you don't want property defaults to be applied you can set configprop:spring.devtools.add-properties[] to `false` in your `application.properties`. + +TIP: For a complete list of the properties that are applied by the devtools, see {spring-boot-devtools-module-code}/env/DevToolsPropertyDefaultsPostProcessor.java[DevToolsPropertyDefaultsPostProcessor]. + + + +[[using-boot-devtools-restart]] +=== Automatic Restart +Applications that use `spring-boot-devtools` automatically restart whenever files on the classpath change. +This can be a useful feature when working in an IDE, as it gives a very fast feedback loop for code changes. +By default, any entry on the classpath that points to a folder is monitored for changes. +Note that certain resources, such as static assets and view templates, <>. + +.Triggering a restart +**** +As DevTools monitors classpath resources, the only way to trigger a restart is to update the classpath. +The way in which you cause the classpath to be updated depends on the IDE that you are using. +In Eclipse, saving a modified file causes the classpath to be updated and triggers a restart. +In IntelliJ IDEA, building the project (`Build +->+ Build Project`) has the same effect. +**** + +NOTE: As long as forking is enabled, you can also start your application by using the supported build plugins (Maven and Gradle), since DevTools needs an isolated application classloader to operate properly. +By default, the Gradle and Maven plugins fork the application process. + +TIP: Automatic restart works very well when used with LiveReload. +<> for details. +If you use JRebel, automatic restarts are disabled in favor of dynamic class reloading. +Other devtools features (such as LiveReload and property overrides) can still be used. + +NOTE: DevTools relies on the application context's shutdown hook to close it during a restart. +It does not work correctly if you have disabled the shutdown hook (`SpringApplication.setRegisterShutdownHook(false)`). + +NOTE: When deciding if an entry on the classpath should trigger a restart when it changes, DevTools automatically ignores projects named `spring-boot`, `spring-boot-devtools`, `spring-boot-autoconfigure`, `spring-boot-actuator`, and `spring-boot-starter`. + +NOTE: DevTools needs to customize the `ResourceLoader` used by the `ApplicationContext`. +If your application provides one already, it is going to be wrapped. +Direct override of the `getResource` method on the `ApplicationContext` is not supported. + +[[using-spring-boot-restart-vs-reload]] +.Restart vs Reload +**** +The restart technology provided by Spring Boot works by using two classloaders. +Classes that do not change (for example, those from third-party jars) are loaded into a _base_ classloader. +Classes that you are actively developing are loaded into a _restart_ classloader. +When the application is restarted, the _restart_ classloader is thrown away and a new one is created. +This approach means that application restarts are typically much faster than "`cold starts`", since the _base_ classloader is already available and populated. + +If you find that restarts are not quick enough for your applications or you encounter classloading issues, you could consider reloading technologies such as https://jrebel.com/software/jrebel/[JRebel] from ZeroTurnaround. +These work by rewriting classes as they are loaded to make them more amenable to reloading. +**** + + + +[[using-boot-devtools-restart-logging-condition-delta]] +==== Logging changes in condition evaluation +By default, each time your application restarts, a report showing the condition evaluation delta is logged. +The report shows the changes to your application's auto-configuration as you make changes such as adding or removing beans and setting configuration properties. + +To disable the logging of the report, set the following property: + +[indent=0] +---- + spring.devtools.restart.log-condition-evaluation-delta=false +---- + + +[[using-boot-devtools-restart-exclude]] +==== Excluding Resources +Certain resources do not necessarily need to trigger a restart when they are changed. +For example, Thymeleaf templates can be edited in-place. +By default, changing resources in `/META-INF/maven`, `/META-INF/resources`, `/resources`, `/static`, `/public`, or `/templates` does not trigger a restart but does trigger a <>. +If you want to customize these exclusions, you can use the configprop:spring.devtools.restart.exclude[] property. +For example, to exclude only `/static` and `/public` you would set the following property: + +[indent=0] +---- + spring.devtools.restart.exclude=static/**,public/** +---- + +TIP: If you want to keep those defaults and _add_ additional exclusions, use the configprop:spring.devtools.restart.additional-exclude[] property instead. + + + +[[using-boot-devtools-restart-additional-paths]] +==== Watching Additional Paths +You may want your application to be restarted or reloaded when you make changes to files that are not on the classpath. +To do so, use the configprop:spring.devtools.restart.additional-paths[] property to configure additional paths to watch for changes. +You can use the configprop:spring.devtools.restart.exclude[] property <> to control whether changes beneath the additional paths trigger a full restart or a <>. + + + +[[using-boot-devtools-restart-disable]] +==== Disabling Restart +If you do not want to use the restart feature, you can disable it by using the configprop:spring.devtools.restart.enabled[] property. +In most cases, you can set this property in your `application.properties` (doing so still initializes the restart classloader, but it does not watch for file changes). + +If you need to _completely_ disable restart support (for example, because it does not work with a specific library), you need to set the configprop:spring.devtools.restart.enabled[] `System` property to `false` before calling `SpringApplication.run(...)`, as shown in the following example: + +[source,java,indent=0] +---- + public static void main(String[] args) { + System.setProperty("spring.devtools.restart.enabled", "false"); + SpringApplication.run(MyApp.class, args); + } +---- + + + +[[using-boot-devtools-restart-triggerfile]] +==== Using a Trigger File +If you work with an IDE that continuously compiles changed files, you might prefer to trigger restarts only at specific times. +To do so, you can use a "`trigger file`", which is a special file that must be modified when you want to actually trigger a restart check. + +NOTE: Any update to the file will trigger a check, but restart only actually occurs if Devtools has detected it has something to do. + +To use a trigger file, set the configprop:spring.devtools.restart.trigger-file[] property to the name (excluding any path) of your trigger file. +The trigger file must appear somewhere on your classpath. + +For example, if you have a project with the following structure: + +[indent=0] +---- + src + +- main + +- resources + +- .reloadtrigger +---- + +Then your `trigger-file` property would be: + +[source,properties,indent=0,configprops] +---- + spring.devtools.restart.trigger-file=.reloadtrigger +---- + +Restarts will now only happen when the `src/main/resources/.reloadtrigger` is updated. + +TIP: You might want to set `spring.devtools.restart.trigger-file` as a <>, so that all your projects behave in the same way. + +Some IDEs have features that save you from needing to update your trigger file manually. +https://spring.io/tools[Spring Tools for Eclipse] and https://www.jetbrains.com/idea/[IntelliJ IDEA (Ultimate Edition)] both have such support. +With Spring Tools, you can use the "`reload`" button from the console view (as long as your `trigger-file` is named `.reloadtrigger`). +For IntelliJ, you can follow the https://www.jetbrains.com/help/idea/spring-boot.html#configure-application-update-policies-with-devtools[instructions in their documentation]. + + + +[[using-boot-devtools-customizing-classload]] +==== Customizing the Restart Classloader +As described earlier in the <> section, restart functionality is implemented by using two classloaders. +For most applications, this approach works well. +However, it can sometimes cause classloading issues. + +By default, any open project in your IDE is loaded with the "`restart`" classloader, and any regular `.jar` file is loaded with the "`base`" classloader. +If you work on a multi-module project, and not every module is imported into your IDE, you may need to customize things. +To do so, you can create a `META-INF/spring-devtools.properties` file. + +The `spring-devtools.properties` file can contain properties prefixed with `restart.exclude` and `restart.include`. +The `include` elements are items that should be pulled up into the "`restart`" classloader, and the `exclude` elements are items that should be pushed down into the "`base`" classloader. +The value of the property is a regex pattern that is applied to the classpath, as shown in the following example: + +[source,properties,indent=0] +---- + restart.exclude.companycommonlibs=/mycorp-common-[\\w\\d-\.]+\.jar + restart.include.projectcommon=/mycorp-myproj-[\\w\\d-\.]+\.jar +---- + +NOTE: All property keys must be unique. +As long as a property starts with `restart.include.` or `restart.exclude.` it is considered. + +TIP: All `META-INF/spring-devtools.properties` from the classpath are loaded. +You can package files inside your project, or in the libraries that the project consumes. + + + +[[using-boot-devtools-known-restart-limitations]] +==== Known Limitations +Restart functionality does not work well with objects that are deserialized by using a standard `ObjectInputStream`. +If you need to deserialize data, you may need to use Spring's `ConfigurableObjectInputStream` in combination with `Thread.currentThread().getContextClassLoader()`. + +Unfortunately, several third-party libraries deserialize without considering the context classloader. +If you find such a problem, you need to request a fix with the original authors. + + + +[[using-boot-devtools-livereload]] +=== LiveReload +The `spring-boot-devtools` module includes an embedded LiveReload server that can be used to trigger a browser refresh when a resource is changed. +LiveReload browser extensions are freely available for Chrome, Firefox and Safari from http://livereload.com/extensions/[livereload.com]. + +If you do not want to start the LiveReload server when your application runs, you can set the configprop:spring.devtools.livereload.enabled[] property to `false`. + +NOTE: You can only run one LiveReload server at a time. +Before starting your application, ensure that no other LiveReload servers are running. +If you start multiple applications from your IDE, only the first has LiveReload support. + + + +[[using-boot-devtools-globalsettings]] +=== Global Settings +You can configure global devtools settings by adding any of the following files to the `$HOME/.config/spring-boot` folder: + +. `spring-boot-devtools.properties` +. `spring-boot-devtools.yaml` +. `spring-boot-devtools.yml` + +Any properties added to these file apply to _all_ Spring Boot applications on your machine that use devtools. +For example, to configure restart to always use a <>, you would add the following property: + +.~/.config/spring-boot/spring-boot-devtools.properties +[source,properties,indent=0,configprops] +---- + spring.devtools.restart.trigger-file=.reloadtrigger +---- + +NOTE: If devtools configuration files are not found in `$HOME/.config/spring-boot`, the root of the `$HOME` folder is searched for the presence of a `.spring-boot-devtools.properties` file. +This allows you to share the devtools global configuration with applications that are on an older version of Spring Boot that does not support the `$HOME/.config/spring-boot` location. + +NOTE: Profiles activated in the above files will not affect the loading of <>. + + + +[[using-boot-devtools-remote]] +=== Remote Applications +The Spring Boot developer tools are not limited to local development. +You can also use several features when running applications remotely. +Remote support is opt-in as enabling it can be a security risk. +It should only be enabled when running on a trusted network or when secured with SSL. +If neither of these options is available to you, you should not use DevTools' remote support. +You should never enable support on a production deployment. + +To enable it, you need to make sure that `devtools` is included in the repackaged archive, as shown in the following listing: + +[source,xml,indent=0,subs="verbatim,quotes,attributes"] +---- + + + + org.springframework.boot + spring-boot-maven-plugin + + false + + + + +---- + +Then you need to set the configprop:spring.devtools.remote.secret[] property. +Like any important password or secret, the value should be unique and strong such that it cannot be guessed or brute-forced. + +Remote devtools support is provided in two parts: a server-side endpoint that accepts connections and a client application that you run in your IDE. +The server component is automatically enabled when the configprop:spring.devtools.remote.secret[] property is set. +The client component must be launched manually. + + + +==== Running the Remote Client Application +The remote client application is designed to be run from within your IDE. +You need to run `org.springframework.boot.devtools.RemoteSpringApplication` with the same classpath as the remote project that you connect to. +The application's single required argument is the remote URL to which it connects. + +For example, if you are using Eclipse or STS and you have a project named `my-app` that you have deployed to Cloud Foundry, you would do the following: + +* Select `Run Configurations...` from the `Run` menu. +* Create a new `Java Application` "`launch configuration`". +* Browse for the `my-app` project. +* Use `org.springframework.boot.devtools.RemoteSpringApplication` as the main class. +* Add `+++https://myapp.cfapps.io+++` to the `Program arguments` (or whatever your remote URL is). + +A running remote client might resemble the following listing: + +[indent=0,subs="attributes"] +---- + . ____ _ __ _ _ + /\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \ + ( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \ + \\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) ) + ' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / / + =========|_|==============|___/===================================/_/_/_/ + :: Spring Boot Remote :: {spring-boot-version} + + 2015-06-10 18:25:06.632 INFO 14938 --- [ main] o.s.b.devtools.RemoteSpringApplication : Starting RemoteSpringApplication on pwmbp with PID 14938 (/Users/pwebb/projects/spring-boot/code/spring-boot-project/spring-boot-devtools/target/classes started by pwebb in /Users/pwebb/projects/spring-boot/code) + 2015-06-10 18:25:06.671 INFO 14938 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2a17b7b6: startup date [Wed Jun 10 18:25:06 PDT 2015]; root of context hierarchy + 2015-06-10 18:25:07.043 WARN 14938 --- [ main] o.s.b.d.r.c.RemoteClientConfiguration : The connection to http://localhost:8080 is insecure. You should use a URL starting with 'https://'. + 2015-06-10 18:25:07.074 INFO 14938 --- [ main] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 + 2015-06-10 18:25:07.130 INFO 14938 --- [ main] o.s.b.devtools.RemoteSpringApplication : Started RemoteSpringApplication in 0.74 seconds (JVM running for 1.105) +---- + +NOTE: Because the remote client is using the same classpath as the real application it can directly read application properties. +This is how the configprop:spring.devtools.remote.secret[] property is read and passed to the server for authentication. + +TIP: It is always advisable to use `https://` as the connection protocol, so that traffic is encrypted and passwords cannot be intercepted. + +TIP: If you need to use a proxy to access the remote application, configure the `spring.devtools.remote.proxy.host` and `spring.devtools.remote.proxy.port` properties. + + + +[[using-boot-devtools-remote-update]] +==== Remote Update +The remote client monitors your application classpath for changes in the same way as the <>. +Any updated resource is pushed to the remote application and (_if required_) triggers a restart. +This can be helpful if you iterate on a feature that uses a cloud service that you do not have locally. +Generally, remote updates and restarts are much quicker than a full rebuild and deploy cycle. + +NOTE: Files are only monitored when the remote client is running. +If you change a file before starting the remote client, it is not pushed to the remote server. + + + +[[configuring-file-system-watcher]] +==== Configuring File System Watcher +{spring-boot-devtools-module-code}/filewatch/FileSystemWatcher.java[FileSystemWatcher] works by polling the class changes with a certain time interval, and then waiting for a predefined quiet period to make sure there are no more changes. +The changes are then uploaded to the remote application. +On a slower development environment, it may happen that the quiet period is not enough, and the changes in the classes may be split into batches. +The server is restarted after the first batch of class changes is uploaded. +The next batch can’t be sent to the application, since the server is restarting. + +This is typically manifested by a warning in the `RemoteSpringApplication` logs about failing to upload some of the classes, and a consequent retry. +But it may also lead to application code inconsistency and failure to restart after the first batch of changes is uploaded. + +If you observe such problems constantly, try increasing the `spring.devtools.restart.poll-interval` and `spring.devtools.restart.quiet-period` parameters to the values that fit your development environment: + +[source,properties,indent=0,configprops] +---- + spring.devtools.restart.poll-interval=2s + spring.devtools.restart.quiet-period=1s +---- + +The monitored classpath folders are now polled every 2 seconds for changes, and a 1 second quiet period is maintained to make sure there are no additional class changes. + + + +[[using-boot-packaging-for-production]] +== Packaging Your Application for Production +Executable jars can be used for production deployment. +As they are self-contained, they are also ideally suited for cloud-based deployment. + +For additional "`production ready`" features, such as health, auditing, and metric REST or JMX end-points, consider adding `spring-boot-actuator`. +See _<>_ for details. + + + +[[using-boot-whats-next]] +== What to Read Next +You should now understand how you can use Spring Boot and some best practices that you should follow. +You can now go on to learn about specific _<>_ in depth, or you could skip ahead and read about the "`<>`" aspects of Spring Boot. diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc deleted file mode 100644 index 1afb9c5e92..0000000000 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc +++ /dev/null @@ -1,78 +0,0 @@ -:numbered!: -[appendix] -[[common-application-properties]] -= Common Application properties -include::{asciidoc-sources-root}/attributes.adoc[] - -Various properties can be specified inside your `application.properties` file, inside your `application.yml` file, or as command line switches. -This appendix provides a list of common Spring Boot properties and references to the underlying classes that consume them. - -TIP: Spring Boot provides various conversion mechanism with advanced value formatting, make sure to review <>. - -NOTE: Property contributions can come from additional jar files on your classpath, so you should not consider this an exhaustive list. -Also, you can define your own properties. - - -== Core properties - -include::{generated-resources-root}/config-docs/core.adoc[] - -== Cache properties - -include::{generated-resources-root}/config-docs/cache.adoc[] - -== Mail properties - -include::{generated-resources-root}/config-docs/mail.adoc[] - -== JSON properties - -include::{generated-resources-root}/config-docs/json.adoc[] - -== Data properties - -include::{generated-resources-root}/config-docs/data.adoc[] - -== Transaction properties - -include::{generated-resources-root}/config-docs/transaction.adoc[] - -== Data migration properties - -include::{generated-resources-root}/config-docs/data-migration.adoc[] - -== Integration properties - -include::{generated-resources-root}/config-docs/integration.adoc[] - -== Web properties - -include::{generated-resources-root}/config-docs/web.adoc[] - -== Templating properties - -include::{generated-resources-root}/config-docs/templating.adoc[] - -== Server properties - -include::{generated-resources-root}/config-docs/server.adoc[] - -== Security properties - -include::{generated-resources-root}/config-docs/security.adoc[] - -== RSocket properties - -include::{generated-resources-root}/config-docs/rsocket.adoc[] - -== Actuator properties - -include::{generated-resources-root}/config-docs/actuator.adoc[] - -== Devtools properties - -include::{generated-resources-root}/config-docs/devtools.adoc[] - -== Testing properties - -include::{generated-resources-root}/config-docs/testing.adoc[] diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-auto-configuration-classes.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-auto-configuration-classes.adoc deleted file mode 100644 index bfcbcf2101..0000000000 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-auto-configuration-classes.adoc +++ /dev/null @@ -1,24 +0,0 @@ -[appendix] -[[auto-configuration-classes]] -= Auto-configuration Classes -include::{asciidoc-sources-root}/attributes.adoc[] - -This appendix contains details of all of the auto-configuration classes provided by Spring Boot, with links to documentation and source code. -Remember to also look at the conditions report in your application for more details of which features are switched on. -(To do so, start the app with `--debug` or `-Ddebug` or, in an Actuator application, use the `conditions` endpoint). - - - -[[auto-configuration-classes-from-autoconfigure-module]] -== `spring-boot-autoconfigure` -The following auto-configuration classes are from the `spring-boot-autoconfigure` module: - -include::{generated-resources-root}/auto-configuration-classes-spring-boot-autoconfigure.adoc[] - - - -[[auto-configuration-classes-from-actuator]] -== `spring-boot-actuator-autoconfigure` -The following auto-configuration classes are from the `spring-boot-actuator-autoconfigure` module: - -include::{generated-resources-root}/auto-configuration-classes-spring-boot-actuator-autoconfigure.adoc[] diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-configuration-metadata.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-configuration-metadata.adoc deleted file mode 100644 index 83c266bb29..0000000000 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-configuration-metadata.adoc +++ /dev/null @@ -1,860 +0,0 @@ -[appendix] -[[configuration-metadata]] -= Configuration Metadata -include::{asciidoc-sources-root}/attributes.adoc[] - -Spring Boot jars include metadata files that provide details of all supported configuration properties. -The files are designed to let IDE developers offer contextual help and "`code completion`" as users are working with `application.properties` or `application.yml` files. - -The majority of the metadata file is generated automatically at compile time by processing all items annotated with `@ConfigurationProperties`. -However, it is possible to <> for corner cases or more advanced use cases. - - - -[[configuration-metadata-format]] -== Metadata Format -Configuration metadata files are located inside jars under `META-INF/spring-configuration-metadata.json`. -They use a simple JSON format with items categorized under either "`groups`" or "`properties`" and additional values hints categorized under "hints", as shown in the following example: - -[source,json,indent=0] ----- - {"groups": [ - { - "name": "server", - "type": "org.springframework.boot.autoconfigure.web.ServerProperties", - "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties" - }, - { - "name": "spring.jpa.hibernate", - "type": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate", - "sourceType": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties", - "sourceMethod": "getHibernate()" - } - ... - ],"properties": [ - { - "name": "server.port", - "type": "java.lang.Integer", - "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties" - }, - { - "name": "server.address", - "type": "java.net.InetAddress", - "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties" - }, - { - "name": "spring.jpa.hibernate.ddl-auto", - "type": "java.lang.String", - "description": "DDL mode. This is actually a shortcut for the \"hibernate.hbm2ddl.auto\" property.", - "sourceType": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate" - } - ... - ],"hints": [ - { - "name": "spring.jpa.hibernate.ddl-auto", - "values": [ - { - "value": "none", - "description": "Disable DDL handling." - }, - { - "value": "validate", - "description": "Validate the schema, make no changes to the database." - }, - { - "value": "update", - "description": "Update the schema if necessary." - }, - { - "value": "create", - "description": "Create the schema and destroy previous data." - }, - { - "value": "create-drop", - "description": "Create and then destroy the schema at the end of the session." - } - ] - } - ]} ----- - -Each "`property`" is a configuration item that the user specifies with a given value. -For example, `server.port` and `server.address` might be specified in `application.properties`, as follows: - -[source,properties,indent=0,configprops] ----- - server.port=9090 - server.address=127.0.0.1 ----- - -The "`groups`" are higher level items that do not themselves specify a value but instead provide a contextual grouping for properties. -For example, the `server.port` and `server.address` properties are part of the `server` group. - -NOTE: It is not required that every "`property`" has a "`group`". -Some properties might exist in their own right. - -Finally, "`hints`" are additional information used to assist the user in configuring a given property. -For example, when a developer is configuring the configprop:spring.jpa.hibernate.ddl-auto[] property, a tool can use the hints to offer some auto-completion help for the `none`, `validate`, `update`, `create`, and `create-drop` values. - - - -[[configuration-metadata-group-attributes]] -=== Group Attributes -The JSON object contained in the `groups` array can contain the attributes shown in the following table: - -[cols="1,1,4"] -|=== -| Name | Type | Purpose - -| `name` -| String -| The full name of the group. - This attribute is mandatory. - -| `type` -| String -| The class name of the data type of the group. - For example, if the group were based on a class annotated with `@ConfigurationProperties`, the attribute would contain the fully qualified name of that class. - If it were based on a `@Bean` method, it would be the return type of that method. - If the type is not known, the attribute may be omitted. - -| `description` -| String -| A short description of the group that can be displayed to users. - If no description is available, it may be omitted. - It is recommended that descriptions be short paragraphs, with the first line providing a concise summary. - The last line in the description should end with a period (`.`). - -| `sourceType` -| String -| The class name of the source that contributed this group. - For example, if the group were based on a `@Bean` method annotated with `@ConfigurationProperties`, this attribute would contain the fully qualified name of the `@Configuration` class that contains the method. - If the source type is not known, the attribute may be omitted. - -| `sourceMethod` -| String -| The full name of the method (include parenthesis and argument types) that contributed this group (for example, the name of a `@ConfigurationProperties` annotated `@Bean` method). - If the source method is not known, it may be omitted. -|=== - - - -[[configuration-metadata-property-attributes]] -=== Property Attributes -The JSON object contained in the `properties` array can contain the attributes described in the following table: - -[cols="1,1,4"] -|=== -| Name | Type | Purpose - -| `name` -| String -| The full name of the property. - Names are in lower-case period-separated form (for example, `server.address`). - This attribute is mandatory. - -| `type` -| String -| The full signature of the data type of the property (for example, `java.lang.String`) but also a full generic type (such as `java.util.Map`). - You can use this attribute to guide the user as to the types of values that they can enter. - For consistency, the type of a primitive is specified by using its wrapper counterpart (for example, `boolean` becomes `java.lang.Boolean`). - Note that this class may be a complex type that gets converted from a `String` as values are bound. - If the type is not known, it may be omitted. - -| `description` -| String -| A short description of the property that can be displayed to users. - If no description is available, it may be omitted. - It is recommended that descriptions be short paragraphs, with the first line providing a concise summary. - The last line in the description should end with a period (`.`). - -| `sourceType` -| String -| The class name of the source that contributed this property. - For example, if the property were from a class annotated with `@ConfigurationProperties`, this attribute would contain the fully qualified name of that class. - If the source type is unknown, it may be omitted. - -| `defaultValue` -| Object -| The default value, which is used if the property is not specified. - If the type of the property is an array, it can be an array of value(s). - If the default value is unknown, it may be omitted. - -| `deprecation` -| Deprecation -| Specify whether the property is deprecated. - If the field is not deprecated or if that information is not known, it may be omitted. - The next table offers more detail about the `deprecation` attribute. -|=== - -The JSON object contained in the `deprecation` attribute of each `properties` element can contain the following attributes: - -[cols="1,1,4"] -|=== -| Name | Type | Purpose - -| `level` -| String -| The level of deprecation, which can be either `warning` (the default) or `error`. - When a property has a `warning` deprecation level, it should still be bound in the environment. - However, when it has an `error` deprecation level, the property is no longer managed and is not bound. - -| `reason` -| String -| A short description of the reason why the property was deprecated. - If no reason is available, it may be omitted. - It is recommended that descriptions be short paragraphs, with the first line providing a concise summary. - The last line in the description should end with a period (`.`). - -| `replacement` -| String -| The full name of the property that _replaces_ this deprecated property. - If there is no replacement for this property, it may be omitted. -|=== - -NOTE: Prior to Spring Boot 1.3, a single `deprecated` boolean attribute can be used instead of the `deprecation` element. -This is still supported in a deprecated fashion and should no longer be used. -If no reason and replacement are available, an empty `deprecation` object should be set. - -Deprecation can also be specified declaratively in code by adding the `@DeprecatedConfigurationProperty` annotation to the getter exposing the deprecated property. -For instance, assume that the `app.acme.target` property was confusing and was renamed to `app.acme.name`. -The following example shows how to handle that situation: - -[source,java,indent=0] ----- - @ConfigurationProperties("app.acme") - public class AcmeProperties { - - private String name; - - public String getName() { ... } - - public void setName(String name) { ... } - - @DeprecatedConfigurationProperty(replacement = "app.acme.name") - @Deprecated - public String getTarget() { - return getName(); - } - - @Deprecated - public void setTarget(String target) { - setName(target); - } - } ----- - -NOTE: There is no way to set a `level`. -`warning` is always assumed, since code is still handling the property. - -The preceding code makes sure that the deprecated property still works (delegating to the `name` property behind the scenes). -Once the `getTarget` and `setTarget` methods can be removed from your public API, the automatic deprecation hint in the metadata goes away as well. -If you want to keep a hint, adding manual metadata with an `error` deprecation level ensures that users are still informed about that property. -Doing so is particularly useful when a `replacement` is provided. - - - -[[configuration-metadata-hints-attributes]] -=== Hint Attributes -The JSON object contained in the `hints` array can contain the attributes shown in the following table: - -[cols="1,1,4"] -|=== -| Name | Type | Purpose - -| `name` -| String -| The full name of the property to which this hint refers. - Names are in lower-case period-separated form (such as `spring.mvc.servlet.path`). - If the property refers to a map (such as `system.contexts`), the hint either applies to the _keys_ of the map (`system.contexts.keys`) or the _values_ (`system.contexts.values`) of the map. - This attribute is mandatory. - -| `values` -| ValueHint[] -| A list of valid values as defined by the `ValueHint` object (described in the next table). - Each entry defines the value and may have a description. - -| `providers` -| ValueProvider[] -| A list of providers as defined by the `ValueProvider` object (described later in this document). - Each entry defines the name of the provider and its parameters, if any. -|=== - -The JSON object contained in the `values` attribute of each `hint` element can contain the attributes described in the following table: - -[cols="1,1,4"] -|=== -| Name | Type | Purpose - -| `value` -| Object -| A valid value for the element to which the hint refers. - If the type of the property is an array, it can also be an array of value(s). - This attribute is mandatory. - -| `description` -| String -| A short description of the value that can be displayed to users. - If no description is available, it may be omitted. - It is recommended that descriptions be short paragraphs, with the first line providing a concise summary. - The last line in the description should end with a period (`.`). -|=== - -The JSON object contained in the `providers` attribute of each `hint` element can contain the attributes described in the following table: - -[cols="1,1,4"] -|=== -|Name | Type |Purpose - -| `name` -| String -| The name of the provider to use to offer additional content assistance for the element to which the hint refers. - -| `parameters` -| JSON object -| Any additional parameter that the provider supports (check the documentation of the provider for more details). -|=== - - - -[[configuration-metadata-repeated-items]] -=== Repeated Metadata Items -Objects with the same "`property`" and "`group`" name can appear multiple times within a metadata file. -For example, you could bind two separate classes to the same prefix, with each having potentially overlapping property names. -While the same names appearing in the metadata multiple times should not be common, consumers of metadata should take care to ensure that they support it. - - - -[[configuration-metadata-providing-manual-hints]] -== Providing Manual Hints -To improve the user experience and further assist the user in configuring a given property, you can provide additional metadata that: - -* Describes the list of potential values for a property. -* Associates a provider, to attach a well defined semantic to a property, so that a tool can discover the list of potential values based on the project's context. - - -=== Value Hint -The `name` attribute of each hint refers to the `name` of a property. -In the <>, we provide five values for the `spring.jpa.hibernate.ddl-auto` property: `none`, `validate`, `update`, `create`, and `create-drop`. -Each value may have a description as well. - -If your property is of type `Map`, you can provide hints for both the keys and the values (but not for the map itself). -The special `.keys` and `.values` suffixes must refer to the keys and the values, respectively. - -Assume a `sample.contexts` maps magic `String` values to an integer, as shown in the following example: - -[source,java,indent=0] ----- - @ConfigurationProperties("sample") - public class SampleProperties { - - private Map contexts; - // getters and setters - } ----- - -The magic values are (in this example) are `sample1` and `sample2`. -In order to offer additional content assistance for the keys, you could add the following JSON to <>: - -[source,json,indent=0] ----- - {"hints": [ - { - "name": "sample.contexts.keys", - "values": [ - { - "value": "sample1" - }, - { - "value": "sample2" - } - ] - } - ]} ----- - -TIP: We recommend that you use an `Enum` for those two values instead. -If your IDE supports it, this is by far the most effective approach to auto-completion. - - - -=== Value Providers -Providers are a powerful way to attach semantics to a property. -In this section, we define the official providers that you can use for your own hints. -However, your favorite IDE may implement some of these or none of them. -Also, it could eventually provide its own. - -NOTE: As this is a new feature, IDE vendors must catch up with how it works. -Adoption times naturally vary. - -The following table summarizes the list of supported providers: - -[cols="2,4"] -|=== -| Name | Description - -| `any` -| Permits any additional value to be provided. - -| `class-reference` -| Auto-completes the classes available in the project. - Usually constrained by a base class that is specified by the `target` parameter. - -| `handle-as` -| Handles the property as if it were defined by the type defined by the mandatory `target` parameter. - -| `logger-name` -| Auto-completes valid logger names and <>. - Typically, package and class names available in the current project can be auto-completed as well as defined groups. - -| `spring-bean-reference` -| Auto-completes the available bean names in the current project. - Usually constrained by a base class that is specified by the `target` parameter. - -| `spring-profile-name` -| Auto-completes the available Spring profile names in the project. -|=== - -TIP: Only one provider can be active for a given property, but you can specify several providers if they can all manage the property _in some way_. -Make sure to place the most powerful provider first, as the IDE must use the first one in the JSON section that it can handle. -If no provider for a given property is supported, no special content assistance is provided, either. - - - -==== Any -The special **any** provider value permits any additional values to be provided. -Regular value validation based on the property type should be applied if this is supported. - -This provider is typically used if you have a list of values and any extra values should still be considered as valid. - -The following example offers `on` and `off` as auto-completion values for `system.state`: - -[source,json,indent=0] ----- - {"hints": [ - { - "name": "system.state", - "values": [ - { - "value": "on" - }, - { - "value": "off" - } - ], - "providers": [ - { - "name": "any" - } - ] - } - ]} ----- - -Note that, in the preceding example, any other value is also allowed. - -==== Class Reference -The **class-reference** provider auto-completes classes available in the project. -This provider supports the following parameters: - -[cols="1,1,2,4"] -|=== -| Parameter | Type | Default value | Description - -| `target` -| `String` (`Class`) -| _none_ -| The fully qualified name of the class that should be assignable to the chosen value. - Typically used to filter out-non candidate classes. - Note that this information can be provided by the type itself by exposing a class with the appropriate upper bound. - -| `concrete` -| `boolean` -| true -| Specify whether only concrete classes are to be considered as valid candidates. -|=== - - -The following metadata snippet corresponds to the standard `server.servlet.jsp.class-name` property that defines the `JspServlet` class name to use: - -[source,json,indent=0] ----- - {"hints": [ - { - "name": "server.servlet.jsp.class-name", - "providers": [ - { - "name": "class-reference", - "parameters": { - "target": "javax.servlet.http.HttpServlet" - } - } - ] - } - ]} ----- - - - -==== Handle As -The **handle-as** provider lets you substitute the type of the property to a more high-level type. -This typically happens when the property has a `java.lang.String` type, because you do not want your configuration classes to rely on classes that may not be on the classpath. -This provider supports the following parameters: - -[cols="1,1,2,4"] -|=== -| Parameter | Type | Default value | Description - -| **`target`** -| `String` (`Class`) -| _none_ -| The fully qualified name of the type to consider for the property. - This parameter is mandatory. -|=== - -The following types can be used: - -* Any `java.lang.Enum`: Lists the possible values for the property. - (We recommend defining the property with the `Enum` type, as no further hint should be required for the IDE to auto-complete the values) -* `java.nio.charset.Charset`: Supports auto-completion of charset/encoding values (such as `UTF-8`) -* `java.util.Locale`: auto-completion of locales (such as `en_US`) -* `org.springframework.util.MimeType`: Supports auto-completion of content type values (such as `text/plain`) -* `org.springframework.core.io.Resource`: Supports auto-completion of Spring’s Resource abstraction to refer to a file on the filesystem or on the classpath (such as `classpath:/sample.properties`) - -TIP: If multiple values can be provided, use a `Collection` or _Array_ type to teach the IDE about it. - -The following metadata snippet corresponds to the standard `spring.liquibase.change-log` property that defines the path to the changelog to use. -It is actually used internally as a `org.springframework.core.io.Resource` but cannot be exposed as such, because we need to keep the original String value to pass it to the Liquibase API. - -[source,json,indent=0] ----- - {"hints": [ - { - "name": "spring.liquibase.change-log", - "providers": [ - { - "name": "handle-as", - "parameters": { - "target": "org.springframework.core.io.Resource" - } - } - ] - } - ]} ----- - - - -==== Logger Name -The **logger-name** provider auto-completes valid logger names and <>. -Typically, package and class names available in the current project can be auto-completed. -If groups are enabled (default) and if a custom logger group is identified in the configuration, auto-completion for it should be provided. -Specific frameworks may have extra magic logger names that can be supported as well. - -This provider supports the following parameters: - -[cols="1,1,2,4"] -|=== -| Parameter | Type | Default value | Description - -| `group` -| `boolean` -| `true` -| Specify whether known groups should be considered. -|=== - -Since a logger name can be any arbitrary name, this provider should allow any value but could highlight valid package and class names that are not available in the project's classpath. - -The following metadata snippet corresponds to the standard `logging.level` property. -Keys are _logger names_, and values correspond to the standard log levels or any custom level. -As Spring Boot defines a few logger groups out-of-the-box, dedicated value hints have been added for those. - -[source,json,indent=0] ----- - {"hints": [ - { - "name": "logging.level.keys", - "values": [ - { - "value": "root", - "description": "Root logger used to assign the default logging level." - }, - { - "value": "sql", - "description": "SQL logging group including Hibernate SQL logger." - }, - { - "value": "web", - "description": "Web logging group including codecs." - } - ], - "providers": [ - { - "name": "logger-name" - } - ] - }, - { - "name": "logging.level.values", - "values": [ - { - "value": "trace" - }, - { - "value": "debug" - }, - { - "value": "info" - }, - { - "value": "warn" - }, - { - "value": "error" - }, - { - "value": "fatal" - }, - { - "value": "off" - } - - ], - "providers": [ - { - "name": "any" - } - ] - } - ]} ----- - - - -==== Spring Bean Reference -The **spring-bean-reference** provider auto-completes the beans that are defined in the configuration of the current project. -This provider supports the following parameters: - -[cols="1,1,2,4"] -|=== -| Parameter | Type | Default value | Description - -| `target` -| `String` (`Class`) -| _none_ -| The fully qualified name of the bean class that should be assignable to the candidate. - Typically used to filter out non-candidate beans. -|=== - -The following metadata snippet corresponds to the standard `spring.jmx.server` property that defines the name of the `MBeanServer` bean to use: - -[source,json,indent=0] ----- - {"hints": [ - { - "name": "spring.jmx.server", - "providers": [ - { - "name": "spring-bean-reference", - "parameters": { - "target": "javax.management.MBeanServer" - } - } - ] - } - ]} ----- - -NOTE: The binder is not aware of the metadata. -If you provide that hint, you still need to transform the bean name into an actual Bean reference using by the `ApplicationContext`. - - - -==== Spring Profile Name -The **spring-profile-name** provider auto-completes the Spring profiles that are defined in the configuration of the current project. - -The following metadata snippet corresponds to the standard `spring.profiles.active` property that defines the name of the Spring profile(s) to enable: - -[source,json,indent=0] ----- - {"hints": [ - { - "name": "spring.profiles.active", - "providers": [ - { - "name": "spring-profile-name" - } - ] - } - ]} ----- - - - -[[configuration-metadata-annotation-processor]] -== Generating Your Own Metadata by Using the Annotation Processor -You can easily generate your own configuration metadata file from items annotated with `@ConfigurationProperties` by using the `spring-boot-configuration-processor` jar. -The jar includes a Java annotation processor which is invoked as your project is compiled. -To use the processor, include a dependency on `spring-boot-configuration-processor`. - -With Maven the dependency should be declared as optional, as shown in the following example: - -[source,xml,indent=0,subs="verbatim,quotes,attributes"] ----- - - org.springframework.boot - spring-boot-configuration-processor - true - ----- - -With Gradle 4.5 and earlier, the dependency should be declared in the `compileOnly` configuration, as shown in the following example: - -[source,groovy,indent=0,subs="verbatim,quotes,attributes"] ----- - dependencies { - compileOnly "org.springframework.boot:spring-boot-configuration-processor" - } ----- - -With Gradle 4.6 and later, the dependency should be declared in the `annotationProcessor` configuration, as shown in the following example: - -[source,groovy,indent=0,subs="verbatim,quotes,attributes"] ----- - dependencies { - annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" - } ----- - -If you are using an `additional-spring-configuration-metadata.json` file, the `compileJava` task should be configured to depend on the `processResources` task, as shown in the following example: - -[source,groovy,indent=0,subs="verbatim,quotes,attributes"] ----- - compileJava.dependsOn(processResources) ----- - -This dependency ensures that the additional metadata is available when the annotation processor runs during compilation. - -The processor picks up both classes and methods that are annotated with `@ConfigurationProperties`. -The Javadoc for field values within configuration classes is used to populate the `description` attribute. - -NOTE: You should only use simple text with `@ConfigurationProperties` field Javadoc, since they are not processed before being added to the JSON. - -If the class has a single constructor with at least one parameters, one property is created per constructor parameter. -Otherwise, properties are discovered through the presence of standard getters and setters with special handling for collection types (that is detected even if only a getter is present). - -The annotation processor also supports the use of the `@Data`, `@Getter`, and `@Setter` lombok annotations. - -The annotation processor cannot auto-detect default values for ``Enum``s and ``Collections``s. -In the cases where a `Collection` or `Enum` property has a non-empty default value, <> should be provided. - -Consider the following class: - -[source,java,indent=0,subs="verbatim,quotes,attributes"] ----- - @ConfigurationProperties(prefix = "acme.messaging") - public class MessagingProperties { - - private List addresses = new ArrayList<>(Arrays.asList("a", "b")); - - private ContainerType containerType = ContainerType.SIMPLE; - - // ... getter and setters - - public enum ContainerType { - - SIMPLE, - DIRECT - - } - - } ----- - -In order to document default values for properties in the class above, you could add the following content to <>: - -[source,json,indent=0] ----- - {"properties": [ - { - "name": "acme.messaging.addresses", - "defaultValue": ["a", "b"] - }, - { - "name": "acme.messaging.container-type", - "defaultValue": "simple" - } - ]} ----- - -Only the `name` of the property is required to document additional fields with manual metadata. - -[NOTE] -==== -If you are using AspectJ in your project, you need to make sure that the annotation processor runs only once. -There are several ways to do this. -With Maven, you can configure the `maven-apt-plugin` explicitly and add the dependency to the annotation processor only there. -You could also let the AspectJ plugin run all the processing and disable annotation processing in the `maven-compiler-plugin` configuration, as follows: - -[source,xml,indent=0,subs="verbatim,quotes,attributes"] ----- - - org.apache.maven.plugins - maven-compiler-plugin - - none - - ----- -==== - - - -[[configuration-metadata-nested-properties]] -=== Nested Properties -The annotation processor automatically considers inner classes as nested properties. -Consider the following class: - -[source,java,indent=0,subs="verbatim,quotes,attributes"] ----- - @ConfigurationProperties(prefix="server") - public class ServerProperties { - - private String name; - - private Host host; - - // ... getter and setters - - public static class Host { - - private String ip; - - private int port; - - // ... getter and setters - - } - - } ----- - -The preceding example produces metadata information for `server.name`, `server.host.ip`, and `server.host.port` properties. -You can use the `@NestedConfigurationProperty` annotation on a field to indicate that a regular (non-inner) class should be treated as if it were nested. - -TIP: This has no effect on collections and maps, as those types are automatically identified, and a single metadata property is generated for each of them. - - - -[[configuration-metadata-additional-metadata]] -=== Adding Additional Metadata -Spring Boot's configuration file handling is quite flexible, and it is often the case that properties may exist that are not bound to a `@ConfigurationProperties` bean. -You may also need to tune some attributes of an existing key. -To support such cases and let you provide custom "hints", the annotation processor automatically merges items from `META-INF/additional-spring-configuration-metadata.json` into the main metadata file. - -If you refer to a property that has been detected automatically, the description, default value, and deprecation information are overridden, if specified. -If the manual property declaration is not identified in the current module, it is added as a new property. - -The format of the `additional-spring-configuration-metadata.json` file is exactly the same as the regular `spring-configuration-metadata.json`. -The additional properties file is optional. -If you do not have any additional properties, do not add the file. diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-dependency-versions.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-dependency-versions.adoc deleted file mode 100644 index 32653b9dfa..0000000000 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-dependency-versions.adoc +++ /dev/null @@ -1,14 +0,0 @@ -[appendix] -[[dependency-versions]] -= Dependency versions -include::{asciidoc-sources-root}/attributes.adoc[] - -This appendix provides details of the dependencies that are managed by Spring Boot. - -[[dependency-versions-coordinates]] -== Managed Dependency Coordinates - -The following table provides details of all of the dependency versions that are provided by Spring Boot in its CLI (Command Line Interface), Maven dependency management, and Gradle plugin. -When you declare a dependency on one of these artifacts without declaring a version, the version listed in the table is used. - -include::{generated-resources-root}/effective-pom.adoc[] diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-executable-jar-format.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-executable-jar-format.adoc deleted file mode 100644 index 048aaee57c..0000000000 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-executable-jar-format.adoc +++ /dev/null @@ -1,281 +0,0 @@ -[appendix] -[[executable-jar]] -= The Executable Jar Format -include::{asciidoc-sources-root}/attributes.adoc[] - -The `spring-boot-loader` modules lets Spring Boot support executable jar and war files. -If you use the Maven plugin or the Gradle plugin, executable jars are automatically generated, and you generally do not need to know the details of how they work. - -If you need to create executable jars from a different build system or if you are just curious about the underlying technology, this appendix provides some background. - - - -[[executable-jar-nested-jars]] -== Nested JARs -Java does not provide any standard way to load nested jar files (that is, jar files that are themselves contained within a jar). -This can be problematic if you need to distribute a self-contained application that can be run from the command line without unpacking. - -To solve this problem, many developers use "`shaded`" jars. -A shaded jar packages all classes, from all jars, into a single "`uber jar`". -The problem with shaded jars is that it becomes hard to see which libraries are actually in your application. -It can also be problematic if the same filename is used (but with different content) in multiple jars. -Spring Boot takes a different approach and lets you actually nest jars directly. - - - -[[executable-jar-jar-file-structure]] -=== The Executable Jar File Structure -Spring Boot Loader-compatible jar files should be structured in the following way: - -[indent=0] ----- - example.jar - | - +-META-INF - | +-MANIFEST.MF - +-org - | +-springframework - | +-boot - | +-loader - | +- - +-BOOT-INF - +-classes - | +-mycompany - | +-project - | +-YourClasses.class - +-lib - +-dependency1.jar - +-dependency2.jar ----- - -Application classes should be placed in a nested `BOOT-INF/classes` directory. -Dependencies should be placed in a nested `BOOT-INF/lib` directory. - - - -[[executable-jar-war-file-structure]] -=== The Executable War File Structure -Spring Boot Loader-compatible war files should be structured in the following way: - -[indent=0] ----- - example.war - | - +-META-INF - | +-MANIFEST.MF - +-org - | +-springframework - | +-boot - | +-loader - | +- - +-WEB-INF - +-classes - | +-com - | +-mycompany - | +-project - | +-YourClasses.class - +-lib - | +-dependency1.jar - | +-dependency2.jar - +-lib-provided - +-servlet-api.jar - +-dependency3.jar ----- - -Dependencies should be placed in a nested `WEB-INF/lib` directory. -Any dependencies that are required when running embedded but are not required when deploying to a traditional web container should be placed in `WEB-INF/lib-provided`. - - - -[[executable-jar-jarfile]] -== Spring Boot's "`JarFile`" Class -The core class used to support loading nested jars is `org.springframework.boot.loader.jar.JarFile`. -It lets you load jar content from a standard jar file or from nested child jar data. -When first loaded, the location of each `JarEntry` is mapped to a physical file offset of the outer jar, as shown in the following example: - -[indent=0] ----- - myapp.jar - +-------------------+-------------------------+ - | /BOOT-INF/classes | /BOOT-INF/lib/mylib.jar | - |+-----------------+||+-----------+----------+| - || A.class ||| B.class | C.class || - |+-----------------+||+-----------+----------+| - +-------------------+-------------------------+ - ^ ^ ^ - 0063 3452 3980 ----- - -The preceding example shows how `A.class` can be found in `/BOOT-INF/classes` in `myapp.jar` at position `0063`. -`B.class` from the nested jar can actually be found in `myapp.jar` at position `3452`, and `C.class` is at position `3980`. - -Armed with this information, we can load specific nested entries by seeking to the appropriate part of the outer jar. -We do not need to unpack the archive, and we do not need to read all entry data into memory. - - - -[[executable-jar-jarfile-compatibility]] -=== Compatibility with the Standard Java "`JarFile`" -Spring Boot Loader strives to remain compatible with existing code and libraries. -`org.springframework.boot.loader.jar.JarFile` extends from `java.util.jar.JarFile` and should work as a drop-in replacement. -The `getURL()` method returns a `URL` that opens a connection compatible with `java.net.JarURLConnection` and can be used with Java's `URLClassLoader`. - - - -[[executable-jar-launching]] -== Launching Executable Jars -The `org.springframework.boot.loader.Launcher` class is a special bootstrap class that is used as an executable jar's main entry point. -It is the actual `Main-Class` in your jar file, and it is used to setup an appropriate `URLClassLoader` and ultimately call your `main()` method. - -There are three launcher subclasses (`JarLauncher`, `WarLauncher`, and `PropertiesLauncher`). -Their purpose is to load resources (`.class` files and so on) from nested jar files or war files in directories (as opposed to those explicitly on the classpath). -In the case of `JarLauncher` and `WarLauncher`, the nested paths are fixed. -`JarLauncher` looks in `BOOT-INF/lib/`, and `WarLauncher` looks in `WEB-INF/lib/` and `WEB-INF/lib-provided/`. -You can add extra jars in those locations if you want more. -The `PropertiesLauncher` looks in `BOOT-INF/lib/` in your application archive by default. -You can add additional locations by setting an environment variable called `LOADER_PATH` or `loader.path` in `loader.properties` (which is a comma-separated list of directories, archives, or directories within archives). - - - -[[executable-jar-launcher-manifest]] -=== Launcher Manifest -You need to specify an appropriate `Launcher` as the `Main-Class` attribute of `META-INF/MANIFEST.MF`. -The actual class that you want to launch (that is, the class that contains a `main` method) should be specified in the `Start-Class` attribute. - -The following example shows a typical `MANIFEST.MF` for an executable jar file: - -[indent=0] ----- - Main-Class: org.springframework.boot.loader.JarLauncher - Start-Class: com.mycompany.project.MyApplication ----- - -For a war file, it would be as follows: - -[indent=0] ----- - Main-Class: org.springframework.boot.loader.WarLauncher - Start-Class: com.mycompany.project.MyApplication ----- - -NOTE: You need not specify `Class-Path` entries in your manifest file. -The classpath is deduced from the nested jars. - - - -[[executable-jar-property-launcher-features]] -== `PropertiesLauncher` Features -`PropertiesLauncher` has a few special features that can be enabled with external properties (System properties, environment variables, manifest entries, or `loader.properties`). -The following table describes these properties: - -|=== -| Key | Purpose - -| `loader.path` -| Comma-separated Classpath, such as `lib,$\{HOME}/app/lib`. - Earlier entries take precedence, like a regular `-classpath` on the `javac` command line. - -| `loader.home` -| Used to resolve relative paths in `loader.path`. - For example, given `loader.path=lib`, then `${loader.home}/lib` is a classpath location (along with all jar files in that directory). - This property is also used to locate a `loader.properties` file, as in the following example `file:///opt/app` It defaults to `${user.dir}`. - -| `loader.args` -| Default arguments for the main method (space separated). - -| `loader.main` -| Name of main class to launch (for example, `com.app.Application`). - -| `loader.config.name` -| Name of properties file (for example, `launcher`). - It defaults to `loader`. - -| `loader.config.location` -| Path to properties file (for example, `classpath:loader.properties`). - It defaults to `loader.properties`. - -| `loader.system` -| Boolean flag to indicate that all properties should be added to System properties. - It defaults to `false`. -|=== - -When specified as environment variables or manifest entries, the following names should be used: - -|=== -| Key | Manifest entry | Environment variable - -| `loader.path` -| `Loader-Path` -| `LOADER_PATH` - -| `loader.home` -| `Loader-Home` -| `LOADER_HOME` - -| `loader.args` -| `Loader-Args` -| `LOADER_ARGS` - -| `loader.main` -| `Start-Class` -| `LOADER_MAIN` - -| `loader.config.location` -| `Loader-Config-Location` -| `LOADER_CONFIG_LOCATION` - -| `loader.system` -| `Loader-System` -| `LOADER_SYSTEM` -|=== - -TIP: Build plugins automatically move the `Main-Class` attribute to `Start-Class` when the fat jar is built. -If you use that, specify the name of the class to launch by using the `Main-Class` attribute and leaving out `Start-Class`. - -The following rules apply to working with `PropertiesLauncher`: - -* `loader.properties` is searched for in `loader.home`, then in the root of the classpath, and then in `classpath:/BOOT-INF/classes`. - The first location where a file with that name exists is used. -* `loader.home` is the directory location of an additional properties file (overriding the default) only when `loader.config.location` is not specified. -* `loader.path` can contain directories (which are scanned recursively for jar and zip files), archive paths, a directory within an archive that is scanned for jar files (for example, `dependencies.jar!/lib`), or wildcard patterns (for the default JVM behavior). - Archive paths can be relative to `loader.home` or anywhere in the file system with a `jar:file:` prefix. -* `loader.path` (if empty) defaults to `BOOT-INF/lib` (meaning a local directory or a nested one if running from an archive). - Because of this, `PropertiesLauncher` behaves the same as `JarLauncher` when no additional configuration is provided. -* `loader.path` can not be used to configure the location of `loader.properties` (the classpath used to search for the latter is the JVM classpath when `PropertiesLauncher` is launched). -* Placeholder replacement is done from System and environment variables plus the properties file itself on all values before use. -* The search order for properties (where it makes sense to look in more than one place) is environment variables, system properties, `loader.properties`, the exploded archive manifest, and the archive manifest. - - - -[[executable-jar-restrictions]] -== Executable Jar Restrictions -You need to consider the following restrictions when working with a Spring Boot Loader packaged application: - - - -[[executable-jar-zip-entry-compression]] -* Zip entry compression: -The `ZipEntry` for a nested jar must be saved by using the `ZipEntry.STORED` method. -This is required so that we can seek directly to individual content within the nested jar. -The content of the nested jar file itself can still be compressed, as can any other entries in the outer jar. - - - -[[executable-jar-system-classloader]] -* System classLoader: -Launched applications should use `Thread.getContextClassLoader()` when loading classes (most libraries and frameworks do so by default). -Trying to load nested jar classes with `ClassLoader.getSystemClassLoader()` fails. -`java.util.Logging` always uses the system classloader. -For this reason, you should consider a different logging implementation. - - - -[[executable-jar-alternatives]] -== Alternative Single Jar Solutions -If the preceding restrictions mean that you cannot use Spring Boot Loader, consider the following alternatives: - -* https://maven.apache.org/plugins/maven-shade-plugin/[Maven Shade Plugin] -* http://www.jdotsoft.com/JarClassLoader.php[JarClassLoader] -* https://sourceforge.net/projects/one-jar/[OneJar] -* https://imperceptiblethoughts.com/shadow/[Gradle Shadow Plugin] - diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-test-auto-configuration.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-test-auto-configuration.adoc deleted file mode 100644 index a354ff5081..0000000000 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-test-auto-configuration.adoc +++ /dev/null @@ -1,13 +0,0 @@ -[appendix] -[[test-auto-configuration]] -= Test Auto-configuration Annotations -include::{asciidoc-sources-root}/attributes.adoc[] - -This appendix describes the `@…Test` auto-configuration annotations that Spring Boot provides to test slices of your application. - -[[test-auto-configuration-slices]] -== Test Slices - -The following table lists the various `@…Test` annotations that can be used to test slices of your application and the auto-configuration that they import by default: - -include::{generated-resources-root}/test-slice-auto-configuration.adoc[] diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/attributes.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/attributes.adoc deleted file mode 100644 index a7ba014987..0000000000 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/attributes.adoc +++ /dev/null @@ -1,108 +0,0 @@ -:doctype: book -:idprefix: -:idseparator: - -:toc: left -:toclevels: 4 -:tabsize: 4 -:numbered: -:sectanchors: -:sectnums: -:icons: font -:hide-uri-scheme: -:docinfo: shared,private - -:spring-boot-artifactory-repo: snapshot -:github-tag: master -:spring-boot-version: current - -:github-repo: spring-projects/spring-boot -:github-raw: https://raw.githubusercontent.com/{github-repo}/{github-tag} -:github-issues: https://github.com/{github-repo}/issues/ -:github-wiki: https://github.com/{github-repo}/wiki - -:code-examples: {sources-root}/main/java/org/springframework/boot/docs -:test-examples: {sources-root}/test/java/org/springframework/boot/docs - -:spring-boot-code: https://github.com/{github-repo}/tree/{github-tag} -:spring-boot-api: https://docs.spring.io/spring-boot/docs/{spring-boot-version}/api/ -:spring-boot-docs: https://docs.spring.io/spring-boot/docs/{spring-boot-version}/reference -:spring-boot-master-code: https://github.com/{github-repo}/tree/master -:spring-boot-current-docs: https://docs.spring.io/spring-boot/docs/current/reference -:spring-boot-actuator-restapi: https://docs.spring.io/spring-boot/docs/{spring-boot-version}/actuator-api/ -:spring-boot-maven-plugin-docs: https://docs.spring.io/spring-boot/docs/{spring-boot-version}/maven-plugin/html/ -:spring-boot-gradle-plugin-docs: https://docs.spring.io/spring-boot/docs/{spring-boot-version}/gradle-plugin/reference/html/ -:spring-boot-gradle-plugin-pdfdocs: https://docs.spring.io/spring-boot/docs/{spring-boot-version}/gradle-plugin/reference/pdf/spring-boot-gradle-plugin-reference.pdf -:spring-boot-gradle-plugin-api: https://docs.spring.io/spring-boot/docs/{spring-boot-version}/gradle-plugin/reference/api/ - -:spring-boot-module-code: {spring-boot-code}/spring-boot-project/spring-boot/src/main/java/org/springframework/boot -:spring-boot-module-api: {spring-boot-api}/org/springframework/boot -:spring-boot-autoconfigure-module-code: {spring-boot-code}/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure -:spring-boot-autoconfigure-module-api: {spring-boot-api}/org/springframework/boot/autoconfigure -:spring-boot-actuator-module-code: {spring-boot-code}/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate -:spring-boot-actuator-module-api: {spring-boot-api}/org/springframework/boot/actuate -:spring-boot-actuator-autoconfigure-module-code: {spring-boot-code}/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure -:spring-boot-actuator-autoconfigure-module-api: : {spring-boot-api}/org/springframework/boot/actuate/autoconfigure -:spring-boot-cli-module-code: {spring-boot-code}/spring-boot-project/spring-boot-cli/src/main/java/org/springframework/boot/cli -:spring-boot-cli-module-api: {spring-boot-api}/org/springframework/boot/cli -:spring-boot-devtools-module-code: {spring-boot-code}/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools -:spring-boot-devtools-module-api: {spring-boot-api}/org/springframework/boot/devtools -:spring-boot-test-module-code: {spring-boot-code}/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test -:spring-boot-test-module-api: {spring-boot-api}/org/springframework/boot/test -:spring-boot-test-autoconfigure-module-code: {spring-boot-code}/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure -:spring-boot-test-autoconfigure-module-api: {spring-boot-api}/org/springframework/boot/test/autoconfigure - -:spring-amqp-api: https://docs.spring.io/spring-amqp/docs/{spring-amqp-version}/api/org/springframework/amqp -:spring-batch: https://spring.io/projects/spring-batch -:spring-batch-api: https://docs.spring.io/spring-batch/docs/{spring-batch-version}/api/org/springframework/batch -:spring-batch-docs: https://docs.spring.io/spring-batch/docs/{spring-batch-version}/reference/html/ -:spring-data: https://spring.io/projects/spring-data -:spring-data-cassandra: https://spring.io/projects/spring-data-cassandra -:spring-data-commons-api: https://docs.spring.io/spring-data/commons/docs/{spring-data-commons-version}/api/org/springframework/data -:spring-data-couchbase: https://spring.io/projects/spring-data-couchbase -:spring-data-couchbase-docs: https://docs.spring.io/spring-data/couchbase/docs/{spring-data-couchbase-version}/reference/html/ -:spring-data-elasticsearch: https://spring.io/projects/spring-data-elasticsearch -:spring-data-elasticsearch-docs: https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/ -:spring-data-gemfire: https://spring.io/projects/spring-data-gemfire -:spring-data-geode: https://spring.io/projects/spring-data-geode -:spring-data-jpa: https://spring.io/projects/spring-data-jpa -:spring-data-jpa-api: https://docs.spring.io/spring-data/jpa/docs/{spring-data-jpa-version}/api/org/springframework/data/jpa -:spring-data-jdbc-docs: https://docs.spring.io/spring-data/jdbc/docs/{spring-data-jdbc-version}/reference/html/ -:spring-data-ldap: https://spring.io/projects/spring-data-ldap -:spring-data-mongodb: https://spring.io/projects/spring-data-mongodb -:spring-data-mongodb-api: https://docs.spring.io/spring-data/mongodb/docs/{spring-data-mongodb-version}/api/org/springframework/data/mongodb -:spring-data-neo4j: https://spring.io/projects/spring-data-neo4j -:spring-data-neo4j-docs: https://docs.spring.io/spring-data/neo4j/docs/{spring-data-neo4j-version}/reference/html/ -:spring-data-redis: https://spring.io/projects/spring-data-redis -:spring-data-rest-api: https://docs.spring.io/spring-data/rest/docs/{spring-data-rest-version}/api/org/springframework/data/rest -:spring-data-solr: https://spring.io/projects/spring-data-solr -:spring-data-solr-docs: https://docs.spring.io/spring-data/solr/docs/{spring-data-solr-version}/reference/html/ -:spring-framework: https://spring.io/projects/spring-framework -:spring-framework-api: https://docs.spring.io/spring/docs/{spring-framework-version}/javadoc-api/org/springframework -:spring-framework-docs: https://docs.spring.io/spring/docs/{spring-framework-version}/spring-framework-reference/ -:spring-initializr-docs: https://docs.spring.io/initializr/docs/current/reference/html/ -:spring-integration: https://spring.io/projects/spring-integration -:spring-integration-docs: https://docs.spring.io/spring-integration/docs/{spring-integration-version}/reference/html/ -:spring-restdocs: https://spring.io/projects/spring-restdocs -:spring-security: https://spring.io/projects/spring-security -:spring-security-docs: https://docs.spring.io/spring-security/site/docs/{spring-security-version}/reference/htmlsingle/ -:spring-security-oauth2: https://spring.io/projects/spring-security-oauth -:spring-security-oauth2-docs: https://projects.spring.io/spring-security-oauth/docs/oauth2.html -:spring-session: https://spring.io/projects/spring-session -:spring-webservices-docs: https://docs.spring.io/spring-ws/docs/{spring-webservices-version}/reference/ - - - - -:ant-docs: https://ant.apache.org/manual -:dependency-management-plugin-code: https://github.com/spring-gradle-plugins/dependency-management-plugin -:gradle-docs: https://docs.gradle.org/current/userguide -:hibernate-docs: https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html -:java-api: https://docs.oracle.com/javase/8/docs/api/ -:jetty-docs: https://www.eclipse.org/jetty/documentation/{jetty-version} -:jooq-docs: https://www.jooq.org/doc/{jooq-version}/manual-single-page -:junit5-docs: https://junit.org/junit5/docs/current/user-guide -:kotlin-docs: https://kotlinlang.org/docs/reference/ -:micrometer-docs: https://micrometer.io/docs -:micrometer-concepts-docs: {micrometer-docs}/concepts -:micrometer-registry-docs: {micrometer-docs}/registry -:tomcat-docs: https://tomcat.apache.org/tomcat-9.0-doc diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/using-spring-boot.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/using-spring-boot.adoc deleted file mode 100644 index b9977e9a31..0000000000 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/using-spring-boot.adoc +++ /dev/null @@ -1,1039 +0,0 @@ -[[using-boot]] -= Using Spring Boot -include::attributes.adoc[] - -This section goes into more detail about how you should use Spring Boot. -It covers topics such as build systems, auto-configuration, and how to run your applications. -We also cover some Spring Boot best practices. -Although there is nothing particularly special about Spring Boot (it is just another library that you can consume), there are a few recommendations that, when followed, make your development process a little easier. - -If you are starting out with Spring Boot, you should probably read the _<>_ guide before diving into this section. - - - -[[using-boot-build-systems]] -== Build Systems -It is strongly recommended that you choose a build system that supports <> and that can consume artifacts published to the "`Maven Central`" repository. -We would recommend that you choose Maven or Gradle. -It is possible to get Spring Boot to work with other build systems (Ant, for example), but they are not particularly well supported. - - - -[[using-boot-dependency-management]] -=== Dependency Management -Each release of Spring Boot provides a curated list of dependencies that it supports. -In practice, you do not need to provide a version for any of these dependencies in your build configuration, as Spring Boot manages that for you. -When you upgrade Spring Boot itself, these dependencies are upgraded as well in a consistent way. - -NOTE: You can still specify a version and override Spring Boot's recommendations if you need to do so. - -The curated list contains all the spring modules that you can use with Spring Boot as well as a refined list of third party libraries. -The list is available as a standard <> that can be used with both <> and <>. - -WARNING: Each release of Spring Boot is associated with a base version of the Spring Framework. -We **highly** recommend that you not specify its version. - - - -[[using-boot-maven]] -=== Maven -Maven users can inherit from the `spring-boot-starter-parent` project to obtain sensible defaults. -The parent project provides the following features: - -* Java 1.8 as the default compiler level. -* UTF-8 source encoding. -* A <>, inherited from the spring-boot-dependencies pom, that manages the versions of common dependencies. -This dependency management lets you omit tags for those dependencies when used in your own pom. -* An execution of the {spring-boot-maven-plugin-docs}/repackage-mojo.html[`repackage` goal] with a `repackage` execution id. -* Sensible https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html[resource filtering]. -* Sensible plugin configuration (https://www.mojohaus.org/exec-maven-plugin/[exec plugin], https://github.com/ktoso/maven-git-commit-id-plugin[Git commit ID], and https://maven.apache.org/plugins/maven-shade-plugin/[shade]). -* Sensible resource filtering for `application.properties` and `application.yml` including profile-specific files (for example, `application-dev.properties` and `application-dev.yml`) - -Note that, since the `application.properties` and `application.yml` files accept Spring style placeholders (`${...}`), the Maven filtering is changed to use `@..@` placeholders. -(You can override that by setting a Maven property called `resource.delimiter`.) - - - -[[using-boot-maven-parent-pom]] -==== Inheriting the Starter Parent -To configure your project to inherit from the `spring-boot-starter-parent`, set the `parent` as follows: - -[source,xml,indent=0,subs="verbatim,quotes,attributes"] ----- - - - org.springframework.boot - spring-boot-starter-parent - {spring-boot-version} - ----- - -NOTE: You should need to specify only the Spring Boot version number on this dependency. -If you import additional starters, you can safely omit the version number. - -With that setup, you can also override individual dependencies by overriding a property in your own project. -For instance, to upgrade to another Spring Data release train, you would add the following to your `pom.xml`: - -[source,xml,indent=0,subs="verbatim,quotes,attributes"] ----- - - Fowler-SR2 - ----- - -TIP: Check the {spring-boot-code}/spring-boot-project/spring-boot-dependencies/pom.xml[`spring-boot-dependencies` pom] for a list of supported properties. - - - -[[using-boot-maven-without-a-parent]] -==== Using Spring Boot without the Parent POM -Not everyone likes inheriting from the `spring-boot-starter-parent` POM. -You may have your own corporate standard parent that you need to use or you may prefer to explicitly declare all your Maven configuration. - -If you do not want to use the `spring-boot-starter-parent`, you can still keep the benefit of the dependency management (but not the plugin management) by using a `scope=import` dependency, as follows: - -[source,xml,indent=0,subs="verbatim,quotes,attributes"] ----- - - - - - org.springframework.boot - spring-boot-dependencies - {spring-boot-version} - pom - import - - - ----- - -The preceding sample setup does not let you override individual dependencies by using a property, as explained above. -To achieve the same result, you need to add an entry in the `dependencyManagement` of your project **before** the `spring-boot-dependencies` entry. -For instance, to upgrade to another Spring Data release train, you could add the following element to your `pom.xml`: - -[source,xml,indent=0,subs="verbatim,quotes,attributes"] ----- - - - - - org.springframework.data - spring-data-releasetrain - Fowler-SR2 - pom - import - - - org.springframework.boot - spring-boot-dependencies - {spring-boot-version} - pom - import - - - ----- - -NOTE: In the preceding example, we specify a _BOM_, but any dependency type can be overridden in the same way. - - - -[[using-boot-maven-plugin]] -==== Using the Spring Boot Maven Plugin -Spring Boot includes a <> that can package the project as an executable jar. -Add the plugin to your `` section if you want to use it, as shown in the following example: - -[source,xml,indent=0,subs="verbatim,quotes,attributes"] ----- - - - - org.springframework.boot - spring-boot-maven-plugin - - - ----- - -NOTE: If you use the Spring Boot starter parent pom, you need to add only the plugin. -There is no need to configure it unless you want to change the settings defined in the parent. - - - -[[using-boot-gradle]] -=== Gradle -To learn about using Spring Boot with Gradle, please refer to the documentation for Spring Boot's Gradle plugin: - -* Reference ({spring-boot-gradle-plugin-docs}[HTML] and {spring-boot-gradle-plugin-pdfdocs}[PDF]) -* {spring-boot-gradle-plugin-api}[API] - - - -[[using-boot-ant]] -=== Ant -It is possible to build a Spring Boot project using Apache Ant+Ivy. -The `spring-boot-antlib` "`AntLib`" module is also available to help Ant create executable jars. - -To declare dependencies, a typical `ivy.xml` file looks something like the following example: - -[source,xml,indent=0] ----- - - - - - - - - - - ----- - -A typical `build.xml` looks like the following example: - -[source,xml,indent=0,subs="verbatim,quotes,attributes"] ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ----- - -TIP: If you do not want to use the `spring-boot-antlib` module, see the _<>_ "`How-to`" . - - - -[[using-boot-starter]] -=== Starters -Starters are a set of convenient dependency descriptors that you can include in your application. -You get a one-stop shop for all the Spring and related technologies that you need without having to hunt through sample code and copy-paste loads of dependency descriptors. -For example, if you want to get started using Spring and JPA for database access, include the `spring-boot-starter-data-jpa` dependency in your project. - -The starters contain a lot of the dependencies that you need to get a project up and running quickly and with a consistent, supported set of managed transitive dependencies. - -.What's in a name -**** -All **official** starters follow a similar naming pattern; `+spring-boot-starter-*+`, where `+*+` is a particular type of application. -This naming structure is intended to help when you need to find a starter. -The Maven integration in many IDEs lets you search dependencies by name. -For example, with the appropriate Eclipse or STS plugin installed, you can press `ctrl-space` in the POM editor and type "`spring-boot-starter`" for a complete list. - -As explained in the "`<>`" section, third party starters should not start with `spring-boot`, as it is reserved for official Spring Boot artifacts. -Rather, a third-party starter typically starts with the name of the project. -For example, a third-party starter project called `thirdpartyproject` would typically be named `thirdpartyproject-spring-boot-starter`. -**** - -The following application starters are provided by Spring Boot under the `org.springframework.boot` group: - -.Spring Boot application starters -include::{generated-resources-root}/application-starters.adoc[] - -In addition to the application starters, the following starters can be used to add _<>_ features: - -.Spring Boot production starters -include::{generated-resources-root}/production-starters.adoc[] - -Finally, Spring Boot also includes the following starters that can be used if you want to exclude or swap specific technical facets: - -.Spring Boot technical starters -include::{generated-resources-root}/technical-starters.adoc[] - -TIP: For a list of additional community contributed starters, see the {spring-boot-master-code}/spring-boot-project/spring-boot-starters/README.adoc[README file] in the `spring-boot-starters` module on GitHub. - - - -[[using-boot-structuring-your-code]] -== Structuring Your Code -Spring Boot does not require any specific code layout to work. -However, there are some best practices that help. - - - -[[using-boot-using-the-default-package]] -=== Using the "`default`" Package -When a class does not include a `package` declaration, it is considered to be in the "`default package`". -The use of the "`default package`" is generally discouraged and should be avoided. -It can cause particular problems for Spring Boot applications that use the `@ComponentScan`, `@ConfigurationPropertiesScan`, `@EntityScan`, or `@SpringBootApplication` annotations, since every class from every jar is read. - -TIP: We recommend that you follow Java's recommended package naming conventions and use a reversed domain name (for example, `com.example.project`). - - - -[[using-boot-locating-the-main-class]] -=== Locating the Main Application Class -We generally recommend that you locate your main application class in a root package above other classes. -The <> is often placed on your main class, and it implicitly defines a base "`search package`" for certain items. -For example, if you are writing a JPA application, the package of the `@SpringBootApplication` annotated class is used to search for `@Entity` items. -Using a root package also allows component scan to apply only on your project. - -TIP: If you don't want to use `@SpringBootApplication`, the `@EnableAutoConfiguration` and `@ComponentScan` annotations that it imports defines that behaviour so you can also use those instead. - -The following listing shows a typical layout: - -[indent=0] ----- - com - +- example - +- myapplication - +- Application.java - | - +- customer - | +- Customer.java - | +- CustomerController.java - | +- CustomerService.java - | +- CustomerRepository.java - | - +- order - +- Order.java - +- OrderController.java - +- OrderService.java - +- OrderRepository.java ----- - -The `Application.java` file would declare the `main` method, along with the basic `@SpringBootApplication`, as follows: - -[source,java,indent=0] ----- - package com.example.myapplication; - - import org.springframework.boot.SpringApplication; - import org.springframework.boot.autoconfigure.SpringBootApplication; - - @SpringBootApplication - public class Application { - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } - - } ----- - - - -[[using-boot-configuration-classes]] -== Configuration Classes -Spring Boot favors Java-based configuration. -Although it is possible to use `SpringApplication` with XML sources, we generally recommend that your primary source be a single `@Configuration` class. -Usually the class that defines the `main` method is a good candidate as the primary `@Configuration`. - -TIP: Many Spring configuration examples have been published on the Internet that use XML configuration. -If possible, always try to use the equivalent Java-based configuration. -Searching for `+Enable*+` annotations can be a good starting point. - - - -[[using-boot-importing-configuration]] -=== Importing Additional Configuration Classes -You need not put all your `@Configuration` into a single class. -The `@Import` annotation can be used to import additional configuration classes. -Alternatively, you can use `@ComponentScan` to automatically pick up all Spring components, including `@Configuration` classes. - - - -[[using-boot-importing-xml-configuration]] -=== Importing XML Configuration -If you absolutely must use XML based configuration, we recommend that you still start with a `@Configuration` class. -You can then use an `@ImportResource` annotation to load XML configuration files. - - - -[[using-boot-auto-configuration]] -== Auto-configuration -Spring Boot auto-configuration attempts to automatically configure your Spring application based on the jar dependencies that you have added. -For example, if `HSQLDB` is on your classpath, and you have not manually configured any database connection beans, then Spring Boot auto-configures an in-memory database. - -You need to opt-in to auto-configuration by adding the `@EnableAutoConfiguration` or `@SpringBootApplication` annotations to one of your `@Configuration` classes. - -TIP: You should only ever add one `@SpringBootApplication` or `@EnableAutoConfiguration` annotation. -We generally recommend that you add one or the other to your primary `@Configuration` class only. - - - -[[using-boot-replacing-auto-configuration]] -=== Gradually Replacing Auto-configuration -Auto-configuration is non-invasive. -At any point, you can start to define your own configuration to replace specific parts of the auto-configuration. -For example, if you add your own `DataSource` bean, the default embedded database support backs away. - -If you need to find out what auto-configuration is currently being applied, and why, start your application with the `--debug` switch. -Doing so enables debug logs for a selection of core loggers and logs a conditions report to the console. - - - -[[using-boot-disabling-specific-auto-configuration]] -=== Disabling Specific Auto-configuration Classes -If you find that specific auto-configuration classes that you do not want are being applied, you can use the exclude attribute of `@EnableAutoConfiguration` to disable them, as shown in the following example: - -[source,java,indent=0] ----- - import org.springframework.boot.autoconfigure.*; - import org.springframework.boot.autoconfigure.jdbc.*; - import org.springframework.context.annotation.*; - - @Configuration(proxyBeanMethods = false) - @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) - public class MyConfiguration { - } ----- - -If the class is not on the classpath, you can use the `excludeName` attribute of the annotation and specify the fully qualified name instead. -Finally, you can also control the list of auto-configuration classes to exclude by using the configprop:spring.autoconfigure.exclude[] property. - -TIP: You can define exclusions both at the annotation level and by using the property. - -NOTE: Even though auto-configuration classes are `public`, the only aspect of the class that is considered public API is the name of the class which can be used for disabling the auto-configuration. -The actual contents of those classes, such as nested configuration classes or bean methods are for internal use only and we do not recommend using those directly. - - - -[[using-boot-spring-beans-and-dependency-injection]] -== Spring Beans and Dependency Injection -You are free to use any of the standard Spring Framework techniques to define your beans and their injected dependencies. -For simplicity, we often find that using `@ComponentScan` (to find your beans) and using `@Autowired` (to do constructor injection) works well. - -If you structure your code as suggested above (locating your application class in a root package), you can add `@ComponentScan` without any arguments. -All of your application components (`@Component`, `@Service`, `@Repository`, `@Controller` etc.) are automatically registered as Spring Beans. - -The following example shows a `@Service` Bean that uses constructor injection to obtain a required `RiskAssessor` bean: - -[source,java,indent=0] ----- - package com.example.service; - - import org.springframework.beans.factory.annotation.Autowired; - import org.springframework.stereotype.Service; - - @Service - public class DatabaseAccountService implements AccountService { - - private final RiskAssessor riskAssessor; - - @Autowired - public DatabaseAccountService(RiskAssessor riskAssessor) { - this.riskAssessor = riskAssessor; - } - - // ... - - } ----- - -If a bean has one constructor, you can omit the `@Autowired`, as shown in the following example: - -[source,java,indent=0] ----- - @Service - public class DatabaseAccountService implements AccountService { - - private final RiskAssessor riskAssessor; - - public DatabaseAccountService(RiskAssessor riskAssessor) { - this.riskAssessor = riskAssessor; - } - - // ... - - } ----- - -TIP: Notice how using constructor injection lets the `riskAssessor` field be marked as `final`, indicating that it cannot be subsequently changed. - - - -[[using-boot-using-springbootapplication-annotation]] -== Using the @SpringBootApplication Annotation -Many Spring Boot developers like their apps to use auto-configuration, component scan and be able to define extra configuration on their "application class". -A single `@SpringBootApplication` annotation can be used to enable those three features, that is: - -* `@EnableAutoConfiguration`: enable <> -* `@ComponentScan`: enable `@Component` scan on the package where the application is located (see <>) -* `@Configuration`: allow to register extra beans in the context or import additional configuration classes - -[source,java,indent=0] ----- - package com.example.myapplication; - - import org.springframework.boot.SpringApplication; - import org.springframework.boot.autoconfigure.SpringBootApplication; - - @SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan - public class Application { - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } - - } ----- - -NOTE: `@SpringBootApplication` also provides aliases to customize the attributes of `@EnableAutoConfiguration` and `@ComponentScan`. - -[NOTE] -==== -None of these features are mandatory and you may choose to replace this single annotation by any of the features that it enables. -For instance, you may not want to use component scan or configuration properties scan in your application: - -[source,java,indent=0] ----- - package com.example.myapplication; - - import org.springframework.boot.SpringApplication; - import org.springframework.context.annotation.ComponentScan - import org.springframework.context.annotation.Configuration; - import org.springframework.context.annotation.Import; - - @Configuration(proxyBeanMethods = false) - @EnableAutoConfiguration - @Import({ MyConfig.class, MyAnotherConfig.class }) - public class Application { - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } - - } ----- - -In this example, `Application` is just like any other Spring Boot application except that `@Component`-annotated classes and `@ConfigurationProperties`-annotated classes are not detected automatically and the user-defined beans are imported explicitly (see `@Import`). -==== - - - -[[using-boot-running-your-application]] -== Running Your Application -One of the biggest advantages of packaging your application as a jar and using an embedded HTTP server is that you can run your application as you would any other. -Debugging Spring Boot applications is also easy. -You do not need any special IDE plugins or extensions. - -NOTE: This section only covers jar based packaging. -If you choose to package your application as a war file, you should refer to your server and IDE documentation. - - - -[[using-boot-running-from-an-ide]] -=== Running from an IDE -You can run a Spring Boot application from your IDE as a simple Java application. -However, you first need to import your project. -Import steps vary depending on your IDE and build system. -Most IDEs can import Maven projects directly. -For example, Eclipse users can select `Import...` -> `Existing Maven Projects` from the `File` menu. - -If you cannot directly import your project into your IDE, you may be able to generate IDE metadata by using a build plugin. -Maven includes plugins for https://maven.apache.org/plugins/maven-eclipse-plugin/[Eclipse] and https://maven.apache.org/plugins/maven-idea-plugin/[IDEA]. -Gradle offers plugins for {gradle-docs}/userguide.html[various IDEs]. - -TIP: If you accidentally run a web application twice, you see a "`Port already in use`" error. -STS users can use the `Relaunch` button rather than the `Run` button to ensure that any existing instance is closed. - - - -[[using-boot-running-as-a-packaged-application]] -=== Running as a Packaged Application -If you use the Spring Boot Maven or Gradle plugins to create an executable jar, you can run your application using `java -jar`, as shown in the following example: - -[indent=0,subs="attributes"] ----- - $ java -jar target/myapplication-0.0.1-SNAPSHOT.jar ----- - -It is also possible to run a packaged application with remote debugging support enabled. -Doing so lets you attach a debugger to your packaged application, as shown in the following example: - -[indent=0,subs="attributes"] ----- - $ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \ - -jar target/myapplication-0.0.1-SNAPSHOT.jar ----- - - - -[[using-boot-running-with-the-maven-plugin]] -=== Using the Maven Plugin -The Spring Boot Maven plugin includes a `run` goal that can be used to quickly compile and run your application. -Applications run in an exploded form, as they do in your IDE. -The following example shows a typical Maven command to run a Spring Boot application: - -[indent=0,subs="attributes"] ----- - $ mvn spring-boot:run ----- - -You might also want to use the `MAVEN_OPTS` operating system environment variable, as shown in the following example: - -[indent=0,subs="attributes"] ----- - $ export MAVEN_OPTS=-Xmx1024m ----- - - - -[[using-boot-running-with-the-gradle-plugin]] -=== Using the Gradle Plugin -The Spring Boot Gradle plugin also includes a `bootRun` task that can be used to run your application in an exploded form. -The `bootRun` task is added whenever you apply the `org.springframework.boot` and `java` plugins and is shown in the following example: - -[indent=0,subs="attributes"] ----- - $ gradle bootRun ----- - -You might also want to use the `JAVA_OPTS` operating system environment variable, as shown in the following example: - -[indent=0,subs="attributes"] ----- - $ export JAVA_OPTS=-Xmx1024m ----- - - - -[[using-boot-hot-swapping]] -=== Hot Swapping -Since Spring Boot applications are just plain Java applications, JVM hot-swapping should work out of the box. -JVM hot swapping is somewhat limited with the bytecode that it can replace. -For a more complete solution, https://jrebel.com/software/jrebel/[JRebel] can be used. - -The `spring-boot-devtools` module also includes support for quick application restarts. -See the <> section later in this chapter and the <> for details. - - - -[[using-boot-devtools]] -== Developer Tools -Spring Boot includes an additional set of tools that can make the application development experience a little more pleasant. -The `spring-boot-devtools` module can be included in any project to provide additional development-time features. -To include devtools support, add the module dependency to your build, as shown in the following listings for Maven and Gradle: - -.Maven -[source,xml,indent=0,subs="verbatim,quotes,attributes"] ----- - - - org.springframework.boot - spring-boot-devtools - true - - ----- - -.Gradle -[source,groovy,indent=0,subs="attributes"] ----- - configurations { - developmentOnly - runtimeClasspath { - extendsFrom developmentOnly - } - } - dependencies { - developmentOnly("org.springframework.boot:spring-boot-devtools") - } ----- - -NOTE: Developer tools are automatically disabled when running a fully packaged application. -If your application is launched from `java -jar` or if it is started from a special classloader, then it is considered a "`production application`". -If that does not apply to you (i.e. if you run your application from a container), consider excluding devtools or set the `-Dspring.devtools.restart.enabled=false` system property. - -TIP: Flagging the dependency as optional in Maven or using a custom `developmentOnly` configuration in Gradle (as shown above) is a best practice that prevents devtools from being transitively applied to other modules that use your project. - -TIP: Repackaged archives do not contain devtools by default. -If you want to use a <>, you need to disable the `excludeDevtools` build property to include it. -The property is supported with both the Maven and Gradle plugins. - - - -[[using-boot-devtools-property-defaults]] -=== Property Defaults -Several of the libraries supported by Spring Boot use caches to improve performance. -For example, <> cache compiled templates to avoid repeatedly parsing template files. -Also, Spring MVC can add HTTP caching headers to responses when serving static resources. - -While caching is very beneficial in production, it can be counter-productive during development, preventing you from seeing the changes you just made in your application. -For this reason, spring-boot-devtools disables the caching options by default. - -Cache options are usually configured by settings in your `application.properties` file. -For example, Thymeleaf offers the configprop:spring.thymeleaf.cache[] property. -Rather than needing to set these properties manually, the `spring-boot-devtools` module automatically applies sensible development-time configuration. - -Because you need more information about web requests while developing Spring MVC and Spring WebFlux applications, developer tools will enable `DEBUG` logging for the `web` logging group. -This will give you information about the incoming request, which handler is processing it, the response outcome, etc. -If you wish to log all request details (including potentially sensitive information), you can turn on the configprop:spring.http.log-request-details[] configuration property. - -NOTE: If you don't want property defaults to be applied you can set configprop:spring.devtools.add-properties[] to `false` in your `application.properties`. - -TIP: For a complete list of the properties that are applied by the devtools, see {spring-boot-devtools-module-code}/env/DevToolsPropertyDefaultsPostProcessor.java[DevToolsPropertyDefaultsPostProcessor]. - - - -[[using-boot-devtools-restart]] -=== Automatic Restart -Applications that use `spring-boot-devtools` automatically restart whenever files on the classpath change. -This can be a useful feature when working in an IDE, as it gives a very fast feedback loop for code changes. -By default, any entry on the classpath that points to a folder is monitored for changes. -Note that certain resources, such as static assets and view templates, <>. - -.Triggering a restart -**** -As DevTools monitors classpath resources, the only way to trigger a restart is to update the classpath. -The way in which you cause the classpath to be updated depends on the IDE that you are using. -In Eclipse, saving a modified file causes the classpath to be updated and triggers a restart. -In IntelliJ IDEA, building the project (`Build +->+ Build Project`) has the same effect. -**** - -NOTE: As long as forking is enabled, you can also start your application by using the supported build plugins (Maven and Gradle), since DevTools needs an isolated application classloader to operate properly. -By default, the Gradle and Maven plugins fork the application process. - -TIP: Automatic restart works very well when used with LiveReload. -<> for details. -If you use JRebel, automatic restarts are disabled in favor of dynamic class reloading. -Other devtools features (such as LiveReload and property overrides) can still be used. - -NOTE: DevTools relies on the application context's shutdown hook to close it during a restart. -It does not work correctly if you have disabled the shutdown hook (`SpringApplication.setRegisterShutdownHook(false)`). - -NOTE: When deciding if an entry on the classpath should trigger a restart when it changes, DevTools automatically ignores projects named `spring-boot`, `spring-boot-devtools`, `spring-boot-autoconfigure`, `spring-boot-actuator`, and `spring-boot-starter`. - -NOTE: DevTools needs to customize the `ResourceLoader` used by the `ApplicationContext`. -If your application provides one already, it is going to be wrapped. -Direct override of the `getResource` method on the `ApplicationContext` is not supported. - -[[using-spring-boot-restart-vs-reload]] -.Restart vs Reload -**** -The restart technology provided by Spring Boot works by using two classloaders. -Classes that do not change (for example, those from third-party jars) are loaded into a _base_ classloader. -Classes that you are actively developing are loaded into a _restart_ classloader. -When the application is restarted, the _restart_ classloader is thrown away and a new one is created. -This approach means that application restarts are typically much faster than "`cold starts`", since the _base_ classloader is already available and populated. - -If you find that restarts are not quick enough for your applications or you encounter classloading issues, you could consider reloading technologies such as https://jrebel.com/software/jrebel/[JRebel] from ZeroTurnaround. -These work by rewriting classes as they are loaded to make them more amenable to reloading. -**** - - - -[[using-boot-devtools-restart-logging-condition-delta]] -==== Logging changes in condition evaluation -By default, each time your application restarts, a report showing the condition evaluation delta is logged. -The report shows the changes to your application's auto-configuration as you make changes such as adding or removing beans and setting configuration properties. - -To disable the logging of the report, set the following property: - -[indent=0] ----- - spring.devtools.restart.log-condition-evaluation-delta=false ----- - - -[[using-boot-devtools-restart-exclude]] -==== Excluding Resources -Certain resources do not necessarily need to trigger a restart when they are changed. -For example, Thymeleaf templates can be edited in-place. -By default, changing resources in `/META-INF/maven`, `/META-INF/resources`, `/resources`, `/static`, `/public`, or `/templates` does not trigger a restart but does trigger a <>. -If you want to customize these exclusions, you can use the configprop:spring.devtools.restart.exclude[] property. -For example, to exclude only `/static` and `/public` you would set the following property: - -[indent=0] ----- - spring.devtools.restart.exclude=static/**,public/** ----- - -TIP: If you want to keep those defaults and _add_ additional exclusions, use the configprop:spring.devtools.restart.additional-exclude[] property instead. - - - -[[using-boot-devtools-restart-additional-paths]] -==== Watching Additional Paths -You may want your application to be restarted or reloaded when you make changes to files that are not on the classpath. -To do so, use the configprop:spring.devtools.restart.additional-paths[] property to configure additional paths to watch for changes. -You can use the configprop:spring.devtools.restart.exclude[] property <> to control whether changes beneath the additional paths trigger a full restart or a <>. - - - -[[using-boot-devtools-restart-disable]] -==== Disabling Restart -If you do not want to use the restart feature, you can disable it by using the configprop:spring.devtools.restart.enabled[] property. -In most cases, you can set this property in your `application.properties` (doing so still initializes the restart classloader, but it does not watch for file changes). - -If you need to _completely_ disable restart support (for example, because it does not work with a specific library), you need to set the configprop:spring.devtools.restart.enabled[] `System` property to `false` before calling `SpringApplication.run(...)`, as shown in the following example: - -[source,java,indent=0] ----- - public static void main(String[] args) { - System.setProperty("spring.devtools.restart.enabled", "false"); - SpringApplication.run(MyApp.class, args); - } ----- - - - -[[using-boot-devtools-restart-triggerfile]] -==== Using a Trigger File -If you work with an IDE that continuously compiles changed files, you might prefer to trigger restarts only at specific times. -To do so, you can use a "`trigger file`", which is a special file that must be modified when you want to actually trigger a restart check. - -NOTE: Any update to the file will trigger a check, but restart only actually occurs if Devtools has detected it has something to do. - -To use a trigger file, set the configprop:spring.devtools.restart.trigger-file[] property to the name (excluding any path) of your trigger file. -The trigger file must appear somewhere on your classpath. - -For example, if you have a project with the following structure: - -[indent=0] ----- - src - +- main - +- resources - +- .reloadtrigger ----- - -Then your `trigger-file` property would be: - -[source,properties,indent=0,configprops] ----- - spring.devtools.restart.trigger-file=.reloadtrigger ----- - -Restarts will now only happen when the `src/main/resources/.reloadtrigger` is updated. - -TIP: You might want to set `spring.devtools.restart.trigger-file` as a <>, so that all your projects behave in the same way. - -Some IDEs have features that save you from needing to update your trigger file manually. -https://spring.io/tools[Spring Tools for Eclipse] and https://www.jetbrains.com/idea/[IntelliJ IDEA (Ultimate Edition)] both have such support. -With Spring Tools, you can use the "`reload`" button from the console view (as long as your `trigger-file` is named `.reloadtrigger`). -For IntelliJ, you can follow the https://www.jetbrains.com/help/idea/spring-boot.html#configure-application-update-policies-with-devtools[instructions in their documentation]. - - - -[[using-boot-devtools-customizing-classload]] -==== Customizing the Restart Classloader -As described earlier in the <> section, restart functionality is implemented by using two classloaders. -For most applications, this approach works well. -However, it can sometimes cause classloading issues. - -By default, any open project in your IDE is loaded with the "`restart`" classloader, and any regular `.jar` file is loaded with the "`base`" classloader. -If you work on a multi-module project, and not every module is imported into your IDE, you may need to customize things. -To do so, you can create a `META-INF/spring-devtools.properties` file. - -The `spring-devtools.properties` file can contain properties prefixed with `restart.exclude` and `restart.include`. -The `include` elements are items that should be pulled up into the "`restart`" classloader, and the `exclude` elements are items that should be pushed down into the "`base`" classloader. -The value of the property is a regex pattern that is applied to the classpath, as shown in the following example: - -[source,properties,indent=0] ----- - restart.exclude.companycommonlibs=/mycorp-common-[\\w\\d-\.]+\.jar - restart.include.projectcommon=/mycorp-myproj-[\\w\\d-\.]+\.jar ----- - -NOTE: All property keys must be unique. -As long as a property starts with `restart.include.` or `restart.exclude.` it is considered. - -TIP: All `META-INF/spring-devtools.properties` from the classpath are loaded. -You can package files inside your project, or in the libraries that the project consumes. - - - -[[using-boot-devtools-known-restart-limitations]] -==== Known Limitations -Restart functionality does not work well with objects that are deserialized by using a standard `ObjectInputStream`. -If you need to deserialize data, you may need to use Spring's `ConfigurableObjectInputStream` in combination with `Thread.currentThread().getContextClassLoader()`. - -Unfortunately, several third-party libraries deserialize without considering the context classloader. -If you find such a problem, you need to request a fix with the original authors. - - - -[[using-boot-devtools-livereload]] -=== LiveReload -The `spring-boot-devtools` module includes an embedded LiveReload server that can be used to trigger a browser refresh when a resource is changed. -LiveReload browser extensions are freely available for Chrome, Firefox and Safari from http://livereload.com/extensions/[livereload.com]. - -If you do not want to start the LiveReload server when your application runs, you can set the configprop:spring.devtools.livereload.enabled[] property to `false`. - -NOTE: You can only run one LiveReload server at a time. -Before starting your application, ensure that no other LiveReload servers are running. -If you start multiple applications from your IDE, only the first has LiveReload support. - - - -[[using-boot-devtools-globalsettings]] -=== Global Settings -You can configure global devtools settings by adding any of the following files to the `$HOME/.config/spring-boot` folder: - -. `spring-boot-devtools.properties` -. `spring-boot-devtools.yaml` -. `spring-boot-devtools.yml` - -Any properties added to these file apply to _all_ Spring Boot applications on your machine that use devtools. -For example, to configure restart to always use a <>, you would add the following property: - -.~/.config/spring-boot/spring-boot-devtools.properties -[source,properties,indent=0,configprops] ----- - spring.devtools.restart.trigger-file=.reloadtrigger ----- - -NOTE: If devtools configuration files are not found in `$HOME/.config/spring-boot`, the root of the `$HOME` folder is searched for the presence of a `.spring-boot-devtools.properties` file. -This allows you to share the devtools global configuration with applications that are on an older version of Spring Boot that does not support the `$HOME/.config/spring-boot` location. - -NOTE: Profiles activated in the above files will not affect the loading of <>. - - - -[[using-boot-devtools-remote]] -=== Remote Applications -The Spring Boot developer tools are not limited to local development. -You can also use several features when running applications remotely. -Remote support is opt-in as enabling it can be a security risk. -It should only be enabled when running on a trusted network or when secured with SSL. -If neither of these options is available to you, you should not use DevTools' remote support. -You should never enable support on a production deployment. - -To enable it, you need to make sure that `devtools` is included in the repackaged archive, as shown in the following listing: - -[source,xml,indent=0,subs="verbatim,quotes,attributes"] ----- - - - - org.springframework.boot - spring-boot-maven-plugin - - false - - - - ----- - -Then you need to set the configprop:spring.devtools.remote.secret[] property. -Like any important password or secret, the value should be unique and strong such that it cannot be guessed or brute-forced. - -Remote devtools support is provided in two parts: a server-side endpoint that accepts connections and a client application that you run in your IDE. -The server component is automatically enabled when the configprop:spring.devtools.remote.secret[] property is set. -The client component must be launched manually. - - - -==== Running the Remote Client Application -The remote client application is designed to be run from within your IDE. -You need to run `org.springframework.boot.devtools.RemoteSpringApplication` with the same classpath as the remote project that you connect to. -The application's single required argument is the remote URL to which it connects. - -For example, if you are using Eclipse or STS and you have a project named `my-app` that you have deployed to Cloud Foundry, you would do the following: - -* Select `Run Configurations...` from the `Run` menu. -* Create a new `Java Application` "`launch configuration`". -* Browse for the `my-app` project. -* Use `org.springframework.boot.devtools.RemoteSpringApplication` as the main class. -* Add `+++https://myapp.cfapps.io+++` to the `Program arguments` (or whatever your remote URL is). - -A running remote client might resemble the following listing: - -[indent=0,subs="attributes"] ----- - . ____ _ __ _ _ - /\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \ - ( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \ - \\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) ) - ' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / / - =========|_|==============|___/===================================/_/_/_/ - :: Spring Boot Remote :: {spring-boot-version} - - 2015-06-10 18:25:06.632 INFO 14938 --- [ main] o.s.b.devtools.RemoteSpringApplication : Starting RemoteSpringApplication on pwmbp with PID 14938 (/Users/pwebb/projects/spring-boot/code/spring-boot-project/spring-boot-devtools/target/classes started by pwebb in /Users/pwebb/projects/spring-boot/code) - 2015-06-10 18:25:06.671 INFO 14938 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2a17b7b6: startup date [Wed Jun 10 18:25:06 PDT 2015]; root of context hierarchy - 2015-06-10 18:25:07.043 WARN 14938 --- [ main] o.s.b.d.r.c.RemoteClientConfiguration : The connection to http://localhost:8080 is insecure. You should use a URL starting with 'https://'. - 2015-06-10 18:25:07.074 INFO 14938 --- [ main] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 - 2015-06-10 18:25:07.130 INFO 14938 --- [ main] o.s.b.devtools.RemoteSpringApplication : Started RemoteSpringApplication in 0.74 seconds (JVM running for 1.105) ----- - -NOTE: Because the remote client is using the same classpath as the real application it can directly read application properties. -This is how the configprop:spring.devtools.remote.secret[] property is read and passed to the server for authentication. - -TIP: It is always advisable to use `https://` as the connection protocol, so that traffic is encrypted and passwords cannot be intercepted. - -TIP: If you need to use a proxy to access the remote application, configure the `spring.devtools.remote.proxy.host` and `spring.devtools.remote.proxy.port` properties. - - - -[[using-boot-devtools-remote-update]] -==== Remote Update -The remote client monitors your application classpath for changes in the same way as the <>. -Any updated resource is pushed to the remote application and (_if required_) triggers a restart. -This can be helpful if you iterate on a feature that uses a cloud service that you do not have locally. -Generally, remote updates and restarts are much quicker than a full rebuild and deploy cycle. - -NOTE: Files are only monitored when the remote client is running. -If you change a file before starting the remote client, it is not pushed to the remote server. - - - -[[configuring-file-system-watcher]] -==== Configuring File System Watcher -{spring-boot-devtools-module-code}/filewatch/FileSystemWatcher.java[FileSystemWatcher] works by polling the class changes with a certain time interval, and then waiting for a predefined quiet period to make sure there are no more changes. -The changes are then uploaded to the remote application. -On a slower development environment, it may happen that the quiet period is not enough, and the changes in the classes may be split into batches. -The server is restarted after the first batch of class changes is uploaded. -The next batch can’t be sent to the application, since the server is restarting. - -This is typically manifested by a warning in the `RemoteSpringApplication` logs about failing to upload some of the classes, and a consequent retry. -But it may also lead to application code inconsistency and failure to restart after the first batch of changes is uploaded. - -If you observe such problems constantly, try increasing the `spring.devtools.restart.poll-interval` and `spring.devtools.restart.quiet-period` parameters to the values that fit your development environment: - -[source,properties,indent=0,configprops] ----- - spring.devtools.restart.poll-interval=2s - spring.devtools.restart.quiet-period=1s ----- - -The monitored classpath folders are now polled every 2 seconds for changes, and a 1 second quiet period is maintained to make sure there are no additional class changes. - - - -[[using-boot-packaging-for-production]] -== Packaging Your Application for Production -Executable jars can be used for production deployment. -As they are self-contained, they are also ideally suited for cloud-based deployment. - -For additional "`production ready`" features, such as health, auditing, and metric REST or JMX end-points, consider adding `spring-boot-actuator`. -See _<>_ for details. - - - -[[using-boot-whats-next]] -== What to Read Next -You should now understand how you can use Spring Boot and some best practices that you should follow. -You can now go on to learn about specific _<>_ in depth, or you could skip ahead and read about the "`<>`" aspects of Spring Boot. diff --git a/spring-boot-project/spring-boot-parent/build.gradle b/spring-boot-project/spring-boot-parent/build.gradle new file mode 100644 index 0000000000..a01df3f025 --- /dev/null +++ b/spring-boot-project/spring-boot-parent/build.gradle @@ -0,0 +1,41 @@ +plugins { + id 'java-platform' + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.deployed' +} + +description = 'Spring Boot Parent' + +javaPlatform { + allowDependencies() +} + +dependencies { + api enforcedPlatform(project(":spring-boot-project:spring-boot-dependencies")) + api enforcedPlatform('org.testcontainers:testcontainers-bom:1.12.4') + constraints { + api 'com.vaadin.external.google:android-json:0.0.20131108.vaadin1' + api 'commons-fileupload:commons-fileupload:1.4' + api 'io.mockk:mockk:1.9.3' + api 'jline:jline:2.11' + api 'net.sf.jopt-simple:jopt-simple:5.0.4' + api 'org.apache.maven:maven-plugin-api:3.6.3' + api 'org.apache.maven:maven-resolver-provider:3.6.3' + api 'org.apache.maven:maven-settings-builder:3.6.3' + api 'org.apache.maven.resolver:maven-resolver-connector-basic:1.4.1' + api 'org.apache.maven.resolver:maven-resolver-impl:1.4.1' + api 'org.apache.maven.resolver:maven-resolver-transport-file:1.4.1' + api 'org.apache.maven.resolver:maven-resolver-transport-http:1.4.1' + api 'org.apache.maven.plugin-tools:maven-plugin-annotations:3.6.0' + api 'org.apache.maven.plugins:maven-shade-plugin:3.2.1' + api 'org.apache.maven.shared:maven-common-artifact-filters:3.1.0' + api 'org.apache.maven.shared:maven-invoker:3.0.1' + api 'org.sonatype.plexus:plexus-build-api:0.0.7' + api 'org.sonatype.plexus:plexus-sec-dispatcher:1.4' + api 'org.sonatype.sisu:sisu-inject-plexus:2.6.0' + api 'org.spockframework:spock-core:1.3-groovy-2.5' + api 'org.spockframework:spock-spring:1.3-groovy-2.5' + api 'org.testng:testng:6.14.3' + + } +} \ No newline at end of file diff --git a/spring-boot-project/spring-boot-parent/pom.xml b/spring-boot-project/spring-boot-parent/pom.xml deleted file mode 100644 index b9076dc95a..0000000000 --- a/spring-boot-project/spring-boot-parent/pom.xml +++ /dev/null @@ -1,559 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-dependencies - ${revision} - ../spring-boot-dependencies - - spring-boot-parent - pom - Spring Boot Parent - Spring Boot Parent - - Pivotal Software, Inc. - https://spring.io - - - ${basedir}/../.. - false - https://github.com/spring-projects/spring-boot - scm:git:git://github.com/spring-projects/spring-boot.git - scm:git:ssh://git@github.com/spring-projects/spring-boot.git - 1.8 - UTF-8 - UTF-8 - 3.5.4 - 1.1.1 - 1.3-groovy-2.5 - 0.3.0.RELEASE - 0.1.4.BUILD-20191119.185717-2 - https://repo.spring.io/snapshot/io/spring/docresources/spring-doc-resources/0.1.4.BUILD-SNAPSHOT/spring-doc-resources-${spring-doc-resources.version}.zip - 1.12.4 - 6.14.3 - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - Github - https://github.com/spring-projects/spring-boot/issues - - - - - - org.springframework.boot - spring-boot-test-support - ${revision} - - - - - log4j - log4j - 1.2.17 - - - commons-fileupload - commons-fileupload - 1.4 - - - io.mockk - mockk - 1.9.3 - - - org.sonatype.plexus - plexus-sec-dispatcher - 1.4 - - - org.sonatype.sisu - sisu-inject-plexus - 2.6.0 - - - com.vaadin.external.google - android-json - 0.0.20131108.vaadin1 - - - jline - jline - 2.11 - - - net.sf.jopt-simple - jopt-simple - 5.0.4 - - - org.apache.commons - commons-compress - 1.19 - - - org.apache.ivy - ivy - 2.4.0 - - - org.apache.maven - maven-archiver - 3.4.0 - - - org.apache.maven - maven-artifact - ${maven.version} - - - org.apache.maven - maven-core - ${maven.version} - - - org.apache.maven - maven-model - ${maven.version} - - - org.apache.maven - maven-plugin-api - ${maven.version} - - - org.apache.maven - maven-settings - ${maven.version} - - - org.apache.maven - maven-settings-builder - ${maven.version} - - - org.apache.maven - maven-model-builder - ${maven.version} - - - org.apache.maven - maven-resolver-provider - ${maven.version} - - - org.apache.maven.resolver - maven-resolver-connector-basic - ${maven-resolver.version} - - - org.apache.maven.resolver - maven-resolver-transport-file - ${maven-resolver.version} - - - org.apache.maven.resolver - maven-resolver-transport-http - ${maven-resolver.version} - - - org.apache.maven.resolver - maven-resolver-impl - ${maven-resolver.version} - - - org.apache.maven.shared - maven-common-artifact-filters - 3.1.0 - - - org.apache.maven.plugins - maven-shade-plugin - ${maven-shade-plugin.version} - - - org.apache.maven.plugin-tools - maven-plugin-annotations - 3.6.0 - - - org.codehaus.plexus - plexus-archiver - 3.7.0 - - - org.codehaus.plexus - plexus-utils - 3.1.0 - - - org.sonatype.plexus - plexus-build-api - 0.0.7 - - - org.spockframework - spock-core - ${spock.version} - - - org.spockframework - spock-spring - ${spock.version} - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - import - pom - - - org.testng - testng - ${testng.version} - - - org.zeroturnaround - zt-zip - 1.13 - - - - - - - org.junit.jupiter - junit-jupiter - test - - - org.junit.vintage - junit-vintage-engine - test - - - org.hamcrest - hamcrest-core - - - - - org.mockito - mockito-junit-jupiter - test - - - org.assertj - assertj-core - test - - - org.mockito - mockito-core - test - - - org.hamcrest - hamcrest - test - - - org.springframework - spring-test - test - - - - - - - com.googlecode.maven-download-plugin - download-maven-plugin - 1.4.2 - - - org.jetbrains.kotlin - kotlin-maven-plugin - ${kotlin.version} - - ${java.version} - true - - - - org.asciidoctor - asciidoctor-maven-plugin - 1.6.0 - - - org.asciidoctor - asciidoctorj-pdf - 1.5.0-alpha.18 - - - - - org.apache.maven.plugins - maven-failsafe-plugin - - - - integration-test - verify - - - - - - org.apache.maven.plugins - maven-plugin-plugin - 3.6.0 - - - org.basepom.maven - duplicate-finder-maven-plugin - 1.3.0 - - - org.codehaus.cargo - cargo-maven2-plugin - 1.7.7 - - - org.codehaus.gmavenplus - gmavenplus-plugin - 1.8.0 - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - regex-property - - regex-property - - - modulename - ${project.artifactId} - - - . - true - - - - - - org.codehaus.mojo - flatten-maven-plugin - true - - - - flatten - process-resources - - flatten - - - true - oss - - expand - remove - remove - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - ${java.version} - ${java.version} - true - - - - org.apache.maven.plugins - maven-enforcer-plugin - - - enforce-rules - - enforce - - - - - - com.zaxxer:HikariCP-* - org.hamcrest:hamcrest-* - javax.*:*:* - - - javax.batch:*:* - javax.cache:*:* - javax.inject:*:* - javax.money:*:* - - true - - - [1.8,) - - - [3.5.0,) - - - main.basedir - - - project.name - - - project.description - - - true - - - true - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - false - - false - false - - - ${project.name} - ${modulename} - ${project.version} - Spring - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*Tests.java - - - **/Abstract*.java - - - file:/dev/./urandom - true - - -Xmx1024m - false - true - alphabetical - - - - org.apache.maven.plugins - maven-war-plugin - - - org.apache.maven.plugins - maven-source-plugin - - - attach-sources - - jar-no-fork - - - - - - - - - fast - - - fast - - - - true - - - - full - - - full - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - - ${java.version} - - - - attach-javadocs - - jar - - true - - - - - org.apache.commons - commons-lang3 - 3.7 - - - - - - - - eclipse.profile - - - m2e.version - - - - false - false - false - false - - - - diff --git a/spring-boot-project/spring-boot-properties-migrator/build.gradle b/spring-boot-project/spring-boot-properties-migrator/build.gradle new file mode 100644 index 0000000000..5ef68ecb10 --- /dev/null +++ b/spring-boot-project/spring-boot-properties-migrator/build.gradle @@ -0,0 +1,18 @@ +plugins { + id 'java-library' + id 'maven-publish' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Properties Migrator' + +dependencies { + implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + implementation project(':spring-boot-project:spring-boot') + implementation project(':spring-boot-project:spring-boot-tools:spring-boot-configuration-metadata') + + testImplementation project(':spring-boot-project:spring-boot-test') + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.assertj:assertj-core' + testImplementation 'org.springframework:spring-test' +} \ No newline at end of file diff --git a/spring-boot-project/spring-boot-properties-migrator/pom.xml b/spring-boot-project/spring-boot-properties-migrator/pom.xml deleted file mode 100644 index da34e62b70..0000000000 --- a/spring-boot-project/spring-boot-properties-migrator/pom.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-parent - ${revision} - ../spring-boot-parent - - spring-boot-properties-migrator - Spring Boot Properties Migrator - Spring Boot Properties Migrator - - ${basedir}/../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - - org.springframework.boot - spring-boot - - - org.springframework.boot - spring-boot-configuration-metadata - - - - org.springframework.boot - spring-boot-test - test - - - diff --git a/spring-boot-project/spring-boot-starters/pom.xml b/spring-boot-project/spring-boot-starters/pom.xml deleted file mode 100644 index 6bffde0ba0..0000000000 --- a/spring-boot-project/spring-boot-starters/pom.xml +++ /dev/null @@ -1,174 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-parent - ${revision} - ../spring-boot-parent - - spring-boot-starters - pom - Spring Boot Starters - Spring Boot Starters - - ${basedir}/../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - spring-boot-starter - spring-boot-starter-activemq - spring-boot-starter-amqp - spring-boot-starter-aop - spring-boot-starter-artemis - spring-boot-starter-batch - spring-boot-starter-cache - spring-boot-starter-cloud-connectors - spring-boot-starter-data-cassandra - spring-boot-starter-data-cassandra-reactive - spring-boot-starter-data-couchbase - spring-boot-starter-data-couchbase-reactive - spring-boot-starter-data-elasticsearch - spring-boot-starter-data-jdbc - spring-boot-starter-data-jpa - spring-boot-starter-data-ldap - spring-boot-starter-data-mongodb - spring-boot-starter-data-mongodb-reactive - spring-boot-starter-data-neo4j - spring-boot-starter-data-redis - spring-boot-starter-data-redis-reactive - spring-boot-starter-data-rest - spring-boot-starter-data-solr - spring-boot-starter-freemarker - spring-boot-starter-groovy-templates - spring-boot-starter-hateoas - spring-boot-starter-integration - spring-boot-starter-jdbc - spring-boot-starter-jersey - spring-boot-starter-jetty - spring-boot-starter-jooq - spring-boot-starter-json - spring-boot-starter-jta-atomikos - spring-boot-starter-jta-bitronix - spring-boot-starter-logging - spring-boot-starter-log4j2 - spring-boot-starter-mail - spring-boot-starter-mustache - spring-boot-starter-actuator - spring-boot-starter-oauth2-client - spring-boot-starter-oauth2-resource-server - spring-boot-starter-parent - spring-boot-starter-quartz - spring-boot-starter-reactor-netty - spring-boot-starter-rsocket - spring-boot-starter-security - spring-boot-starter-test - spring-boot-starter-thymeleaf - spring-boot-starter-tomcat - spring-boot-starter-undertow - spring-boot-starter-validation - spring-boot-starter-web - spring-boot-starter-webflux - spring-boot-starter-websocket - spring-boot-starter-web-services - - - - - org.apache.maven.plugins - maven-enforcer-plugin - - - enforce-rules - - enforce - - - - - - commons-logging:*:* - org.hibernate:hibernate-validator:* - - true - - - - true - - - - - - maven-assembly-plugin - false - - - assemble-starter-poms - generate-resources - - single - - - - src/main/assembly/starter-poms-assembly.xml - - - - - - - org.apache.maven.plugins - maven-checkstyle-plugin - - - checkstyle-validation - validate - - check - - - true - - - - - - org.apache.maven.plugins - maven-source-plugin - - true - - - - org.basepom.maven - duplicate-finder-maven-plugin - - - duplicate-dependencies - validate - - check - - - true - - .*module-info - - - changelog.txt - about.html - - - - - - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-activemq/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-activemq/build.gradle new file mode 100644 index 0000000000..aac1103f14 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-activemq/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for JMS messaging using Apache ActiveMQ" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'org.springframework:spring-jms' + api ('org.apache.activemq:activemq-broker') { + exclude group: 'org.apache.geronimo.specs', module: 'geronimo-jms_1.1_spec' + } + api 'jakarta.jms:jakarta.jms-api' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-activemq/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-activemq/pom.xml deleted file mode 100644 index 11bfe14e5b..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-activemq/pom.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-activemq - Spring Boot ActiveMQ Starter - Starter for JMS messaging using Apache ActiveMQ - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework - spring-jms - - - org.apache.activemq - activemq-broker - - - geronimo-jms_1.1_spec - org.apache.geronimo.specs - - - - - jakarta.jms - jakarta.jms-api - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-actuator/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-actuator/build.gradle new file mode 100644 index 0000000000..96a273b712 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-actuator/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Spring Boot's Actuator which provides production ready features to help you monitor and manage your application" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api project(':spring-boot-project:spring-boot-actuator-autoconfigure') + api 'io.micrometer:micrometer-core' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-actuator/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-actuator/pom.xml deleted file mode 100644 index c381b6c5df..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-actuator/pom.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-actuator - Spring Boot Actuator Starter - Starter for using Spring Boot's Actuator which provides production - ready features to help you monitor and manage your application - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-actuator-autoconfigure - - - io.micrometer - micrometer-core - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-amqp/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-amqp/build.gradle new file mode 100644 index 0000000000..83197a3b18 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-amqp/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Spring AMQP and Rabbit MQ" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'org.springframework:spring-messaging' + api 'org.springframework.amqp:spring-rabbit' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-amqp/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-amqp/pom.xml deleted file mode 100644 index d3d470ad70..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-amqp/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-amqp - Spring Boot AMQP Starter - Starter for using Spring AMQP and Rabbit MQ - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework - spring-messaging - - - org.springframework.amqp - spring-rabbit - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-aop/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-aop/build.gradle new file mode 100644 index 0000000000..c5959cadb6 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-aop/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for aspect-oriented programming with Spring AOP and AspectJ" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'org.springframework:spring-aop' + api 'org.aspectj:aspectjweaver' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-aop/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-aop/pom.xml deleted file mode 100644 index bb697fb54f..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-aop/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-aop - Spring Boot AOP Starter - Starter for aspect-oriented programming with Spring AOP and AspectJ - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework - spring-aop - - - org.aspectj - aspectjweaver - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-artemis/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-artemis/build.gradle new file mode 100644 index 0000000000..033a409c93 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-artemis/build.gradle @@ -0,0 +1,18 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for JMS messaging using Apache Artemis" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'jakarta.jms:jakarta.jms-api' + api 'jakarta.json:jakarta.json-api' + api 'org.springframework:spring-jms' + api ('org.apache.activemq:artemis-jms-client') { + exclude group: 'commons-logging', module: 'commons-logging' + exclude group: 'org.apache.geronimo.specs', module: 'geronimo-jms_2.0_spec' + exclude group: 'org.apache.geronimo.specs', module: 'geronimo-json_1.0_spec' + } +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-artemis/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-artemis/pom.xml deleted file mode 100644 index e9d8dffddd..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-artemis/pom.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-artemis - Spring Boot Artemis Starter - Starter for JMS messaging using Apache Artemis - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework - spring-jms - - - org.apache.activemq - artemis-jms-client - - - geronimo-jms_2.0_spec - org.apache.geronimo.specs - - - - - jakarta.jms - jakarta.jms-api - - - jakarta.json - jakarta.json-api - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-batch/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-batch/build.gradle new file mode 100644 index 0000000000..36eeadbba9 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-batch/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Spring Batch" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jdbc') + api 'org.springframework.batch:spring-batch-core' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-batch/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-batch/pom.xml deleted file mode 100644 index 24d2499495..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-batch/pom.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-batch - Spring Boot Batch Starter - Starter for using Spring Batch - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-jdbc - - - org.springframework.batch - spring-batch-core - - - - - - org.basepom.maven - duplicate-finder-maven-plugin - - - duplicate-dependencies - validate - - check - - - - - - - xpp3 - xpp3_min - - - xmlpull - xmlpull - - - - - - - - - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-cache/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-cache/build.gradle new file mode 100644 index 0000000000..14614a195d --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-cache/build.gradle @@ -0,0 +1,11 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Spring Framework's caching support" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'org.springframework:spring-context-support' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-cache/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-cache/pom.xml deleted file mode 100644 index 45c6796929..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-cache/pom.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-cache - Spring Boot Cache Starter - Starter for using Spring Framework's caching support - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework - spring-context-support - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-cloud-connectors/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-cloud-connectors/build.gradle new file mode 100644 index 0000000000..50400b1566 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-cloud-connectors/build.gradle @@ -0,0 +1,14 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Spring Cloud Connectors which simplifies connecting to services in cloud platforms like Cloud Foundry and Heroku" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'org.springframework.cloud:spring-cloud-spring-service-connector' + api 'org.springframework.cloud:spring-cloud-cloudfoundry-connector' + api 'org.springframework.cloud:spring-cloud-heroku-connector' + api 'org.springframework.cloud:spring-cloud-localconfig-connector' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-cloud-connectors/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-cloud-connectors/pom.xml deleted file mode 100644 index 012ad17567..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-cloud-connectors/pom.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-cloud-connectors - Spring Boot Spring Cloud Connectors Starter - Starter for using Spring Cloud Connectors which simplifies connecting - to services in cloud platforms like Cloud Foundry and Heroku. Deprecated in - favor of Java CFEnv - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.cloud - spring-cloud-spring-service-connector - - - org.springframework.cloud - spring-cloud-cloudfoundry-connector - - - org.springframework.cloud - spring-cloud-heroku-connector - - - org.springframework.cloud - spring-cloud-localconfig-connector - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-cassandra-reactive/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-cassandra-reactive/build.gradle new file mode 100644 index 0000000000..0f870c33e6 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-cassandra-reactive/build.gradle @@ -0,0 +1,13 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Cassandra distributed database and Spring Data Cassandra Reactive" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'org.springframework:spring-tx' + api 'org.springframework.data:spring-data-cassandra' + api 'io.projectreactor:reactor-core' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-cassandra-reactive/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-cassandra-reactive/pom.xml deleted file mode 100644 index 8202656b75..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-cassandra-reactive/pom.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-data-cassandra-reactive - Spring Boot Data Cassandra Reactive Starter - Starter for using Cassandra distributed database and Spring Data - Cassandra Reactive - - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework - spring-tx - - - org.springframework.data - spring-data-cassandra - - - org.slf4j - jcl-over-slf4j - - - - - io.projectreactor - reactor-core - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-cassandra/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-cassandra/build.gradle new file mode 100644 index 0000000000..06219aed30 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-cassandra/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Cassandra distributed database and Spring Data Cassandra" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'org.springframework:spring-tx' + api 'org.springframework.data:spring-data-cassandra' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-cassandra/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-cassandra/pom.xml deleted file mode 100644 index 12524d9c2d..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-cassandra/pom.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-data-cassandra - Spring Boot Data Cassandra Starter - Starter for using Cassandra distributed database and Spring Data - Cassandra - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework - spring-tx - - - org.springframework.data - spring-data-cassandra - - - org.slf4j - jcl-over-slf4j - - - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-couchbase-reactive/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-couchbase-reactive/build.gradle new file mode 100644 index 0000000000..b2969f80c3 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-couchbase-reactive/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Couchbase document-oriented database and Spring Data Couchbase Reactive" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'io.projectreactor:reactor-core' + api 'io.reactivex:rxjava-reactive-streams' + api ('org.springframework.data:spring-data-couchbase') { + exclude group: 'com.couchbase.client', module: 'encryption' + } +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-couchbase-reactive/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-couchbase-reactive/pom.xml deleted file mode 100644 index 6e159e0447..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-couchbase-reactive/pom.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-data-couchbase-reactive - Spring Boot Data Couchbase Reactive Starter - Starter for using Couchbase document-oriented database and Spring Data - Couchbase Reactive - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.data - spring-data-couchbase - - - org.slf4j - jcl-over-slf4j - - - com.couchbase.mock - CouchbaseMock - - - com.couchbase.client - encryption - - - - - io.projectreactor - reactor-core - - - io.reactivex - rxjava-reactive-streams - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-couchbase/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-couchbase/build.gradle new file mode 100644 index 0000000000..b551d58880 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-couchbase/build.gradle @@ -0,0 +1,13 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Couchbase document-oriented database and Spring Data Couchbase" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api ('org.springframework.data:spring-data-couchbase') { + exclude group: 'com.couchbase.client', module: 'encryption' + } +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-couchbase/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-couchbase/pom.xml deleted file mode 100644 index 62f40f704a..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-couchbase/pom.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - 4.0.0 - - spring-boot-starters - org.springframework.boot - ${revision} - - spring-boot-starter-data-couchbase - Spring Boot Data Couchbase Starter - Starter for using Couchbase document-oriented database and Spring Data - Couchbase - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.data - spring-data-couchbase - - - org.slf4j - jcl-over-slf4j - - - com.couchbase.mock - CouchbaseMock - - - com.couchbase.client - encryption - - - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-elasticsearch/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-elasticsearch/build.gradle new file mode 100644 index 0000000000..bc78b8ba50 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-elasticsearch/build.gradle @@ -0,0 +1,11 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Elasticsearch search and analytics engine and Spring Data Elasticsearch" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'org.springframework.data:spring-data-elasticsearch' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-elasticsearch/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-elasticsearch/pom.xml deleted file mode 100644 index 18e4b779b7..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-elasticsearch/pom.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-data-elasticsearch - Spring Boot Data Elasticsearch Starter - Starter for using Elasticsearch search and analytics engine and Spring - Data Elasticsearch - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.data - spring-data-elasticsearch - - - org.slf4j - jcl-over-slf4j - - - org.apache.logging.log4j - log4j-core - - - - - - - - org.basepom.maven - duplicate-finder-maven-plugin - - - duplicate-dependencies - validate - - check - - - - org.joda.time.base.BaseDateTime - .*module-info - - - changelog.txt - - - - - - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-jdbc/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-jdbc/build.gradle new file mode 100644 index 0000000000..010e9a905e --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-jdbc/build.gradle @@ -0,0 +1,11 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Spring Data JDBC" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jdbc') + api 'org.springframework.data:spring-data-jdbc' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-jdbc/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-jdbc/pom.xml deleted file mode 100644 index 0e6e909c8c..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-jdbc/pom.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-data-jdbc - Spring Boot Data JDBC Starter - Starter for using Spring Data JDBC - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter-jdbc - - - org.springframework.data - spring-data-jdbc - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-jpa/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-jpa/build.gradle new file mode 100644 index 0000000000..0b74593c60 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-jpa/build.gradle @@ -0,0 +1,23 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Spring Data JPA with Hibernate" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-aop') + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jdbc') + api 'jakarta.transaction:jakarta.transaction-api' + api 'jakarta.persistence:jakarta.persistence-api' + api ('org.hibernate:hibernate-core') { + exclude group: 'javax.activation', module: 'javax.activation-api' + exclude group: 'javax.persistence', module: 'javax.persistence-api' + exclude group: 'javax.xml.bind', module: 'jaxb-api' + exclude group: 'org.jboss.spec.javax.transaction', module: 'jboss-transaction-api_1.2_spec' + } + api ('org.springframework.data:spring-data-jpa') { + exclude group: 'org.aspectj', module: 'aspectjrt' + } + api 'org.springframework:spring-aspects' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-jpa/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-jpa/pom.xml deleted file mode 100644 index 1a4c0ba8fc..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-jpa/pom.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-data-jpa - Spring Boot Data JPA Starter - Starter for using Spring Data JPA with Hibernate - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter-aop - - - org.springframework.boot - spring-boot-starter-jdbc - - - jakarta.activation - jakarta.activation-api - - - jakarta.persistence - jakarta.persistence-api - - - jakarta.transaction - jakarta.transaction-api - - - org.hibernate - hibernate-core - - - org.jboss.spec.javax.transaction - jboss-transaction-api_1.2_spec - - - javax.activation - javax.activation-api - - - javax.persistence - javax.persistence-api - - - javax.xml.bind - jaxb-api - - - - - org.springframework.data - spring-data-jpa - - - org.aspectj - aspectjrt - - - org.slf4j - jcl-over-slf4j - - - - - org.springframework - spring-aspects - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-ldap/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-ldap/build.gradle new file mode 100644 index 0000000000..397e51d579 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-ldap/build.gradle @@ -0,0 +1,11 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Spring Data LDAP" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'org.springframework.data:spring-data-ldap' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-ldap/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-ldap/pom.xml deleted file mode 100644 index fbdda52b11..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-ldap/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - 4.0.0 - - spring-boot-starters - org.springframework.boot - ${revision} - - spring-boot-starter-data-ldap - Spring Boot Data LDAP Starter - Starter for using Spring Data LDAP - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.data - spring-data-ldap - - - org.slf4j - jcl-over-slf4j - - - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-mongodb-reactive/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-mongodb-reactive/build.gradle new file mode 100644 index 0000000000..e32f7f97a3 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-mongodb-reactive/build.gradle @@ -0,0 +1,17 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using MongoDB document-oriented database and Spring Data MongoDB Reactive" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'io.projectreactor:reactor-core' + api 'org.mongodb:mongodb-driver' + api 'org.mongodb:mongodb-driver-async' + api 'org.mongodb:mongodb-driver-reactivestreams' + api ('org.springframework.data:spring-data-mongodb') { + exclude group: 'org.mongodb', module: 'mongo-java-driver' + } +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-mongodb-reactive/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-mongodb-reactive/pom.xml deleted file mode 100644 index 54162c3f1a..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-mongodb-reactive/pom.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-data-mongodb-reactive - Spring Boot Data MongoDB Reactive Starter - Starter for using MongoDB document-oriented database and Spring Data - MongoDB Reactive - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.data - spring-data-mongodb - - - org.mongodb - mongo-java-driver - - - org.slf4j - jcl-over-slf4j - - - - - org.mongodb - mongodb-driver - - - org.mongodb - mongodb-driver-async - - - org.mongodb - mongodb-driver-reactivestreams - - - io.projectreactor - reactor-core - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-mongodb/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-mongodb/build.gradle new file mode 100644 index 0000000000..b6b001fc84 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-mongodb/build.gradle @@ -0,0 +1,14 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using MongoDB document-oriented database and Spring Data MongoDB" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'org.mongodb:mongodb-driver' + api ('org.springframework.data:spring-data-mongodb') { + exclude group: 'org.mongodb', module: 'mongo-java-driver' + } +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-mongodb/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-mongodb/pom.xml deleted file mode 100644 index 0c6824c04d..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-mongodb/pom.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-data-mongodb - Spring Boot Data MongoDB Starter - Starter for using MongoDB document-oriented database and Spring Data - MongoDB - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.mongodb - mongodb-driver - - - org.springframework.data - spring-data-mongodb - - - org.mongodb - mongo-java-driver - - - org.slf4j - jcl-over-slf4j - - - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-neo4j/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-neo4j/build.gradle new file mode 100644 index 0000000000..b4fabd9c66 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-neo4j/build.gradle @@ -0,0 +1,11 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Neo4j graph database and Spring Data Neo4j" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'org.springframework.data:spring-data-neo4j' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-neo4j/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-neo4j/pom.xml deleted file mode 100644 index 5beaa0a271..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-neo4j/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-data-neo4j - Spring Boot Data Neo4j Starter - Starter for using Neo4j graph database and Spring Data Neo4j - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.data - spring-data-neo4j - - - org.slf4j - jcl-over-slf4j - - - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-redis-reactive/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-redis-reactive/build.gradle new file mode 100644 index 0000000000..6c1219bd4d --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-redis-reactive/build.gradle @@ -0,0 +1,10 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Redis key-value data store with Spring Data Redis reactive and the Lettuce client" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-redis') +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-redis-reactive/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-redis-reactive/pom.xml deleted file mode 100644 index adef6cad1b..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-redis-reactive/pom.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-data-redis-reactive - Spring Boot Data Redis Reactive Starter - Starter for using Redis key-value data store with Spring Data Redis - reactive and the Lettuce client - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter-data-redis - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-redis/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-redis/build.gradle new file mode 100644 index 0000000000..34dd4d4a10 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-redis/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Redis key-value data store with Spring Data Redis and the Lettuce client" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'org.springframework.data:spring-data-redis' + api 'io.lettuce:lettuce-core' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-redis/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-redis/pom.xml deleted file mode 100644 index 84b5b9e361..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-redis/pom.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-data-redis - Spring Boot Data Redis Starter - Starter for using Redis key-value data store with Spring Data Redis and - the Lettuce client - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.data - spring-data-redis - - - org.slf4j - jcl-over-slf4j - - - - - io.lettuce - lettuce-core - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-rest/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-rest/build.gradle new file mode 100644 index 0000000000..6258a7bb8d --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-rest/build.gradle @@ -0,0 +1,11 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for exposing Spring Data repositories over REST using Spring Data REST" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + api 'org.springframework.data:spring-data-rest-webmvc' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-rest/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-rest/pom.xml deleted file mode 100644 index fb21cd4b30..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-rest/pom.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-data-rest - Spring Boot Data REST Starter - Starter for exposing Spring Data repositories over REST using Spring - Data REST - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.data - spring-data-rest-webmvc - - - org.slf4j - jcl-over-slf4j - - - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-solr/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-solr/build.gradle new file mode 100644 index 0000000000..287a62e3b6 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-solr/build.gradle @@ -0,0 +1,17 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using the Apache Solr search platform with Spring Data Solr" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api ('org.apache.solr:solr-solrj') { + exclude group: 'org.slf4j', module: 'jcl-over-slf4j' + } + api 'org.springframework.data:spring-data-solr' + api ('org.apache.httpcomponents:httpmime') { + exclude group: 'commons-logging', module: 'commons-logging' + } +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-solr/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-data-solr/pom.xml deleted file mode 100644 index 87c474c8ad..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-data-solr/pom.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-data-solr - Spring Boot Data Solr Starter - Starter for using the Apache Solr search platform with Spring Data - Solr - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.apache.solr - solr-solrj - - - org.springframework.data - spring-data-solr - - - org.slf4j - jcl-over-slf4j - - - - - org.apache.httpcomponents - httpmime - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-freemarker/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-freemarker/build.gradle new file mode 100644 index 0000000000..e6151b55d3 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-freemarker/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for building MVC web applications using FreeMarker views" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'org.freemarker:freemarker' + api 'org.springframework:spring-context-support' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-freemarker/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-freemarker/pom.xml deleted file mode 100644 index f480476e44..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-freemarker/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-freemarker - Spring Boot FreeMarker Starter - Starter for building MVC web applications using FreeMarker views - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.freemarker - freemarker - - - org.springframework - spring-context-support - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-groovy-templates/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-groovy-templates/build.gradle new file mode 100644 index 0000000000..640b44e5f6 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-groovy-templates/build.gradle @@ -0,0 +1,11 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for building MVC web applications using Groovy Templates views" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + api 'org.codehaus.groovy:groovy-templates' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-groovy-templates/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-groovy-templates/pom.xml deleted file mode 100644 index 0ab1b3459e..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-groovy-templates/pom.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-groovy-templates - Spring Boot Groovy Templates Starter - Starter for building MVC web applications using Groovy Templates views - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter-web - - - org.codehaus.groovy - groovy-templates - - - - - - org.basepom.maven - duplicate-finder-maven-plugin - - - duplicate-dependencies - validate - - check - - - - - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-hateoas/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-hateoas/build.gradle new file mode 100644 index 0000000000..ca4129e0f0 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-hateoas/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for building hypermedia-based RESTful web application with Spring MVC and Spring HATEOAS" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + api 'org.springframework.hateoas:spring-hateoas' + api 'org.springframework.plugin:spring-plugin-core' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-hateoas/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-hateoas/pom.xml deleted file mode 100644 index d23fa1563a..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-hateoas/pom.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-hateoas - Spring Boot HATEOAS Starter - Starter for building hypermedia-based RESTful web application with - Spring MVC and Spring HATEOAS - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.hateoas - spring-hateoas - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-integration/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-integration/build.gradle new file mode 100644 index 0000000000..7141809230 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-integration/build.gradle @@ -0,0 +1,11 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Spring Integration" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-aop') + api 'org.springframework.integration:spring-integration-core' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-integration/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-integration/pom.xml deleted file mode 100644 index 6918380b3f..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-integration/pom.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-integration - Spring Boot Integration Starter - Starter for using Spring Integration - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter-aop - - - org.springframework.integration - spring-integration-core - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-jdbc/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-jdbc/build.gradle new file mode 100644 index 0000000000..71132155c6 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-jdbc/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using JDBC with the HikariCP connection pool" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'com.zaxxer:HikariCP' + api 'org.springframework:spring-jdbc' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-jdbc/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-jdbc/pom.xml deleted file mode 100644 index 5c1a997858..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-jdbc/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-jdbc - Spring Boot JDBC Starter - Starter for using JDBC with the HikariCP connection pool - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - com.zaxxer - HikariCP - - - org.springframework - spring-jdbc - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-jersey/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-jersey/build.gradle new file mode 100644 index 0000000000..dc8b36a02e --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-jersey/build.gradle @@ -0,0 +1,27 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for building RESTful web applications using JAX-RS and Jersey. An alternative to spring-boot-starter-web" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-json') + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-tomcat') + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-validation') + api 'org.springframework:spring-web' + api 'org.glassfish.jersey.core:jersey-server' + api 'org.glassfish.jersey.containers:jersey-container-servlet-core' + api 'org.glassfish.jersey.containers:jersey-container-servlet' + api ('org.glassfish.jersey.ext:jersey-bean-validation') { + exclude group: 'jakarta.el', module: 'jakarta.el-api' + exclude group: 'org.glassfish', module: 'jakarta.el' + } + api 'org.glassfish.jersey.ext:jersey-spring4' + api 'org.glassfish.jersey.media:jersey-media-json-jackson' +} + +checkRuntimeClasspathForConflicts { + ignore { name -> name.startsWith('org/aopalliance/intercept/') } + ignore { name -> name.startsWith('org/aopalliance/aop/') } +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-jersey/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-jersey/pom.xml deleted file mode 100644 index ee33ee1264..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-jersey/pom.xml +++ /dev/null @@ -1,176 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-jersey - Spring Boot Jersey Starter - Starter for building RESTful web applications using JAX-RS and Jersey. - An alternative to spring-boot-starter-web - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter-json - - - org.springframework.boot - spring-boot-starter-tomcat - - - org.springframework.boot - spring-boot-starter-validation - - - jakarta.annotation - jakarta.annotation-api - - - jakarta.ws.rs - jakarta.ws.rs-api - - - org.springframework - spring-web - - - org.glassfish.jersey.core - jersey-server - - - javax.validation - validation-api - - - - - org.glassfish.jersey.containers - jersey-container-servlet-core - - - org.glassfish.hk2.external - jakarta.inject - - - - - org.glassfish.jersey.containers - jersey-container-servlet - - - javax.ws.rs - javax.ws.rs-api - - - - - org.glassfish.jersey.ext - jersey-bean-validation - - - javax.validation - validation-api - - - org.glassfish - jakarta.el - - - org.hibernate - hibernate-validator - - - jakarta.el - jakarta.el-api - - - - - org.glassfish.jersey.ext - jersey-spring5 - - - org.jvnet - tiger-types - - - org.glassfish.hk2.external - bean-validator - - - org.hibernate - hibernate-validator - - - - - org.glassfish.jersey.media - jersey-media-json-jackson - - - jakarta.activation - jakarta.activation-api - - - - - jakarta.xml.bind - jakarta.xml.bind-api - - - - - - org.basepom.maven - duplicate-finder-maven-plugin - - - duplicate-dependencies - validate - - check - - - - org.aopalliance.* - javax.annotation.* - .*module-info - - - - - - - - - - jdk11+ - - [11,) - - - - jakarta.xml.bind - jakarta.xml.bind-api - - - jakarta.activation - jakarta.activation-api - - - - - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-jetty/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-jetty/build.gradle new file mode 100644 index 0000000000..c44bae2678 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-jetty/build.gradle @@ -0,0 +1,25 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Jetty as the embedded servlet container. An alternative to spring-boot-starter-tomcat" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api 'jakarta.servlet:jakarta.servlet-api' + api 'jakarta.websocket:jakarta.websocket-api' + api 'org.eclipse.jetty:jetty-servlets' + api ('org.eclipse.jetty:jetty-webapp') { + exclude group: 'javax.servlet', module: 'javax.servlet-api' + } + api ('org.eclipse.jetty.websocket:websocket-server') { + exclude group: 'javax.servlet', module: 'javax.servlet-api' + } + api ('org.eclipse.jetty.websocket:javax-websocket-server-impl') { + exclude group: 'javax.annotation', module: 'javax.annotation-api' + exclude group: 'javax.servlet', module: 'javax.servlet-api' + exclude group: 'javax.websocket', module: 'javax.websocket-api' + exclude group: 'javax.websocket', module: 'javax.websocket-client-api' + } + api 'org.mortbay.jasper:apache-el' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-jetty/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-jetty/pom.xml deleted file mode 100644 index f9bf5d3a86..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-jetty/pom.xml +++ /dev/null @@ -1,108 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-jetty - Spring Boot Jetty Starter - Starter for using Jetty as the embedded servlet container. An - alternative to spring-boot-starter-tomcat - - ${basedir}/../../.. - 3.1.0 - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - jakarta.servlet - jakarta.servlet-api - - - jakarta.websocket - jakarta.websocket-api - - - org.eclipse.jetty - jetty-servlets - - - org.eclipse.jetty - jetty-webapp - - - javax.servlet - javax.servlet-api - - - - - org.eclipse.jetty.websocket - websocket-server - - - javax.servlet - javax.servlet-api - - - - - org.eclipse.jetty.websocket - javax-websocket-server-impl - - - javax.annotation - javax.annotation-api - - - javax.websocket - javax.websocket-client-api - - - javax.websocket - javax.websocket-api - - - org.eclipse.jetty - jetty-jndi - - - - - org.mortbay.jasper - apache-el - - - - - - org.basepom.maven - duplicate-finder-maven-plugin - - - duplicate-dependencies - validate - - check - - - - .*module-info - - - about.html - - - - - - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-jooq/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-jooq/build.gradle new file mode 100644 index 0000000000..244f4391f7 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-jooq/build.gradle @@ -0,0 +1,17 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using jOOQ to access SQL databases. An alternative to spring-boot-starter-data-jpa or spring-boot-starter-jdbc" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jdbc') + api 'jakarta.activation:jakarta.activation-api' + api 'jakarta.xml.bind:jakarta.xml.bind-api' + api 'org.springframework:spring-tx' + api ('org.jooq:jooq') { + exclude group: 'javax.activation', module: 'javax.activation-api' + exclude group: 'javax.xml.bind', module: 'jaxb-api' + } +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-jooq/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-jooq/pom.xml deleted file mode 100644 index 0d938f17dd..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-jooq/pom.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-jooq - Spring Boot JOOQ Starter - Starter for using jOOQ to access SQL databases. An alternative to - spring-boot-starter-data-jpa or spring-boot-starter-jdbc - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter-jdbc - - - jakarta.activation - jakarta.activation-api - - - jakarta.xml.bind - jakarta.xml.bind-api - - - org.springframework - spring-tx - - - org.jooq - jooq - - - javax.activation - javax.activation-api - - - javax.xml.bind - jaxb-api - - - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-json/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-json/build.gradle new file mode 100644 index 0000000000..3d2633702b --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-json/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for reading and writing json" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'org.springframework:spring-web' + api 'com.fasterxml.jackson.core:jackson-databind' + api 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8' + api 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310' + api 'com.fasterxml.jackson.module:jackson-module-parameter-names' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-json/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-json/pom.xml deleted file mode 100644 index ba198fc5f1..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-json/pom.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-json - Spring Boot Json Starter - Starter for reading and writing json - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework - spring-web - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.datatype - jackson-datatype-jdk8 - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - com.fasterxml.jackson.module - jackson-module-parameter-names - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-jta-atomikos/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-jta-atomikos/build.gradle new file mode 100644 index 0000000000..9dbb582216 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-jta-atomikos/build.gradle @@ -0,0 +1,14 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for JTA transactions using Atomikos" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'com.atomikos:transactions-jms' + api 'com.atomikos:transactions-jta' + api 'com.atomikos:transactions-jdbc' + api 'jakarta.transaction:jakarta.transaction-api' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-jta-atomikos/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-jta-atomikos/pom.xml deleted file mode 100644 index 952efd70e1..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-jta-atomikos/pom.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-jta-atomikos - Spring Boot Atomikos JTA Starter - Starter for JTA transactions using Atomikos - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - com.atomikos - transactions-jms - - - com.atomikos - transactions-jta - - - org.apache.geronimo.specs - geronimo-jta_1.0.1B_spec - - - - - com.atomikos - transactions-jdbc - - - jakarta.transaction - jakarta.transaction-api - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-jta-bitronix/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-jta-bitronix/build.gradle new file mode 100644 index 0000000000..8196709090 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-jta-bitronix/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for JTA transactions using Bitronix" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'jakarta.jms:jakarta.jms-api' + api 'jakarta.transaction:jakarta.transaction-api' + api ('org.codehaus.btm:btm') { + exclude group: 'javax.transaction', module: 'jta' + } +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-jta-bitronix/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-jta-bitronix/pom.xml deleted file mode 100644 index 374205006a..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-jta-bitronix/pom.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-jta-bitronix - Spring Boot Bitronix JTA Starter - Starter for JTA transactions using Bitronix - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - jakarta.jms - jakarta.jms-api - - - jakarta.transaction - jakarta.transaction-api - - - org.codehaus.btm - btm - - - javax.transaction - jta - - - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-log4j2/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-log4j2/build.gradle new file mode 100644 index 0000000000..5490015749 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-log4j2/build.gradle @@ -0,0 +1,13 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Log4j2 for logging. An alternative to spring-boot-starter-logging" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api 'org.apache.logging.log4j:log4j-slf4j-impl' + api 'org.apache.logging.log4j:log4j-core' + api 'org.apache.logging.log4j:log4j-jul' + api 'org.slf4j:jul-to-slf4j' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-log4j2/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-log4j2/pom.xml deleted file mode 100644 index 3f6bb33c49..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-log4j2/pom.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-log4j2 - Spring Boot Log4j 2 Starter - Starter for using Log4j2 for logging. An alternative to - spring-boot-starter-logging - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.apache.logging.log4j - log4j-slf4j-impl - - - org.apache.logging.log4j - log4j-core - - - org.apache.logging.log4j - log4j-jul - - - org.slf4j - jul-to-slf4j - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-logging/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-logging/build.gradle new file mode 100644 index 0000000000..a38b29fd62 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-logging/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for logging using Logback. Default logging starter" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api 'ch.qos.logback:logback-classic' + api 'org.apache.logging.log4j:log4j-to-slf4j' + api 'org.slf4j:jul-to-slf4j' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-logging/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-logging/pom.xml deleted file mode 100644 index 80dc82f26f..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-logging/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-logging - Spring Boot Logging Starter - Starter for logging using Logback. Default logging starter - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - ch.qos.logback - logback-classic - - - org.apache.logging.log4j - log4j-to-slf4j - - - org.slf4j - jul-to-slf4j - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-mail/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-mail/build.gradle new file mode 100644 index 0000000000..641440d7be --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-mail/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Java Mail and Spring Framework's email sending support" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'org.springframework:spring-context-support' + api 'com.sun.mail:jakarta.mail' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-mail/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-mail/pom.xml deleted file mode 100644 index 2378dfa551..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-mail/pom.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-mail - Spring Boot Mail Starter - Starter for using Java Mail and Spring Framework's email sending - support - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework - spring-context-support - - - com.sun.mail - jakarta.mail - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-mustache/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-mustache/build.gradle new file mode 100644 index 0000000000..83a4f7c7ed --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-mustache/build.gradle @@ -0,0 +1,11 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for building web applications using Mustache views" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'com.samskivert:jmustache' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-mustache/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-mustache/pom.xml deleted file mode 100644 index c71dcaa464..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-mustache/pom.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-mustache - Spring Boot Mustache Starter - Starter for building web applications using Mustache views - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - com.samskivert - jmustache - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-oauth2-client/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-oauth2-client/build.gradle new file mode 100644 index 0000000000..d31b8573ae --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-oauth2-client/build.gradle @@ -0,0 +1,17 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Spring Security's OAuth2/OpenID Connect client features" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'com.sun.mail:jakarta.mail' + api 'org.springframework.security:spring-security-config' + api 'org.springframework.security:spring-security-core' + api ('org.springframework.security:spring-security-oauth2-client') { + exclude group: 'com.sun.mail', module: 'javax.mail' + } + api 'org.springframework.security:spring-security-oauth2-jose' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-oauth2-client/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-oauth2-client/pom.xml deleted file mode 100644 index 63ecdd1d49..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-oauth2-client/pom.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-oauth2-client - Spring Boot OAuth2/OpenID Connect Client Starter - Starter for using Spring Security's OAuth2/OpenID Connect client features - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - com.sun.mail - jakarta.mail - - - org.springframework.security - spring-security-config - - - org.springframework.security - spring-security-core - - - org.springframework.security - spring-security-oauth2-client - - - com.sun.mail - javax.mail - - - - - org.springframework.security - spring-security-oauth2-jose - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-oauth2-resource-server/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-oauth2-resource-server/build.gradle new file mode 100644 index 0000000000..39685e87b0 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-oauth2-resource-server/build.gradle @@ -0,0 +1,14 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Spring Security's OAuth2 resource server features" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'org.springframework.security:spring-security-config' + api 'org.springframework.security:spring-security-core' + api 'org.springframework.security:spring-security-oauth2-resource-server' + api 'org.springframework.security:spring-security-oauth2-jose' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-oauth2-resource-server/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-oauth2-resource-server/pom.xml deleted file mode 100644 index 0a4f791f0f..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-oauth2-resource-server/pom.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-oauth2-resource-server - Spring Boot OAuth2 Resource Server Starter - Starter for using Spring Security's OAuth2 resource server features - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.security - spring-security-config - - - org.springframework.security - spring-security-core - - - org.springframework.security - spring-security-oauth2-resource-server - - - org.springframework.security - spring-security-oauth2-jose - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-parent/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-parent/build.gradle new file mode 100644 index 0000000000..00a9bf070f --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-parent/build.gradle @@ -0,0 +1,226 @@ +plugins { + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.deployed' + id 'org.springframework.boot.maven-repository' +} + +description = "Parent pom providing dependency and plugin management for applications built with Maven" + +publishing.publications.withType(MavenPublication) { + pom.withXml { xml -> + def root = xml.asNode() + root.groupId.replaceNode { + parent { + delegate.groupId("${project.group}") + delegate.artifactId("spring-boot-dependencies") + delegate.version("${project.version}") + } + } + root.remove(root.version) + root.description.plus { + properties { + delegate.'java.version'('1.8') + delegate.'resource.delimiter'('@') + delegate.'maven.compiler.source'('${java.version}') + delegate.'maven.compiler.target'('${java.version}') + } + } + root.issueManagement.plus { + build { + resources { + resource { + delegate.directory('${basedir}/src/main/resources') + delegate.filtering('true') + includes { + delegate.include('**/application*.yml') + delegate.include('**/application*.yaml') + delegate.include('**/application*.properties') + } + } + resource { + delegate.directory('${basedir}/src/main/resources') + excludes { + delegate.exclude('**/application*.yml') + delegate.exclude('**/application*.yaml') + delegate.exclude('**/application*.properties') + } + } + } + pluginManagement { + plugins { + plugin { + delegate.groupId('org.jetbrains.kotlin') + delegate.artifactId('kotlin-maven-plugin') + delegate.version('${kotlin.version}') + configuration { + delegate.jvmTarget('${java.version}') + delegate.javaParameters('true') + } + executions { + execution { + delegate.id('compile') + delegate.phase('compile') + goals { + delegate.goal('compile') + } + } + execution { + delegate.id('test-compile') + delegate.phase('test-compile') + goals { + delegate.goal('test-compile') + } + } + } + } + plugin { + delegate.groupId('org.apache.maven.plugins') + delegate.artifactId('maven-compiler-plugin') + configuration { + delegate.parameters('true') + } + } + plugin { + delegate.groupId('org.apache.maven.plugins') + delegate.artifactId('maven-failsafe-plugin') + executions { + execution { + goals { + delegate.goal('integration-test') + delegate.goal('verify') + } + } + } + configuration { + delegate.classesDirectory('${project.build.outputDirectory}') + } + } + plugin { + delegate.groupId('org.apache.maven.plugins') + delegate.artifactId('maven-jar-plugin') + configuration { + archive { + manifest { + delegate.mainClass('${start-class}') + delegate.addDefaultImplementationEntries('true') + } + } + } + } + plugin { + delegate.groupId('org.apache.maven.plugins') + delegate.artifactId('maven-war-plugin') + configuration { + archive { + manifest { + delegate.mainClass('${start-class}') + delegate.addDefaultImplementationEntries('true') + } + } + } + } + plugin { + delegate.groupId('org.codehaus.mojo') + delegate.artifactId('exec-maven-plugin') + configuration { + delegate.mainClass('${start-class}') + } + } + plugin { + delegate.groupId('org.apache.maven.plugins') + delegate.artifactId('maven-resources-plugin') + configuration { + delimiters { + delegate.delimiter('${resource.delimiter}') + } + delegate.useDefaultDelimiters('false') + } + } + plugin { + delegate.groupId('pl.project13.maven') + delegate.artifactId('git-commit-id-plugin') + executions { + execution { + goals { + delegate.goal('revision') + } + } + } + configuration { + delegate.verbose('true') + delegate.dateFormat("yyyy-MM-dd'T'HH:mm:ssZ") + delegate.generateGitPropertiesFile('true') + delegate.generateGitPropertiesFilename('${project.build.outputDirectory}/git.properties') + } + } + plugin { + delegate.groupId('org.springframework.boot') + delegate.artifactId('spring-boot-maven-plugin') + executions { + execution { + delegate.id('repackage') + goals { + delegate.goal('repackage') + } + } + } + configuration { + delegate.mainClass('${start-class}') + } + } + plugin { + delegate.groupId('org.apache.maven.plugins') + delegate.artifactId('maven-shade-plugin') + configuration { + delegate.keepDependenciesWithProvidedScope('true') + delegate.createDependencyReducedPom('true') + filters { + filter { + delegate.artifact('*:*') + excludes { + delegate.exclude('META-INF/*.SF') + delegate.exclude('META-INF/*.DSA') + delegate.exclude('META-INF/*.RSA') + } + } + } + } + delegate.dependencies { + dependency { + delegate.groupId('org.springframework.boot') + delegate.artifactId('spring-boot-maven-plugin') + delegate.version('${revision}') + } + } + executions { + execution { + delegate.phase('package') + goals { + delegate.goal('shade') + } + configuration { + transformers { + transformer { + delegate.resource('META-INF/spring.handlers') + } + transformer { + delegate.resource('META-INF/spring.factories') + } + transformer { + delegate.resource('META-INF/spring.schemas') + } + delegate.transformer('') + transformer { + delegate.mainClass('${start-class}') + } + } + } + } + } + } + } + } + } + } + } +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-parent/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-parent/pom.xml deleted file mode 100644 index 23b32d80e7..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-parent/pom.xml +++ /dev/null @@ -1,297 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-dependencies - ${revision} - ../../spring-boot-dependencies - - spring-boot-starter-parent - pom - Spring Boot Starter Parent - Parent pom providing dependency and plugin management for applications - built with Maven - - ${basedir}/../../.. - 1.8 - @ - UTF-8 - UTF-8 - ${java.version} - ${java.version} - - - - - - ${basedir}/src/main/resources - true - - **/application*.yml - **/application*.yaml - **/application*.properties - - - - ${basedir}/src/main/resources - - **/application*.yml - **/application*.yaml - **/application*.properties - - - - - - - - org.jetbrains.kotlin - kotlin-maven-plugin - ${kotlin.version} - - ${java.version} - true - - - - compile - compile - - compile - - - - test-compile - test-compile - - test-compile - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - true - - - - org.apache.maven.plugins - maven-failsafe-plugin - - - - integration-test - verify - - - - - ${project.build.outputDirectory} - - - - org.apache.maven.plugins - maven-jar-plugin - - - - ${start-class} - true - - - - - - org.apache.maven.plugins - maven-war-plugin - - - - ${start-class} - true - - - - - - org.codehaus.mojo - exec-maven-plugin - - ${start-class} - - - - org.apache.maven.plugins - maven-resources-plugin - - - ${resource.delimiter} - - false - - - - pl.project13.maven - git-commit-id-plugin - - - - revision - - - - - true - yyyy-MM-dd'T'HH:mm:ssZ - true - ${project.build.outputDirectory}/git.properties - - - - - org.springframework.boot - spring-boot-maven-plugin - - - repackage - - repackage - - - - - ${start-class} - - - - - org.apache.maven.plugins - maven-shade-plugin - - true - true - - - *:* - - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - - - - - - - org.springframework.boot - spring-boot-maven-plugin - ${revision} - - - - - package - - shade - - - - - META-INF/spring.handlers - - - META-INF/spring.factories - - - META-INF/spring.schemas - - - - ${start-class} - - - - - - - - - - - org.codehaus.mojo - flatten-maven-plugin - false - - - - flatten - process-resources - - flatten - - - true - - expand - keep - keep - expand - keep - keep - keep - keep - - - - - flatten-clean - clean - - clean - - - - - - org.codehaus.mojo - xml-maven-plugin - false - - - - post-process-flattened-pom - process-resources - - transform - - - - - ${project.basedir} - ${project.basedir} - .flattened-pom.xml - src/main/xslt/post-process-flattened-pom.xsl - - - indent - yes - - - - - - - - - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-quartz/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-quartz/build.gradle new file mode 100644 index 0000000000..c00a3a0166 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-quartz/build.gradle @@ -0,0 +1,13 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using the Quartz scheduler" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'org.springframework:spring-context-support' + api 'org.springframework:spring-tx' + api 'org.quartz-scheduler:quartz' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-quartz/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-quartz/pom.xml deleted file mode 100644 index 7edae6ae0d..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-quartz/pom.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-quartz - Spring Boot Quartz Starter - Starter for using the Quartz scheduler - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework - spring-context-support - - - org.springframework - spring-tx - - - org.quartz-scheduler - quartz - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-reactor-netty/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-reactor-netty/build.gradle new file mode 100644 index 0000000000..b3c8171ac4 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-reactor-netty/build.gradle @@ -0,0 +1,10 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Reactor Netty as the embedded reactive HTTP server." + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api 'io.projectreactor.netty:reactor-netty' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-reactor-netty/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-reactor-netty/pom.xml deleted file mode 100644 index fa72cb97dd..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-reactor-netty/pom.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-reactor-netty - Spring Boot Reactor Netty Starter - Starter for using Reactor Netty as the embedded reactive HTTP server. - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - io.projectreactor.netty - reactor-netty - - - org.glassfish - jakarta.el - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-rsocket/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-rsocket/build.gradle new file mode 100644 index 0000000000..abc5ee6b57 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-rsocket/build.gradle @@ -0,0 +1,18 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for building RSocket clients and servers" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-json') + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-reactor-netty') + api 'com.fasterxml.jackson.dataformat:jackson-dataformat-cbor' + api 'io.rsocket:rsocket-core' + api 'io.rsocket:rsocket-transport-netty' + api 'org.springframework:spring-messaging' + api 'org.springframework.security:spring-security-config' + api 'org.springframework.security:spring-security-web' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-rsocket/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-rsocket/pom.xml deleted file mode 100644 index b83a43efce..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-rsocket/pom.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-rsocket - Spring Boot RSocket Starter - Starter for building RSocket clients and servers. - - ${basedir}/../../.. - - - - org.springframework.boot - spring-boot-starter - - - org.springframework - spring-messaging - - - io.rsocket - rsocket-core - - - io.rsocket - rsocket-transport-netty - - - org.springframework.boot - spring-boot-starter-reactor-netty - - - org.springframework.boot - spring-boot-starter-json - - - com.fasterxml.jackson.dataformat - jackson-dataformat-cbor - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-security/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-security/build.gradle new file mode 100644 index 0000000000..598adca065 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-security/build.gradle @@ -0,0 +1,13 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Spring Security" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'org.springframework:spring-aop' + api 'org.springframework.security:spring-security-config' + api 'org.springframework.security:spring-security-web' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-security/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-security/pom.xml deleted file mode 100644 index 7b3112de86..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-security/pom.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-security - Spring Boot Security Starter - Starter for using Spring Security - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework - spring-aop - - - org.springframework.security - spring-security-config - - - org.springframework.security - spring-security-web - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-test/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-test/build.gradle new file mode 100644 index 0000000000..8812987674 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-test/build.gradle @@ -0,0 +1,30 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for testing Spring Boot applications with libraries including JUnit, Hamcrest and Mockito" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api project(':spring-boot-project:spring-boot-test') + api project(':spring-boot-project:spring-boot-test-autoconfigure') + + api 'com.jayway.jsonpath:json-path' + api 'jakarta.xml.bind:jakarta.xml.bind-api' + api 'org.assertj:assertj-core' + api 'org.hamcrest:hamcrest' + api 'org.junit.jupiter:junit-jupiter' + api('org.junit.vintage:junit-vintage-engine') { + exclude group: 'org.hamcrest', module: 'hamcrest-core' + } + api 'org.mockito:mockito-core' + api 'org.mockito:mockito-junit-jupiter' + api 'org.skyscreamer:jsonassert' + api 'org.springframework:spring-core' + api 'org.springframework:spring-test' + api('org.xmlunit:xmlunit-core') { + exclude group: 'javax.xml.bind', module: 'jaxb-api' + } +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-test/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-test/pom.xml deleted file mode 100644 index 03f9a83d7b..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-test/pom.xml +++ /dev/null @@ -1,129 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-test - Spring Boot Test Starter - Starter for testing Spring Boot applications with libraries including - JUnit, Hamcrest and Mockito - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-test - - - org.springframework.boot - spring-boot-test-autoconfigure - - - com.jayway.jsonpath - json-path - - - jakarta.xml.bind - jakarta.xml.bind-api - - - org.junit.jupiter - junit-jupiter - - - org.junit.vintage - junit-vintage-engine - - - org.hamcrest - hamcrest-core - - - - - org.mockito - mockito-junit-jupiter - - - org.assertj - assertj-core - - - org.hamcrest - hamcrest - - - org.mockito - mockito-core - - - org.skyscreamer - jsonassert - - - org.springframework - spring-core - - - org.springframework - spring-test - - - org.xmlunit - xmlunit-core - - - javax.xml.bind - jaxb-api - - - - - - - - org.basepom.maven - duplicate-finder-maven-plugin - - - duplicate-dependencies - validate - - check - - - - - - - org.ow2.asm - asm - - - net.minidev - accessors-smart - - - - - - - - - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-thymeleaf/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-thymeleaf/build.gradle new file mode 100644 index 0000000000..eefd35fbf1 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-thymeleaf/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for building MVC web applications using Thymeleaf views" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'org.thymeleaf:thymeleaf-spring5' + api 'org.thymeleaf.extras:thymeleaf-extras-java8time' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-thymeleaf/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-thymeleaf/pom.xml deleted file mode 100644 index 303066ffb2..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-thymeleaf/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-thymeleaf - Spring Boot Thymeleaf Starter - Starter for building MVC web applications using Thymeleaf views - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.thymeleaf - thymeleaf-spring5 - - - org.thymeleaf.extras - thymeleaf-extras-java8time - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-tomcat/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-tomcat/build.gradle new file mode 100644 index 0000000000..5454e244cf --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-tomcat/build.gradle @@ -0,0 +1,17 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Tomcat as the embedded servlet container. Default servlet container starter used by spring-boot-starter-web" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api 'jakarta.annotation:jakarta.annotation-api' + api ('org.apache.tomcat.embed:tomcat-embed-core') { + exclude group: 'org.apache.tomcat', module: 'tomcat-annotations-api' + } + api 'org.apache.tomcat.embed:tomcat-embed-el' + api ('org.apache.tomcat.embed:tomcat-embed-websocket') { + exclude group: 'org.apache.tomcat', module: 'tomcat-annotations-api' + } +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-tomcat/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-tomcat/pom.xml deleted file mode 100644 index 6793676484..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-tomcat/pom.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-tomcat - Spring Boot Tomcat Starter - Starter for using Tomcat as the embedded servlet container. Default - servlet container starter used by spring-boot-starter-web - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - jakarta.annotation - jakarta.annotation-api - - - org.apache.tomcat.embed - tomcat-embed-core - - - org.apache.tomcat - tomcat-annotations-api - - - - - org.apache.tomcat.embed - tomcat-embed-el - - - org.apache.tomcat.embed - tomcat-embed-websocket - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-undertow/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-undertow/build.gradle new file mode 100644 index 0000000000..9c0f4b05b7 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-undertow/build.gradle @@ -0,0 +1,20 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Undertow as the embedded servlet container. An alternative to spring-boot-starter-tomcat" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api 'io.undertow:undertow-core' + api ('io.undertow:undertow-servlet') { + exclude group: 'org.jboss.spec.javax.annotation', module: 'jboss-annotations-api_1.2_spec' + exclude group: 'org.jboss.spec.javax.servlet', module: 'jboss-servlet-api_4.0_spec' + } + api ('io.undertow:undertow-websockets-jsr') { + exclude group: 'org.jboss.spec.javax.annotation', module: 'jboss-annotations-api_1.2_spec' + exclude group: 'org.jboss.spec.javax.servlet', module: 'jboss-servlet-api_4.0_spec' + } + api 'jakarta.servlet:jakarta.servlet-api' + api 'org.glassfish:jakarta.el' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-undertow/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-undertow/pom.xml deleted file mode 100644 index 83d5a29bdc..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-undertow/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-undertow - Spring Boot Undertow Starter - Starter for using Undertow as the embedded servlet container. An - alternative to spring-boot-starter-tomcat - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - io.undertow - undertow-core - - - io.undertow - undertow-servlet - - - org.jboss.spec.javax.servlet - jboss-servlet-api_4.0_spec - - - - - io.undertow - undertow-websockets-jsr - - - jakarta.servlet - jakarta.servlet-api - - - org.glassfish - jakarta.el - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-validation/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-validation/build.gradle new file mode 100644 index 0000000000..c8f959aca5 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-validation/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Java Bean Validation with Hibernate Validator" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api 'org.apache.tomcat.embed:tomcat-embed-el' + api 'org.hibernate.validator:hibernate-validator' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-validation/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-validation/pom.xml deleted file mode 100644 index 542f96b067..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-validation/pom.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-validation - Spring Boot Validation Starter - Starter for using Java Bean Validation with Hibernate - Validator - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - jakarta.validation - jakarta.validation-api - - - org.apache.tomcat.embed - tomcat-embed-el - - - org.hibernate.validator - hibernate-validator - - - javax.validation - validation-api - - - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-web-services/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-web-services/build.gradle new file mode 100644 index 0000000000..5cf4d06251 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-web-services/build.gradle @@ -0,0 +1,14 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for using Spring Web Services" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + api 'com.sun.xml.messaging.saaj:saaj-impl' + api 'jakarta.xml.ws:jakarta.xml.ws-api' + api 'org.springframework:spring-oxm' + api 'org.springframework.ws:spring-ws-core' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-web-services/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-web-services/pom.xml deleted file mode 100644 index 8e191dae28..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-web-services/pom.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-web-services - Spring Boot Web Services Starter - Starter for using Spring Web Services - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter-web - - - com.sun.xml.messaging.saaj - saaj-impl - - - javax.activation - activation - - - - - jakarta.xml.ws - jakarta.xml.ws-api - - - org.springframework - spring-oxm - - - org.springframework.ws - spring-ws-core - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-web/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-web/build.gradle new file mode 100644 index 0000000000..85adc9003d --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-web/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for building web, including RESTful, applications using Spring MVC. Uses Tomcat as the default embedded container" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-json') + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-tomcat') + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-validation') + api 'org.hibernate.validator:hibernate-validator' + api 'org.springframework:spring-web' + api 'org.springframework:spring-webmvc' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-web/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-web/pom.xml deleted file mode 100644 index 94a0b6d4da..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-web/pom.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-web - Spring Boot Web Starter - Starter for building web, including RESTful, applications using Spring - MVC. Uses Tomcat as the default embedded container - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-json - - - org.springframework.boot - spring-boot-starter-tomcat - - - org.springframework.boot - spring-boot-starter-validation - - - org.apache.tomcat.embed - tomcat-embed-el - - - - - org.springframework - spring-web - - - org.springframework - spring-webmvc - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-webflux/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-webflux/build.gradle new file mode 100644 index 0000000000..dbfa136c50 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-webflux/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for building WebFlux applications using Spring Framework's Reactive Web support" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-json') + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-reactor-netty') + api 'org.hibernate.validator:hibernate-validator' + api 'org.springframework:spring-web' + api 'org.springframework:spring-webflux' + api 'org.synchronoss.cloud:nio-multipart-parser' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-webflux/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-webflux/pom.xml deleted file mode 100644 index b159eec6cb..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-webflux/pom.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-webflux - Spring Boot WebFlux Starter - Starter for building WebFlux applications using Spring Framework's - Reactive Web support - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-json - - - org.springframework.boot - spring-boot-starter-reactor-netty - - - org.springframework.boot - spring-boot-starter-validation - - - org.apache.tomcat.embed - tomcat-embed-el - - - - - org.springframework - spring-web - - - org.springframework - spring-webflux - - - org.synchronoss.cloud - nio-multipart-parser - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-websocket/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter-websocket/build.gradle new file mode 100644 index 0000000000..5b78056e50 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-websocket/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Starter for building WebSocket applications using Spring Framework's WebSocket support" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + api 'org.springframework:spring-messaging' + api 'org.springframework:spring-websocket' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-websocket/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-websocket/pom.xml deleted file mode 100644 index 6e6755ce7d..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-websocket/pom.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter-websocket - Spring Boot WebSocket Starter - Starter for building WebSocket applications using Spring Framework's - WebSocket support - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework - spring-messaging - - - org.springframework - spring-websocket - - - diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter/build.gradle b/spring-boot-project/spring-boot-starters/spring-boot-starter/build.gradle new file mode 100644 index 0000000000..5629d533d5 --- /dev/null +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter/build.gradle @@ -0,0 +1,17 @@ +plugins { + id 'org.springframework.boot.starter' +} + +description = "Core starter, including auto-configuration support, logging and YAML" + +dependencies { + api enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + + api project(':spring-boot-project:spring-boot') + api project(':spring-boot-project:spring-boot-autoconfigure') + api project(':spring-boot-project:spring-boot-starters:spring-boot-starter-logging') + + api 'jakarta.annotation:jakarta.annotation-api' + api 'org.springframework:spring-core' + api 'org.yaml:snakeyaml' +} diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter/pom.xml deleted file mode 100644 index a4029e6655..0000000000 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter/pom.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starters - ${revision} - - spring-boot-starter - Spring Boot Starter - Core starter, including auto-configuration support, logging and YAML - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot - - - org.springframework.boot - spring-boot-autoconfigure - - - org.springframework.boot - spring-boot-starter-logging - - - jakarta.annotation - jakarta.annotation-api - - - org.springframework - spring-core - - - org.yaml - snakeyaml - runtime - - - diff --git a/spring-boot-project/spring-boot-test-autoconfigure/build.gradle b/spring-boot-project/spring-boot-test-autoconfigure/build.gradle new file mode 100644 index 0000000000..e6e7364e86 --- /dev/null +++ b/spring-boot-project/spring-boot-test-autoconfigure/build.gradle @@ -0,0 +1,96 @@ +plugins { + id 'java-library' + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.deployed' + id 'org.springframework.boot.optional-dependencies' +} + +description = 'Spring Boot Test AutoConfigure' + +dependencies { + implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + implementation project(':spring-boot-project:spring-boot') + implementation project(':spring-boot-project:spring-boot-test') + implementation project(':spring-boot-project:spring-boot-autoconfigure') + + optional enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + optional 'javax.json.bind:javax.json.bind-api' + optional 'javax.servlet:javax.servlet-api' + optional 'javax.transaction:javax.transaction-api' + optional 'com.fasterxml.jackson.core:jackson-databind' + optional 'com.google.code.gson:gson' + optional 'com.jayway.jsonpath:json-path' + optional 'io.rest-assured:rest-assured' + optional 'net.sourceforge.htmlunit:htmlunit' + optional 'org.hibernate:hibernate-core' + optional 'org.junit.jupiter:junit-jupiter-api' + optional 'org.seleniumhq.selenium:htmlunit-driver' + optional 'org.seleniumhq.selenium:selenium-api' + optional 'org.springframework:spring-orm' + optional 'org.springframework:spring-test' + optional 'org.springframework:spring-web' + optional 'org.springframework:spring-webmvc' + optional 'org.springframework:spring-webflux' + optional 'org.springframework.data:spring-data-jdbc' + optional 'org.springframework.data:spring-data-jpa' + optional 'org.springframework.data:spring-data-ldap' + optional 'org.springframework.data:spring-data-mongodb' + optional 'org.springframework.data:spring-data-neo4j' + optional 'org.springframework.data:spring-data-redis' + optional 'org.springframework.restdocs:spring-restdocs-mockmvc' + optional 'org.springframework.restdocs:spring-restdocs-restassured' + optional 'org.springframework.restdocs:spring-restdocs-webtestclient' + optional 'org.springframework.security:spring-security-config' + optional 'org.springframework.security:spring-security-test' + optional 'org.apache.tomcat.embed:tomcat-embed-core' + optional 'org.mongodb:mongodb-driver-async' + optional 'org.mongodb:mongodb-driver-reactivestreams' + + testImplementation enforcedPlatform(project(':spring-boot-project:spring-boot-parent')) + testImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-test-support') + testImplementation 'ch.qos.logback:logback-classic' + testImplementation 'com.fasterxml.jackson.module:jackson-module-parameter-names' + testImplementation 'com.h2database:h2' + testImplementation 'com.unboundid:unboundid-ldapsdk' + testImplementation 'de.flapdoodle.embed:de.flapdoodle.embed.mongo' + testImplementation 'io.lettuce:lettuce-core' + testImplementation 'io.projectreactor:reactor-core' + testImplementation 'javax.json:javax.json-api' + testImplementation 'org.apache.commons:commons-pool2' + testImplementation 'org.apache.johnzon:johnzon-jsonb' + testImplementation 'org.apache.tomcat.embed:tomcat-embed-el' + testImplementation 'org.aspectj:aspectjrt' + testImplementation 'org.aspectj:aspectjweaver' + testImplementation 'org.assertj:assertj-core' + testImplementation 'org.hibernate.validator:hibernate-validator' + testImplementation 'org.hsqldb:hsqldb' + testImplementation 'org.jooq:jooq' + testImplementation 'org.junit.platform:junit-platform-engine' + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.mockito:mockito-core' + testImplementation 'org.skyscreamer:jsonassert' + testImplementation 'org.springframework.hateoas:spring-hateoas' + testImplementation 'org.springframework.plugin:spring-plugin-core' + testImplementation 'org.testcontainers:junit-jupiter' + testImplementation 'org.testcontainers:neo4j' + testImplementation 'org.testcontainers:testcontainers' + + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' +} + +compileJava { + options.compilerArgs << '-parameters' +} + +compileTestJava { + options.compilerArgs << '-parameters' +} + +test { + include '**/*Tests.class' +} + +task testSliceMetadata(type: org.springframework.boot.build.test.autoconfigure.TestSliceMetadata) { + sourceSet = sourceSets.main + outputFile = file("$buildDir/test-slice-metadata.properties") +} diff --git a/spring-boot-project/spring-boot-test-autoconfigure/pom.xml b/spring-boot-project/spring-boot-test-autoconfigure/pom.xml deleted file mode 100644 index 1af6f9b299..0000000000 --- a/spring-boot-project/spring-boot-test-autoconfigure/pom.xml +++ /dev/null @@ -1,384 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-parent - ${revision} - ../spring-boot-parent - - spring-boot-test-autoconfigure - Spring Boot Test Auto-Configure - Spring Boot Test Auto-Configure - - ${basedir}/../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - - org.springframework.boot - spring-boot-test - - - org.springframework.boot - spring-boot-autoconfigure - - - - com.fasterxml.jackson.core - jackson-databind - true - - - com.google.code.gson - gson - true - - - com.jayway.jsonpath - json-path - true - - - io.rest-assured - rest-assured - true - - - javax.xml.bind - jaxb-api - - - javax.activation - activation - - - org.hamcrest - hamcrest-core - - - org.hamcrest - hamcrest-library - - - - - jakarta.json.bind - jakarta.json.bind-api - true - - - jakarta.persistence - jakarta.persistence-api - true - - - jakarta.servlet - jakarta.servlet-api - true - - - jakarta.transaction - jakarta.transaction-api - true - - - net.sourceforge.htmlunit - htmlunit - true - - - org.hibernate - hibernate-core - - - org.jboss.spec.javax.transaction - jboss-transaction-api_1.2_spec - - - javax.activation - javax.activation-api - - - javax.persistence - javax.persistence-api - - - javax.xml.bind - jaxb-api - - - true - - - org.junit.jupiter - junit-jupiter-api - true - - - org.seleniumhq.selenium - htmlunit-driver - true - - - org.seleniumhq.selenium - selenium-api - true - - - org.springframework - spring-orm - true - - - org.springframework - spring-test - true - - - org.springframework - spring-web - true - - - org.springframework - spring-webmvc - true - - - org.springframework - spring-webflux - true - - - org.springframework.data - spring-data-jdbc - true - - - org.springframework.data - spring-data-jpa - - - org.aspectj - aspectjrt - - - true - - - org.springframework.data - spring-data-ldap - true - - - org.springframework.data - spring-data-mongodb - true - - - org.springframework.data - spring-data-neo4j - true - - - org.springframework.data - spring-data-redis - true - - - org.springframework.restdocs - spring-restdocs-mockmvc - true - - - javax.servlet - javax.servlet-api - - - - - org.springframework.restdocs - spring-restdocs-restassured - true - - - org.springframework.restdocs - spring-restdocs-webtestclient - true - - - org.springframework.security - spring-security-config - true - - - org.springframework.security - spring-security-test - true - - - - org.springframework.boot - spring-boot-test-support - test - - - ch.qos.logback - logback-classic - test - - - com.fasterxml.jackson.module - jackson-module-parameter-names - test - - - com.h2database - h2 - test - - - com.unboundid - unboundid-ldapsdk - test - - - de.flapdoodle.embed - de.flapdoodle.embed.mongo - test - - - io.lettuce - lettuce-core - test - - - io.projectreactor - reactor-core - test - - - jakarta.json - jakarta.json-api - test - - - jakarta.validation - jakarta.validation-api - test - - - org.apache.commons - commons-pool2 - test - - - org.apache.johnzon - johnzon-jsonb - test - - - org.apache.tomcat.embed - tomcat-embed-core - true - - - org.apache.tomcat.embed - tomcat-embed-el - test - - - org.aspectj - aspectjrt - test - - - org.aspectj - aspectjweaver - test - - - org.hibernate.validator - hibernate-validator - test - - - javax.validation - validation-api - - - - - org.hsqldb - hsqldb - test - - - org.jooq - jooq - test - - - javax.xml.bind - jaxb-api - - - - - org.mongodb - mongodb-driver-async - true - - - org.mongodb - mongodb-driver-reactivestreams - true - - - org.skyscreamer - jsonassert - test - - - org.springframework.hateoas - spring-hateoas - test - - - org.testcontainers - junit-jupiter - test - - - org.testcontainers - neo4j - test - - - org.testcontainers - testcontainers - test - - - javax.annotation - javax.annotation-api - - - javax.xml.bind - jaxb-api - - - org.hamcrest - hamcrest-core - - - - - diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestIntegrationTests.java index eba313f1ab..c858842375 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestIntegrationTests.java @@ -16,6 +16,8 @@ package org.springframework.boot.test.autoconfigure.data.neo4j; +import java.time.Duration; + import org.junit.jupiter.api.Test; import org.neo4j.ogm.session.Session; import org.testcontainers.containers.Neo4jContainer; @@ -46,7 +48,8 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType; class DataNeo4jTestIntegrationTests { @Container - static final Neo4jContainer neo4j = new Neo4jContainer<>().withoutAuthentication(); + static final Neo4jContainer neo4j = new Neo4jContainer<>().withoutAuthentication() + .withStartupTimeout(Duration.ofMinutes(10)); @Autowired private Session session; diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestPropertiesIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestPropertiesIntegrationTests.java index 642c536f13..5b46d62339 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestPropertiesIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestPropertiesIntegrationTests.java @@ -16,6 +16,8 @@ package org.springframework.boot.test.autoconfigure.data.neo4j; +import java.time.Duration; + import org.junit.jupiter.api.Test; import org.testcontainers.containers.Neo4jContainer; import org.testcontainers.junit.jupiter.Container; @@ -42,7 +44,8 @@ import static org.assertj.core.api.Assertions.assertThat; class DataNeo4jTestPropertiesIntegrationTests { @Container - static final Neo4jContainer neo4j = new Neo4jContainer<>().withoutAuthentication(); + static final Neo4jContainer neo4j = new Neo4jContainer<>().withoutAuthentication() + .withStartupTimeout(Duration.ofMinutes(10)); @Autowired private Environment environment; diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestWithIncludeFilterIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestWithIncludeFilterIntegrationTests.java index e82fba702c..4a12980b10 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestWithIncludeFilterIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestWithIncludeFilterIntegrationTests.java @@ -16,6 +16,8 @@ package org.springframework.boot.test.autoconfigure.data.neo4j; +import java.time.Duration; + import org.junit.jupiter.api.Test; import org.testcontainers.containers.Neo4jContainer; import org.testcontainers.junit.jupiter.Container; @@ -43,7 +45,8 @@ import static org.assertj.core.api.Assertions.assertThat; class DataNeo4jTestWithIncludeFilterIntegrationTests { @Container - static final Neo4jContainer neo4j = new Neo4jContainer<>().withoutAuthentication(); + static final Neo4jContainer neo4j = new Neo4jContainer<>().withoutAuthentication() + .withStartupTimeout(Duration.ofMinutes(10)); @Autowired private ExampleService service; diff --git a/spring-boot-project/spring-boot-test/build.gradle b/spring-boot-project/spring-boot-test/build.gradle new file mode 100644 index 0000000000..f8033155f1 --- /dev/null +++ b/spring-boot-project/spring-boot-test/build.gradle @@ -0,0 +1,55 @@ +plugins { + id 'java-library' + id 'org.jetbrains.kotlin.jvm' + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.deployed' + id 'org.springframework.boot.optional-dependencies' +} + +description = 'Spring Boot Test' + +dependencies { + implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + implementation project(':spring-boot-project:spring-boot') + + optional enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + optional 'com.fasterxml.jackson.core:jackson-databind' + optional 'com.google.code.gson:gson' + optional 'com.jayway.jsonpath:json-path' + optional 'io.projectreactor.netty:reactor-netty' + optional 'javax.json.bind:javax.json.bind-api' + optional 'javax.servlet:javax.servlet-api' + optional 'junit:junit' + optional 'org.apache.httpcomponents:httpclient' + optional 'org.assertj:assertj-core' + optional 'org.hamcrest:hamcrest-core' + optional 'org.hamcrest:hamcrest-library' + optional 'org.jetbrains.kotlin:kotlin-stdlib' + optional 'org.jetbrains.kotlin:kotlin-reflect' + optional 'org.junit.jupiter:junit-jupiter-api' + optional 'org.mockito:mockito-core' + optional 'org.skyscreamer:jsonassert' + optional 'org.seleniumhq.selenium:htmlunit-driver' + optional 'org.seleniumhq.selenium:selenium-api' + optional 'org.springframework:spring-test' + optional 'org.springframework:spring-web' + optional 'org.springframework:spring-webflux' + optional 'net.sourceforge.htmlunit:htmlunit' + + testImplementation enforcedPlatform(project(':spring-boot-project:spring-boot-parent')) + testImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-test-support') + testImplementation 'io.mockk:mockk' + testImplementation 'javax.json:javax.json-api' + testImplementation 'ch.qos.logback:logback-classic' + testImplementation 'org.apache.tomcat.embed:tomcat-embed-core' + testImplementation 'org.codehaus.groovy:groovy' + testImplementation 'org.codehaus.groovy:groovy-xml' + testImplementation 'org.apache.johnzon:johnzon-jsonb' + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.slf4j:slf4j-api' + testImplementation 'org.spockframework:spock-core' + testImplementation 'org.springframework:spring-webmvc' + testImplementation 'org.testng:testng' + + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' +} \ No newline at end of file diff --git a/spring-boot-project/spring-boot-test/pom.xml b/spring-boot-project/spring-boot-test/pom.xml deleted file mode 100644 index 2e59fa5bde..0000000000 --- a/spring-boot-project/spring-boot-test/pom.xml +++ /dev/null @@ -1,288 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-parent - ${revision} - ../spring-boot-parent - - spring-boot-test - Spring Boot Test - Spring Boot Test - - ${basedir}/../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - - org.springframework.boot - spring-boot - - - - com.fasterxml.jackson.core - jackson-databind - true - - - com.google.code.gson - gson - true - - - com.jayway.jsonpath - json-path - true - - - io.projectreactor.netty - reactor-netty - true - - - jakarta.json.bind - jakarta.json.bind-api - true - - - jakarta.servlet - jakarta.servlet-api - true - - - junit - junit - true - - - org.hamcrest - hamcrest-core - - - - - org.apache.httpcomponents - httpclient - true - - - org.assertj - assertj-core - true - - - org.hamcrest - hamcrest - true - - - org.jetbrains.kotlin - kotlin-stdlib - true - - - org.jetbrains.kotlin - kotlin-reflect - true - - - org.junit.jupiter - junit-jupiter-api - true - - - org.mockito - mockito-core - true - - - org.skyscreamer - jsonassert - true - - - org.seleniumhq.selenium - htmlunit-driver - true - - - org.seleniumhq.selenium - selenium-api - true - - - org.springframework - spring-test - true - - - org.springframework - spring-web - true - - - org.springframework - spring-webflux - true - - - net.sourceforge.htmlunit - htmlunit - true - - - - org.springframework.boot - spring-boot-test-support - test - - - ch.qos.logback - logback-classic - test - - - io.mockk - mockk - test - - - jakarta.json - jakarta.json-api - test - - - org.apache.tomcat.embed - tomcat-embed-core - test - - - org.codehaus.groovy - groovy - test - - - org.codehaus.groovy - groovy-xml - true - test - - - org.apache.johnzon - johnzon-jsonb - test - - - org.slf4j - slf4j-api - test - - - org.spockframework - spock-core - test - - - org.springframework - spring-webmvc - test - - - org.testng - testng - test - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - test-jar - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - org.apache.maven.surefire - surefire-junit-platform - ${maven-surefire-plugin.version} - - - - - org.jetbrains.kotlin - kotlin-maven-plugin - - - compile - compile - - compile - - - - ${project.basedir}/src/main/kotlin - ${project.basedir}/src/main/java - - - - - test-compile - test-compile - - test-compile - - - - ${project.basedir}/src/test/kotlin - ${project.basedir}/src/test/java - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - default-compile - none - - - default-testCompile - none - - - java-compile - compile - - compile - - - - java-test-compile - test-compile - - testCompile - - - - - - - diff --git a/spring-boot-project/spring-boot-tools/org.springframework.boot.gradle.plugin/pom.xml b/spring-boot-project/spring-boot-tools/org.springframework.boot.gradle.plugin/pom.xml deleted file mode 100644 index 754672d746..0000000000 --- a/spring-boot-project/spring-boot-tools/org.springframework.boot.gradle.plugin/pom.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-tools - ${revision} - - org.springframework.boot.gradle.plugin - pom - Spring Boot Gradle Plugin Marker Artifact - Spring Boot Gradle Plugin Marker Artifact - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-gradle-plugin - ${project.version} - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - regex-property - - regex-property - - - false - - - - - - - diff --git a/spring-boot-project/spring-boot-tools/pom.xml b/spring-boot-project/spring-boot-tools/pom.xml deleted file mode 100644 index 1dd0d293d6..0000000000 --- a/spring-boot-project/spring-boot-tools/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-parent - ${revision} - ../spring-boot-parent - - spring-boot-tools - pom - Spring Boot Tools - Spring Boot Tools - - ${basedir}/../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - org.springframework.boot.gradle.plugin - spring-boot-antlib - spring-boot-autoconfigure-processor - spring-boot-configuration-docs - spring-boot-configuration-metadata - spring-boot-configuration-processor - spring-boot-gradle-plugin - spring-boot-loader - spring-boot-loader-tools - spring-boot-maven-plugin - spring-boot-test-support - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-antlib/build.gradle b/spring-boot-project/spring-boot-tools/spring-boot-antlib/build.gradle new file mode 100644 index 0000000000..db29b70576 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-antlib/build.gradle @@ -0,0 +1,75 @@ +plugins { + id 'java-library' + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.deployed' +} + +description = 'Spring Boot Antlib' + +ext { + antVersion = "1.9.3" +} + +configurations { + antUnit + antIvy +} + +dependencies { + antUnit "org.apache.ant:ant-antunit:1.3" + antIvy "org.apache.ivy:ivy:2.4.0" + + compileOnly project(":spring-boot-project:spring-boot-tools:spring-boot-loader") + compileOnly "org.apache.ant:ant:${antVersion}" + + implementation enforcedPlatform(project(":spring-boot-project:spring-boot-dependencies")) + implementation project(":spring-boot-project:spring-boot-tools:spring-boot-loader-tools") + implementation "org.springframework:spring-core" +} + +task copyIntegrationTestSources(type: Copy) { + from file("src/it") + into "${buildDir}/it" +} + +processResources { + eachFile { + filter { it.replace('${spring-boot.version}', project.version) } + } +} + +task integrationTest { + dependsOn copyIntegrationTestSources, jar + def resultsDir = file("${buildDir}/test-results/integrationTest") + inputs.dir file("src/it") + inputs.files sourceSets.main.runtimeClasspath + outputs.dirs resultsDir + doLast { + ant.with { + taskdef(resource: "org/apache/ant/antunit/antlib.xml", + classpath: configurations.antUnit.asPath) + taskdef(resource: "org/apache/ivy/ant/antlib.xml", + classpath: configurations.antIvy.asPath) + taskdef(resource: "org/springframework/boot/ant/antlib.xml", + classpath: sourceSets.main.runtimeClasspath.asPath, + uri: "antlib:org.springframework.boot.ant") + ant.property(name: "ivy.class.path", value: configurations.antIvy.asPath) + ant.property(name: "antunit.class.path", value: configurations.antUnit.asPath) + antunit { + propertyset { + ant.propertyref(name: "build.compiler") + ant.propertyref(name: "antunit.class.path") + ant.propertyref(name: "ivy.class.path") + } + plainlistener() + file("${buildDir}/test-results/integrationTest").mkdirs() + xmllistener(toDir: resultsDir) + fileset(dir: "${buildDir}/it", includes: "**/build.xml") + } + } + } +} + +check { + dependsOn integrationTest +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-antlib/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-antlib/pom.xml deleted file mode 100644 index d40a79a8ea..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-antlib/pom.xml +++ /dev/null @@ -1,155 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-tools - ${revision} - - spring-boot-antlib - Spring Boot Antlib - Spring Boot Antlib - - ${basedir}/../../.. - 1.9.3 - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - - org.springframework.boot - spring-boot-loader-tools - compile - - - - org.springframework.boot - spring-boot-loader - provided - - - org.apache.ant - ant - ${ant.version} - provided - - - - - - org.apache.maven.plugins - maven-shade-plugin - - - - org.springframework.boot:spring-boot-loader-tools - org.springframework:spring-core - - - true - false - true - false - - - - shade-runtime-dependencies - package - - shade - - - - - - org.apache.maven.plugins - maven-antrun-plugin - - - antunit - integration-test - - - - - - - - - - - - - - - - - - - - - ${skipTests} - - - run - - - - - - org.apache.ant - ant - ${ant.version} - - - org.apache.ant - ant-launcher - ${ant.version} - - - org.apache.ant - ant-antunit - 1.3 - - - org.apache.ivy - ivy - 2.4.0 - - - org.eclipse.jdt.core.compiler - ecj - 4.6.1 - - - - - - - - java-8 - - [1.8,1.9) - - - org.eclipse.jdt.core.JDTCompilerAdapter - - - - java-9 - - [1.9,) - - - modern - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-antlib/src/it/sample/build.xml b/spring-boot-project/spring-boot-tools/spring-boot-antlib/src/it/sample/build.xml index c6992bb33e..1ea131312e 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-antlib/src/it/sample/build.xml +++ b/spring-boot-project/spring-boot-tools/spring-boot-antlib/src/it/sample/build.xml @@ -6,11 +6,16 @@ + + + - + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-autoconfigure-processor/build.gradle b/spring-boot-project/spring-boot-tools/spring-boot-autoconfigure-processor/build.gradle new file mode 100644 index 0000000000..40eafac68b --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-autoconfigure-processor/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'java-library' + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.deployed' +} + +description = 'Spring Boot AutoConfigure Annotation Processor' + +dependencies { + testImplementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + testImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-test-support') + testImplementation 'org.assertj:assertj-core' + testImplementation 'org.springframework:spring-core' + testImplementation 'org.junit.jupiter:junit-jupiter' + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-autoconfigure-processor/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-autoconfigure-processor/pom.xml deleted file mode 100644 index 6e9fd42e10..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-autoconfigure-processor/pom.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-tools - ${revision} - - spring-boot-autoconfigure-processor - Spring Boot Auto-Configure Annotation Processor - Spring Auto-Configure Annotation Processor - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - - org.springframework.boot - spring-boot-test-support - test - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - none - - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/pom.xml deleted file mode 100644 index a2af1b413c..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-tools - ${revision} - - spring-boot-configuration-docs - Spring Boot Configuration Docs - Spring Boot Configuration Docs - - ${basedir}/../../.. - - - - org.springframework.boot - spring-boot-configuration-metadata - - - org.springframework.boot - spring-boot-test-support - test - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/AsciidocBuilder.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/AsciidocBuilder.java deleted file mode 100644 index e4cab45468..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/AsciidocBuilder.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.configurationdocs; - -/** - * Simple builder to help construct Asciidoc markup. - * - * @author Phillip Webb - */ -class AsciidocBuilder { - - private final StringBuilder content; - - AsciidocBuilder() { - this.content = new StringBuilder(); - } - - AsciidocBuilder appendKey(Object... items) { - for (Object item : items) { - appendln("`+", item, "+` +"); - } - return this; - } - - AsciidocBuilder newLine() { - return append(System.lineSeparator()); - } - - AsciidocBuilder appendln(Object... items) { - return append(items).newLine(); - } - - AsciidocBuilder append(Object... items) { - for (Object item : items) { - this.content.append(item); - } - return this; - } - - @Override - public String toString() { - return this.content.toString(); - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/CompoundConfigurationTableEntry.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/CompoundConfigurationTableEntry.java deleted file mode 100644 index 603e902f5d..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/CompoundConfigurationTableEntry.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.configurationdocs; - -import java.util.Set; -import java.util.TreeSet; -import java.util.stream.Stream; - -import org.springframework.boot.configurationmetadata.ConfigurationMetadataProperty; - -/** - * Table entry regrouping a list of configuration properties sharing the same description. - * - * @author Brian Clozel - */ -class CompoundConfigurationTableEntry extends ConfigurationTableEntry { - - private Set configurationKeys; - - private String description; - - CompoundConfigurationTableEntry(String key, String description) { - this.key = key; - this.description = description; - this.configurationKeys = new TreeSet<>(); - } - - void addConfigurationKeys(ConfigurationMetadataProperty... properties) { - Stream.of(properties).map(ConfigurationMetadataProperty::getId).forEach(this.configurationKeys::add); - } - - @Override - void write(AsciidocBuilder builder) { - builder.append("|"); - this.configurationKeys.forEach(builder::appendKey); - builder.newLine().appendln("|").appendln("|+++", this.description, "+++"); - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/ConfigurationMetadataDocumentWriter.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/ConfigurationMetadataDocumentWriter.java deleted file mode 100644 index 0269c91cf4..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/ConfigurationMetadataDocumentWriter.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.configurationdocs; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import org.springframework.boot.configurationmetadata.ConfigurationMetadataProperty; -import org.springframework.boot.configurationmetadata.ConfigurationMetadataRepositoryJsonBuilder; - -/** - * Write Asciidoc documents with configuration properties listings. - * - * @author Brian Clozel - * @since 2.0.0 - */ -public class ConfigurationMetadataDocumentWriter { - - public void writeDocument(Path outputDirectory, DocumentOptions options, InputStream... metadata) - throws IOException { - assertValidOutputDirectory(outputDirectory); - if (!Files.exists(outputDirectory)) { - Files.createDirectory(outputDirectory); - } - assertMetadata(metadata); - List tables = createConfigTables(getMetadataProperties(metadata), options); - for (ConfigurationTable table : tables) { - writeConfigurationTable(table, outputDirectory); - } - } - - private void assertValidOutputDirectory(Path outputDirPath) { - if (outputDirPath == null) { - throw new IllegalArgumentException("output path should not be null"); - } - if (Files.exists(outputDirPath) && !Files.isDirectory(outputDirPath)) { - throw new IllegalArgumentException("output path already exists and is not a directory"); - } - } - - private void assertMetadata(InputStream... metadata) { - if (metadata == null || metadata.length < 1) { - throw new IllegalArgumentException("missing input metadata"); - } - } - - private Map getMetadataProperties(InputStream... metadata) - throws IOException { - ConfigurationMetadataRepositoryJsonBuilder builder = ConfigurationMetadataRepositoryJsonBuilder - .create(metadata); - return builder.build().getAllProperties(); - } - - private List createConfigTables(Map metadataProperties, - DocumentOptions options) { - List tables = new ArrayList<>(); - List unmappedKeys = metadataProperties.values().stream().filter((property) -> !property.isDeprecated()) - .map(ConfigurationMetadataProperty::getId).collect(Collectors.toList()); - Map overrides = getOverrides(metadataProperties, unmappedKeys, - options); - options.getMetadataSections().forEach((id, keyPrefixes) -> tables - .add(createConfigTable(metadataProperties, unmappedKeys, overrides, id, keyPrefixes))); - if (!unmappedKeys.isEmpty()) { - throw new IllegalStateException( - "The following keys were not written to the documentation: " + String.join(", ", unmappedKeys)); - } - if (!overrides.isEmpty()) { - throw new IllegalStateException("The following keys were not written to the documentation: " - + String.join(", ", overrides.keySet())); - } - return tables; - } - - private Map getOverrides( - Map metadataProperties, List unmappedKeys, - DocumentOptions options) { - Map overrides = new HashMap<>(); - options.getOverrides().forEach((keyPrefix, description) -> { - CompoundConfigurationTableEntry entry = new CompoundConfigurationTableEntry(keyPrefix, description); - List matchingKeys = unmappedKeys.stream().filter((key) -> key.startsWith(keyPrefix)) - .collect(Collectors.toList()); - for (String matchingKey : matchingKeys) { - entry.addConfigurationKeys(metadataProperties.get(matchingKey)); - } - overrides.put(keyPrefix, entry); - unmappedKeys.removeAll(matchingKeys); - }); - return overrides; - } - - private ConfigurationTable createConfigTable(Map metadataProperties, - List unmappedKeys, Map overrides, String id, - List keyPrefixes) { - ConfigurationTable table = new ConfigurationTable(id); - for (String keyPrefix : keyPrefixes) { - List matchingOverrides = overrides.keySet().stream() - .filter((overrideKey) -> overrideKey.startsWith(keyPrefix)).collect(Collectors.toList()); - matchingOverrides.forEach((match) -> table.addEntry(overrides.remove(match))); - } - List matchingKeys = unmappedKeys.stream() - .filter((key) -> keyPrefixes.stream().anyMatch(key::startsWith)).collect(Collectors.toList()); - for (String matchingKey : matchingKeys) { - ConfigurationMetadataProperty property = metadataProperties.get(matchingKey); - table.addEntry(new SingleConfigurationTableEntry(property)); - } - unmappedKeys.removeAll(matchingKeys); - return table; - } - - private void writeConfigurationTable(ConfigurationTable table, Path outputDirectory) throws IOException { - Path outputFilePath = outputDirectory.resolve(table.getId() + ".adoc"); - Files.deleteIfExists(outputFilePath); - Files.createFile(outputFilePath); - try (OutputStream outputStream = Files.newOutputStream(outputFilePath)) { - outputStream.write(table.toAsciidocTable().getBytes(StandardCharsets.UTF_8)); - } - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/ConfigurationTable.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/ConfigurationTable.java deleted file mode 100644 index 83a36d9bb1..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/ConfigurationTable.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.configurationdocs; - -import java.util.Arrays; -import java.util.Set; -import java.util.TreeSet; - -/** - * Asciidoctor table listing configuration properties sharing to a common theme. - * - * @author Brian Clozel - */ -class ConfigurationTable { - - private final String id; - - private final Set entries; - - ConfigurationTable(String id) { - this.id = id; - this.entries = new TreeSet<>(); - } - - String getId() { - return this.id; - } - - void addEntry(ConfigurationTableEntry... entries) { - this.entries.addAll(Arrays.asList(entries)); - } - - String toAsciidocTable() { - AsciidocBuilder builder = new AsciidocBuilder(); - builder.appendln("[cols=\"1,1,2\", options=\"header\"]"); - builder.appendln("|==="); - builder.appendln("|Key|Default Value|Description"); - builder.appendln(); - this.entries.forEach((entry) -> { - entry.write(builder); - builder.appendln(); - }); - return builder.appendln("|===").toString(); - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/ConfigurationTableEntry.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/ConfigurationTableEntry.java deleted file mode 100644 index 8c81a96017..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/ConfigurationTableEntry.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.configurationdocs; - -/** - * Abstract class for entries in {@link ConfigurationTable}. - * - * @author Brian Clozel - */ -abstract class ConfigurationTableEntry implements Comparable { - - protected String key; - - String getKey() { - return this.key; - } - - abstract void write(AsciidocBuilder builder); - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null || getClass() != obj.getClass()) { - return false; - } - ConfigurationTableEntry other = (ConfigurationTableEntry) obj; - return this.key.equals(other.key); - } - - @Override - public int hashCode() { - return this.key.hashCode(); - } - - @Override - public int compareTo(ConfigurationTableEntry other) { - return this.key.compareTo(other.getKey()); - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/DocumentOptions.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/DocumentOptions.java deleted file mode 100644 index 6e96e8d94b..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/DocumentOptions.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.configurationdocs; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Options for generating documentation for configuration properties. - * - * @author Brian Clozel - * @since 2.0.0 - */ -public final class DocumentOptions { - - private final Map> metadataSections; - - private final Map overrides; - - private DocumentOptions(Map> metadataSections, Map overrides) { - this.metadataSections = metadataSections; - this.overrides = overrides; - } - - Map> getMetadataSections() { - return this.metadataSections; - } - - Map getOverrides() { - return this.overrides; - } - - static Builder builder() { - return new Builder(); - } - - /** - * Builder for DocumentOptions. - */ - public static class Builder { - - Map> metadataSections = new HashMap<>(); - - Map overrides = new HashMap<>(); - - SectionSpec addSection(String name) { - return new SectionSpec(this, name); - } - - Builder addOverride(String keyPrefix, String description) { - this.overrides.put(keyPrefix, description); - return this; - } - - DocumentOptions build() { - return new DocumentOptions(this.metadataSections, this.overrides); - } - - } - - /** - * Configuration for a documentation section listing properties for a specific theme. - */ - public static class SectionSpec { - - private final String name; - - private final Builder builder; - - SectionSpec(Builder builder, String name) { - this.builder = builder; - this.name = name; - } - - Builder withKeyPrefixes(String... keyPrefixes) { - this.builder.metadataSections.put(this.name, Arrays.asList(keyPrefixes)); - return this.builder; - } - - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/SingleConfigurationTableEntry.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/SingleConfigurationTableEntry.java deleted file mode 100644 index 17ac8bc32a..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/SingleConfigurationTableEntry.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.configurationdocs; - -import java.util.Arrays; -import java.util.stream.Collectors; - -import org.springframework.boot.configurationmetadata.ConfigurationMetadataProperty; - -/** - * Table entry containing a single configuration property. - * - * @author Brian Clozel - */ -class SingleConfigurationTableEntry extends ConfigurationTableEntry { - - private final String description; - - private final String defaultValue; - - SingleConfigurationTableEntry(ConfigurationMetadataProperty property) { - this.key = property.getId(); - if (property.getType() != null && property.getType().startsWith("java.util.Map")) { - this.key += ".*"; - } - this.description = property.getDescription(); - this.defaultValue = getDefaultValue(property.getDefaultValue()); - } - - private String getDefaultValue(Object defaultValue) { - if (defaultValue == null) { - return null; - } - if (defaultValue.getClass().isArray()) { - return Arrays.stream((Object[]) defaultValue).map(Object::toString) - .collect(Collectors.joining("," + System.lineSeparator())); - } - return defaultValue.toString(); - } - - @Override - void write(AsciidocBuilder builder) { - builder.appendln("|`+", this.key, "+`"); - writeDefaultValue(builder); - writeDescription(builder); - builder.appendln(); - } - - private void writeDefaultValue(AsciidocBuilder builder) { - String defaultValue = (this.defaultValue != null) ? this.defaultValue : ""; - if (defaultValue.isEmpty()) { - builder.appendln("|"); - } - else { - defaultValue = defaultValue.replace("\\", "\\\\").replace("|", "\\|"); - builder.appendln("|`+", defaultValue, "+`"); - } - } - - private void writeDescription(AsciidocBuilder builder) { - if (this.description == null || this.description.isEmpty()) { - builder.append("|"); - } - else { - String cleanedDescription = this.description.replace("|", "\\|"); - builder.append("|+++", cleanedDescription, "+++"); - } - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/package-info.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/package-info.java deleted file mode 100644 index 1c9c21ac81..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/main/java/org/springframework/boot/configurationdocs/package-info.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2012-2019 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. - */ - -/** - * Support for generating documentation of configuration properties. - */ -package org.springframework.boot.configurationdocs; diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/test/java/org/springframework/boot/configurationdocs/CompoundConfigurationTableEntryTests.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/test/java/org/springframework/boot/configurationdocs/CompoundConfigurationTableEntryTests.java deleted file mode 100644 index 0e06b59509..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/test/java/org/springframework/boot/configurationdocs/CompoundConfigurationTableEntryTests.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.configurationdocs; - -import org.junit.jupiter.api.Test; - -import org.springframework.boot.configurationmetadata.ConfigurationMetadataProperty; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Tests for {@link CompoundConfigurationTableEntry}. - * - * @author Brian Clozel - */ -class CompoundConfigurationTableEntryTests { - - private static String NEWLINE = System.lineSeparator(); - - @Test - void simpleProperty() { - ConfigurationMetadataProperty firstProp = new ConfigurationMetadataProperty(); - firstProp.setId("spring.test.first"); - firstProp.setType("java.lang.String"); - ConfigurationMetadataProperty secondProp = new ConfigurationMetadataProperty(); - secondProp.setId("spring.test.second"); - secondProp.setType("java.lang.String"); - ConfigurationMetadataProperty thirdProp = new ConfigurationMetadataProperty(); - thirdProp.setId("spring.test.third"); - thirdProp.setType("java.lang.String"); - CompoundConfigurationTableEntry entry = new CompoundConfigurationTableEntry("spring.test", - "This is a description."); - entry.addConfigurationKeys(firstProp, secondProp, thirdProp); - AsciidocBuilder builder = new AsciidocBuilder(); - entry.write(builder); - assertThat(builder.toString()).isEqualTo( - "|`+spring.test.first+` +" + NEWLINE + "`+spring.test.second+` +" + NEWLINE + "`+spring.test.third+` +" - + NEWLINE + NEWLINE + "|" + NEWLINE + "|+++This is a description.+++" + NEWLINE); - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/test/java/org/springframework/boot/configurationdocs/ConfigurationTableTests.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/test/java/org/springframework/boot/configurationdocs/ConfigurationTableTests.java deleted file mode 100644 index 2b15a47675..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/test/java/org/springframework/boot/configurationdocs/ConfigurationTableTests.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.configurationdocs; - -import org.junit.jupiter.api.Test; - -import org.springframework.boot.configurationmetadata.ConfigurationMetadataProperty; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Tests for {@link ConfigurationTable}. - * - * @author Brian Clozel - */ -class ConfigurationTableTests { - - private static String NEWLINE = System.lineSeparator(); - - @Test - void simpleTable() { - ConfigurationTable table = new ConfigurationTable("test"); - ConfigurationMetadataProperty first = new ConfigurationMetadataProperty(); - first.setId("spring.test.prop"); - first.setDefaultValue("something"); - first.setDescription("This is a description."); - first.setType("java.lang.String"); - ConfigurationMetadataProperty second = new ConfigurationMetadataProperty(); - second.setId("spring.test.other"); - second.setDefaultValue("other value"); - second.setDescription("This is another description."); - second.setType("java.lang.String"); - table.addEntry(new SingleConfigurationTableEntry(first)); - table.addEntry(new SingleConfigurationTableEntry(second)); - assertThat(table.toAsciidocTable()).isEqualTo("[cols=\"1,1,2\", options=\"header\"]" + NEWLINE + "|===" - + NEWLINE + "|Key|Default Value|Description" + NEWLINE + NEWLINE + "|`+spring.test.other+`" + NEWLINE - + "|`+other value+`" + NEWLINE + "|+++This is another description.+++" + NEWLINE + NEWLINE - + "|`+spring.test.prop+`" + NEWLINE + "|`+something+`" + NEWLINE + "|+++This is a description.+++" - + NEWLINE + NEWLINE + "|===" + NEWLINE); - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/test/java/org/springframework/boot/configurationdocs/SingleConfigurationTableEntryTests.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/test/java/org/springframework/boot/configurationdocs/SingleConfigurationTableEntryTests.java deleted file mode 100644 index 013320c729..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-docs/src/test/java/org/springframework/boot/configurationdocs/SingleConfigurationTableEntryTests.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.configurationdocs; - -import org.junit.jupiter.api.Test; - -import org.springframework.boot.configurationmetadata.ConfigurationMetadataProperty; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Tests for {@link SingleConfigurationTableEntry}. - * - * @author Brian Clozel - */ -class SingleConfigurationTableEntryTests { - - private static String NEWLINE = System.lineSeparator(); - - @Test - void simpleProperty() { - ConfigurationMetadataProperty property = new ConfigurationMetadataProperty(); - property.setId("spring.test.prop"); - property.setDefaultValue("something"); - property.setDescription("This is a description."); - property.setType("java.lang.String"); - SingleConfigurationTableEntry entry = new SingleConfigurationTableEntry(property); - AsciidocBuilder builder = new AsciidocBuilder(); - entry.write(builder); - assertThat(builder.toString()).isEqualTo("|`+spring.test.prop+`" + NEWLINE + "|`+something+`" + NEWLINE - + "|+++This is a description.+++" + NEWLINE); - } - - @Test - void noDefaultValue() { - ConfigurationMetadataProperty property = new ConfigurationMetadataProperty(); - property.setId("spring.test.prop"); - property.setDescription("This is a description."); - property.setType("java.lang.String"); - SingleConfigurationTableEntry entry = new SingleConfigurationTableEntry(property); - AsciidocBuilder builder = new AsciidocBuilder(); - entry.write(builder); - assertThat(builder.toString()).isEqualTo( - "|`+spring.test.prop+`" + NEWLINE + "|" + NEWLINE + "|+++This is a description.+++" + NEWLINE); - } - - @Test - void defaultValueWithPipes() { - ConfigurationMetadataProperty property = new ConfigurationMetadataProperty(); - property.setId("spring.test.prop"); - property.setDefaultValue("first|second"); - property.setDescription("This is a description."); - property.setType("java.lang.String"); - SingleConfigurationTableEntry entry = new SingleConfigurationTableEntry(property); - AsciidocBuilder builder = new AsciidocBuilder(); - entry.write(builder); - assertThat(builder.toString()).isEqualTo("|`+spring.test.prop+`" + NEWLINE + "|`+first\\|second+`" + NEWLINE - + "|+++This is a description.+++" + NEWLINE); - } - - @Test - void defaultValueWithBackslash() { - ConfigurationMetadataProperty property = new ConfigurationMetadataProperty(); - property.setId("spring.test.prop"); - property.setDefaultValue("first\\second"); - property.setDescription("This is a description."); - property.setType("java.lang.String"); - SingleConfigurationTableEntry entry = new SingleConfigurationTableEntry(property); - AsciidocBuilder builder = new AsciidocBuilder(); - entry.write(builder); - assertThat(builder.toString()).isEqualTo("|`+spring.test.prop+`" + NEWLINE + "|`+first\\\\second+`" + NEWLINE - + "|+++This is a description.+++" + NEWLINE); - } - - @Test - void descriptionWithPipe() { - ConfigurationMetadataProperty property = new ConfigurationMetadataProperty(); - property.setId("spring.test.prop"); - property.setDescription("This is a description with a | pipe."); - property.setType("java.lang.String"); - SingleConfigurationTableEntry entry = new SingleConfigurationTableEntry(property); - AsciidocBuilder builder = new AsciidocBuilder(); - entry.write(builder); - assertThat(builder.toString()).isEqualTo("|`+spring.test.prop+`" + NEWLINE + "|" + NEWLINE - + "|+++This is a description with a \\| pipe.+++" + NEWLINE); - } - - @Test - void mapProperty() { - ConfigurationMetadataProperty property = new ConfigurationMetadataProperty(); - property.setId("spring.test.prop"); - property.setDescription("This is a description."); - property.setType("java.util.Map"); - SingleConfigurationTableEntry entry = new SingleConfigurationTableEntry(property); - AsciidocBuilder builder = new AsciidocBuilder(); - entry.write(builder); - assertThat(builder.toString()).isEqualTo( - "|`+spring.test.prop.*+`" + NEWLINE + "|" + NEWLINE + "|+++This is a description.+++" + NEWLINE); - } - - @Test - void listProperty() { - String[] defaultValue = new String[] { "first", "second", "third" }; - ConfigurationMetadataProperty property = new ConfigurationMetadataProperty(); - property.setId("spring.test.prop"); - property.setDescription("This is a description."); - property.setType("java.util.List"); - property.setDefaultValue(defaultValue); - SingleConfigurationTableEntry entry = new SingleConfigurationTableEntry(property); - AsciidocBuilder builder = new AsciidocBuilder(); - entry.write(builder); - assertThat(builder.toString()).isEqualTo("|`+spring.test.prop+`" + NEWLINE + "|`+first," + NEWLINE + "second," - + NEWLINE + "third+`" + NEWLINE + "|+++This is a description.+++" + NEWLINE); - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-metadata/build.gradle b/spring-boot-project/spring-boot-tools/spring-boot-configuration-metadata/build.gradle new file mode 100644 index 0000000000..6e651c7df6 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-metadata/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'java-library' + id 'maven-publish' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Configuration Metadata' + +dependencies { + implementation enforcedPlatform(project(path: ":spring-boot-project:spring-boot-parent")) + implementation "com.vaadin.external.google:android-json" + + testImplementation "org.junit.jupiter:junit-jupiter" + testImplementation "org.assertj:assertj-core" + testImplementation "org.springframework:spring-core" +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-metadata/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-configuration-metadata/pom.xml deleted file mode 100644 index 68862f4c88..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-metadata/pom.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-tools - ${revision} - - spring-boot-configuration-metadata - Spring Boot Configuration Metadata - Spring Boot Configuration Metadata - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - - com.vaadin.external.google - android-json - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/build.gradle b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/build.gradle new file mode 100644 index 0000000000..c358dab711 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/build.gradle @@ -0,0 +1,27 @@ +plugins { + id 'java-library' + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.deployed' +} + +description = 'Spring Boot Configuration Annotation Processor' + +sourceSets { + main { + java { + srcDir file("src/json-shade/java") + } + } +} + +dependencies { + testImplementation enforcedPlatform(project(":spring-boot-project:spring-boot-dependencies")) + testImplementation project(":spring-boot-project:spring-boot-tools:spring-boot-test-support") + testImplementation "javax.validation:validation-api" + testImplementation "org.assertj:assertj-core" + testImplementation "org.hamcrest:hamcrest-library" + testImplementation "org.junit.jupiter:junit-jupiter" + testImplementation "org.mockito:mockito-core" + testImplementation "org.projectlombok:lombok" + testImplementation "org.springframework:spring-core" +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/pom.xml deleted file mode 100644 index 09c2e75112..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/pom.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-tools - ${revision} - - spring-boot-configuration-processor - Spring Boot Configuration Processor - Spring Boot Configuration Processor - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - - org.projectlombok - lombok - test - - - jakarta.validation - jakarta.validation-api - test - - - org.springframework.boot - spring-boot-test-support - test - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - none - - - - org.codehaus.mojo - build-helper-maven-plugin - - - add-json-shade-source - generate-sources - - add-source - - - - ${basedir}/src/json-shade/java - - - - - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/json-shade/java/org/springframework/boot/configurationprocessor/json/JSON.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/json-shade/java/org/springframework/boot/configurationprocessor/json/JSON.java index f8876a599d..f207c3912d 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/json-shade/java/org/springframework/boot/configurationprocessor/json/JSON.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/json-shade/java/org/springframework/boot/configurationprocessor/json/JSON.java @@ -102,24 +102,21 @@ class JSON { return null; } - public static JSONException typeMismatch(Object indexOrName, Object actual, - String requiredType) throws JSONException { + public static JSONException typeMismatch(Object indexOrName, Object actual, String requiredType) + throws JSONException { if (actual == null) { throw new JSONException("Value at " + indexOrName + " is null."); } - throw new JSONException("Value " + actual + " at " + indexOrName + " of type " - + actual.getClass().getName() + " cannot be converted to " - + requiredType); + throw new JSONException("Value " + actual + " at " + indexOrName + " of type " + actual.getClass().getName() + + " cannot be converted to " + requiredType); } - public static JSONException typeMismatch(Object actual, String requiredType) - throws JSONException { + public static JSONException typeMismatch(Object actual, String requiredType) throws JSONException { if (actual == null) { throw new JSONException("Value is null."); } - throw new JSONException( - "Value " + actual + " of type " + actual.getClass().getName() - + " cannot be converted to " + requiredType); + throw new JSONException("Value " + actual + " of type " + actual.getClass().getName() + + " cannot be converted to " + requiredType); } } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/json-shade/java/org/springframework/boot/configurationprocessor/json/JSONArray.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/json-shade/java/org/springframework/boot/configurationprocessor/json/JSONArray.java index 06d3a2c4b7..ebd63c4be0 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/json-shade/java/org/springframework/boot/configurationprocessor/json/JSONArray.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/json-shade/java/org/springframework/boot/configurationprocessor/json/JSONArray.java @@ -127,7 +127,6 @@ public class JSONArray { /** * Appends {@code value} to the end of this array. - * * @param value the value * @return this array. */ @@ -138,7 +137,6 @@ public class JSONArray { /** * Appends {@code value} to the end of this array. - * * @param value a finite value. May not be {@link Double#isNaN() NaNs} or * {@link Double#isInfinite() infinities}. * @return this array. @@ -171,7 +169,6 @@ public class JSONArray { /** * Appends {@code value} to the end of this array. - * * @param value a {@link JSONObject}, {@link JSONArray}, String, Boolean, Integer, * Long, Double, {@link JSONObject#NULL}, or {@code null}. May not be * {@link Double#isNaN() NaNs} or {@link Double#isInfinite() infinities}. Unsupported @@ -288,8 +285,7 @@ public class JSONArray { return value; } catch (IndexOutOfBoundsException e) { - throw new JSONException( - "Index " + index + " out of range [0.." + this.values.size() + ")"); + throw new JSONException("Index " + index + " out of range [0.." + this.values.size() + ")"); } } @@ -444,7 +440,6 @@ public class JSONArray { * a long. * @param index the index to get the value from * @return the {@code value} - * * @throws JSONException if the value at {@code index} doesn't exist or cannot be * coerced to a long. */ @@ -642,7 +637,6 @@ public class JSONArray { * 94043, * 90210 * ] - * * @param indentSpaces the number of spaces to indent for each level of nesting. * @return a human readable JSON string of this array * @throws JSONException if processing of json failed diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/json-shade/java/org/springframework/boot/configurationprocessor/json/JSONObject.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/json-shade/java/org/springframework/boot/configurationprocessor/json/JSONObject.java index e2377bec6d..b7a34606bb 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/json-shade/java/org/springframework/boot/configurationprocessor/json/JSONObject.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/json-shade/java/org/springframework/boot/configurationprocessor/json/JSONObject.java @@ -41,11 +41,11 @@ import java.util.Map; *
  • When the requested type is an int, other {@link Number} types will be coerced using * {@link Number#intValue() intValue}. Strings that can be coerced using * {@link Double#valueOf(String)} will be, and then cast to int. - *
  • When the requested type is a long, other {@link Number} types will - * be coerced using {@link Number#longValue() longValue}. Strings that can be coerced - * using {@link Double#valueOf(String)} will be, and then cast to long. This two-step - * conversion is lossy for very large values. For example, the string - * "9223372036854775806" yields the long 9223372036854775807. + *
  • When the requested type is a long, other {@link Number} types will be + * coerced using {@link Number#longValue() longValue}. Strings that can be coerced using + * {@link Double#valueOf(String)} will be, and then cast to long. This two-step conversion + * is lossy for very large values. For example, the string "9223372036854775806" yields + * the long 9223372036854775807. *
  • When the requested type is a String, other non-null values will be coerced using * {@link String#valueOf(Object)}. Although null cannot be coerced, the sentinel value * {@link JSONObject#NULL} is coerced to the string "null". @@ -117,7 +117,6 @@ public class JSONObject { /** * Creates a new {@code JSONObject} by copying all name/value mappings from the given * map. - * * @param copyFrom a map whose keys are of type {@link String} and whose values are of * supported types. * @throws NullPointerException if any of the map's keys are null. @@ -334,7 +333,6 @@ public class JSONObject { /** * Removes the named mapping if it exists; does nothing otherwise. - * * @param name the name of the property * @return the value previously mapped by {@code name}, or null if there was no such * mapping. @@ -430,7 +428,6 @@ public class JSONObject { /** * Returns the value mapped by {@code name} if it exists and is a double or can be * coerced to a double. - * * @param name the name of the property * @return the value * @throws JSONException if the mapping doesn't exist or cannot be coerced to a @@ -690,8 +687,7 @@ public class JSONObject { * @return the array */ public JSONArray names() { - return this.nameValuePairs.isEmpty() ? null - : new JSONArray(new ArrayList<>(this.nameValuePairs.keySet())); + return this.nameValuePairs.isEmpty() ? null : new JSONArray(new ArrayList<>(this.nameValuePairs.keySet())); } /** @@ -823,9 +819,9 @@ public class JSONObject { if (o instanceof Map) { return new JSONObject((Map) o); } - if (o instanceof Boolean || o instanceof Byte || o instanceof Character - || o instanceof Double || o instanceof Float || o instanceof Integer - || o instanceof Long || o instanceof Short || o instanceof String) { + if (o instanceof Boolean || o instanceof Byte || o instanceof Character || o instanceof Double + || o instanceof Float || o instanceof Integer || o instanceof Long || o instanceof Short + || o instanceof String) { return o; } if (o.getClass().getPackage().getName().startsWith("java.")) { diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/json-shade/java/org/springframework/boot/configurationprocessor/json/JSONStringer.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/json-shade/java/org/springframework/boot/configurationprocessor/json/JSONStringer.java index df2c8d7ec4..c3d73a970a 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/json-shade/java/org/springframework/boot/configurationprocessor/json/JSONStringer.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/json-shade/java/org/springframework/boot/configurationprocessor/json/JSONStringer.java @@ -191,8 +191,7 @@ public class JSONStringer { * @return the JSON stringer * @throws JSONException if processing of json failed */ - JSONStringer close(Scope empty, Scope nonempty, String closeBracket) - throws JSONException { + JSONStringer close(Scope empty, Scope nonempty, String closeBracket) throws JSONException { Scope context = peek(); if (context != nonempty && context != empty) { throw new JSONException("Nesting problem"); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/json-shade/java/org/springframework/boot/configurationprocessor/json/JSONTokener.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/json-shade/java/org/springframework/boot/configurationprocessor/json/JSONTokener.java index 6bc692e71e..2a47e73e94 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/json-shade/java/org/springframework/boot/configurationprocessor/json/JSONTokener.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/json-shade/java/org/springframework/boot/configurationprocessor/json/JSONTokener.java @@ -375,8 +375,8 @@ public class JSONTokener { throw syntaxError("Names cannot be null"); } else { - throw syntaxError("Names must be strings, but " + name - + " is of type " + name.getClass().getName()); + throw syntaxError( + "Names must be strings, but " + name + " is of type " + name.getClass().getName()); } } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/build.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/build.gradle index 85454c1f9d..b5ca902545 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/build.gradle +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/build.gradle @@ -1,71 +1,112 @@ -buildscript { - repositories { - mavenLocal() - mavenCentral() - } - dependencies { - classpath("io.spring.javaformat:spring-javaformat-gradle-plugin:0.0.15") - } -} - plugins { - id 'java' - id 'eclipse' + id 'java-gradle-plugin' + id 'maven-publish' + id 'org.asciidoctor.jvm.convert' + id 'org.asciidoctor.jvm.pdf' + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.maven-repository' + id 'org.springframework.boot.optional-dependencies' } -apply plugin: 'io.spring.javaformat' +description = 'Spring Boot Gradle Plugin' + +configurations { + asciidoctorExtensions + documentation +} repositories { - mavenLocal() - mavenCentral() + maven { + url 'https://repo.spring.io/release' + mavenContent { + includeGroup 'io.spring.asciidoctor' + } + } } dependencies { - implementation localGroovy() - implementation gradleApi() - implementation fileTree(dir: 'target/dependencies/compile', include: '*.jar') - testImplementation gradleTestKit() - testImplementation 'org.apache.commons:commons-compress:1.13' - testImplementation fileTree(dir: 'target/dependencies/test', include: '*.jar') + asciidoctorExtensions 'io.spring.asciidoctor:spring-asciidoctor-extensions-block-switch:0.3.0.RELEASE' + implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + implementation project(':spring-boot-project:spring-boot-tools:spring-boot-loader-tools') + implementation 'io.spring.gradle:dependency-management-plugin' + implementation 'org.apache.commons:commons-compress' + implementation 'org.springframework:spring-core' + + optional enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + optional 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.50' + + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.assertj:assertj-core' + testImplementation 'org.mockito:mockito-core' +} + +gradlePlugin { + plugins { + springBootPlugin { + id = 'org.springframework.boot' + implementationClass = 'org.springframework.boot.gradle.plugin.SpringBootPlugin' + } + } } jar { manifest { - attributes 'Implementation-Version': (version ? version : 'unknown') + attributes 'Implementation-Version': project.version } } -test { - useJUnitPlatform() - testLogging { - events "passed", "skipped", "failed" +task dependencyVersions(type: org.springframework.boot.build.constraints.ExtractVersionConstraints) { + enforcedPlatform(':spring-boot-project:spring-boot-dependencies') +} + +tasks.withType(org.asciidoctor.gradle.jvm.AbstractAsciidoctorTask) { + dependsOn dependencyVersions + doFirst { + attributes 'dependency-management-plugin-version': dependencyVersions.versionConstraints['io.spring.gradle:dependency-management-plugin'] } } -javadoc { - options { - author() - stylesheetFile = file('src/main/javadoc/spring-javadoc.css') - links = [ - 'https://docs.oracle.com/javase/8/docs/api/', - 'https://docs.gradle.org/current/javadoc/' - ] - source = '8' +asciidoctor { + configurations 'asciidoctorExtensions' + sources { + include 'index.adoc' + } + attributes 'stylesheet': 'css/style.css' +} + +asciidoctorPdf { + sources { + include 'index.adoc' } - title = "${project.description} $version API" } -task sourcesJar(type: Jar) { - classifier = 'sources' - from sourceSets.main.allSource +javadoc { + options { + author = true + docTitle = "Spring Boot Gradle Plugin ${project.version} API" + encoding = 'UTF-8' + memberLevel = 'protected' + outputLevel = 'quiet' + splitIndex = true + use = true + windowTitle = "Spring Boot Gradle Plugin ${project.version} API" + } } -task javadocJar(type: Jar) { - classifier = "javadoc" - from javadoc +task zip(type: Zip) { + dependsOn asciidoctor, asciidoctorPdf + duplicatesStrategy 'fail' + from(asciidoctorPdf.outputDir) { + into 'reference/pdf' + } + from(asciidoctor.outputDir) { + into 'reference/html' + } + from(javadoc) { + into 'api' + } } artifacts { - archives sourcesJar - archives javadocJar + 'documentation' zip } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/gradle.properties b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/gradle.properties deleted file mode 100644 index 6b1823d86a..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.daemon=false diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/gradle/wrapper/gradle-wrapper.jar b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 13536770052936a92b204cc34e72284a03a6903c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56177 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 i;x|p)^~-yfPOPa3(|vBayXKz \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$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="" - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# 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 - ;; - 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" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - -exec "$JAVACMD" "$@" diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/gradlew.bat b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/gradlew.bat deleted file mode 100644 index f9553162f1..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/gradlew.bat +++ /dev/null @@ -1,84 +0,0 @@ -@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 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= - -@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 init - -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 init - -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 - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -: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 %CMD_LINE_ARGS% - -: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/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/pom.xml deleted file mode 100644 index 94a48efafa..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/pom.xml +++ /dev/null @@ -1,399 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-tools - ${revision} - - spring-boot-gradle-plugin - pom - Spring Boot Gradle Plugin - Spring Boot Gradle Plugin - - ${basedir}/../../.. - ./gradlew - build - ${project.build.directory}/refdocs/ - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - org.springframework.boot - spring-boot-loader-tools - - - io.spring.gradle - dependency-management-plugin - - - org.apache.commons - commons-compress - - - org.jetbrains.kotlin - kotlin-gradle-plugin - ${kotlin.version} - true - - - - - - com.googlecode.maven-download-plugin - download-maven-plugin - - - unpack-doc-resources - generate-resources - - wget - - - ${spring-doc-resources.url} - true - ${refdocs.build.directory}/asciidoc - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-compile-dependencies - generate-resources - - copy-dependencies - - false - - compile - ${project.build.directory}/dependencies/compile - - - - copy-test-dependencies - generate-resources - - copy-dependencies - - false - - test - ${project.build.directory}/dependencies/test - - - - - - org.apache.maven.plugins - maven-resources-plugin - - - copy-asciidoc-resources - generate-resources - - copy-resources - - - ${refdocs.build.directory}/asciidoc - - - src/main/asciidoc - false - - - - - - copy-gradle-resources - generate-resources - - copy-resources - - - ${refdocs.build.directory}/gradle - - - src/main/gradle - false - - - - - - - - org.codehaus.mojo - exec-maven-plugin - - - gradle - prepare-package - - ${gradle.executable} - - clean - ${gradle.task} - -Pversion=${project.version} - -Pdescription=${project.description} - -S - - - - exec - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - attach-artifacts - package - - attach-artifact - - - - - build/libs/${project.artifactId}-${project.version}.jar - jar - - - build/libs/${project.artifactId}-${project.version}-javadoc.jar - jar - javadoc - - - build/libs/${project.artifactId}-${project.version}-sources.jar - jar - sources - - - - - - - - - - - windows - - - windows - - - - gradlew.bat - - - - skipTests - - - skipTests - true - - - - assemble - - - - full - - - full - - - - - - org.apache.maven.plugins - maven-antrun-plugin - - - ant-contrib - ant-contrib - 1.0b3 - - - ant - ant - - - - - org.apache.ant - ant-nodeps - 1.8.1 - - - org.tigris.antelope - antelopetasks - 3.2.10 - - - - - set-up-maven-properties - prepare-package - - run - - - true - - - - - - - - - - - - - - - package-docs-zip - package - - run - - - - - - - - - - - - - - - - - - org.asciidoctor - asciidoctor-maven-plugin - - - generate-html-documentation - prepare-package - - process-asciidoc - - - html5 - ${project.build.directory}/generated-docs/reference/html - highlight.js - book - - js/highlight - github - true - ./images - font - css/ - style.css - warn - - - true - - DEBUG - - - - - - generate-pdf-documentation - prepare-package - - process-asciidoc - - - pdf - ${project.build.directory}/generated-docs/reference/pdf - - - - - ${refdocs.build.directory}/asciidoc - index.adoc - - ${github-tag} - ${version-type} - ${project.version} - ${dependency-management-plugin.version} - - - - - io.spring.asciidoctor - spring-asciidoctor-extensions-block-switch - ${spring-asciidoctor-extensions.version} - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - attach-zip - - attach-artifact - - - - - ${project.build.directory}/${project.artifactId}-${project.version}-docs.zip - zip - docs - - - - - - - - - - - java13 - - 13 - - - assemble - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/css/style.css b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/css/style.css similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/css/style.css rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/css/style.css diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/getting-started.adoc b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/getting-started.adoc similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/getting-started.adoc rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/getting-started.adoc diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/index.adoc b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/index.adoc new file mode 100644 index 0000000000..efe4d2e371 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/index.adoc @@ -0,0 +1,51 @@ += Spring Boot Gradle Plugin Reference Guide +Andy Wilkinson +:doctype: book +:toc: left +:toclevels: 4 +:source-highlighter: prettify +:numbered: +:icons: font +:hide-uri-scheme: +:docinfo: shared,private + +:dependency-management-plugin: https://github.com/spring-gradle-plugins/dependency-management-plugin +:dependency-management-plugin-documentation: {dependency-management-plugin}/blob/master/README.md +:gradle-userguide: https://docs.gradle.org/current/userguide +:gradle-dsl: https://docs.gradle.org/current/dsl +:gradle-api: https://docs.gradle.org/current/javadoc +:application-plugin: {gradle-userguide}/application_plugin.html +:groovy-plugin: {gradle-userguide}/groovy_plugin.html +:java-plugin: {gradle-userguide}/java_plugin.html +:war-plugin: {gradle-userguide}/war_plugin.html +:maven-plugin: {gradle-userguide}/maven_plugin.html +:maven-publish-plugin: {gradle-userguide}/maven_publish_plugin.html +:software-component: {gradle-userguide}/software_model_extend.html +:kotlin-plugin: https://kotlinlang.org/docs/reference/using-gradle.html +:spring-boot-docs: https://docs.spring.io/spring-boot/docs/{gradle-project-version} +:api-documentation: {spring-boot-docs}/gradle-plugin/api +:spring-boot-reference: {spring-boot-docs}/reference/htmlsingle +:build-info-javadoc: {api-documentation}/org/springframework/boot/gradle/tasks/buildinfo/BuildInfo.html +:boot-jar-javadoc: {api-documentation}/org/springframework/boot/gradle/tasks/bundling/BootJar.html +:boot-war-javadoc: {api-documentation}/org/springframework/boot/gradle/tasks/bundling/BootWar.html +:boot-run-javadoc: {api-documentation}/org/springframework/boot/gradle/tasks/run/BootRun.html +:github-code: https://github.com/spring-projects/spring-boot/tree/{github-tag} + + + +[[introduction]] +== Introduction + +The Spring Boot Gradle Plugin provides Spring Boot support in https://gradle.org[Gradle]. +It allows you to package executable jar or war archives, run Spring Boot applications, and use the dependency management provided by `spring-boot-dependencies`. +Spring Boot's Gradle plugin requires Gradle 5.x or 6.x (4.10 is also supported but this support is deprecated and will be removed in a future release). + +In addition to this user guide, {api-documentation}[API documentation] is also available. + +include::getting-started.adoc[] +include::managing-dependencies.adoc[] +include::packaging.adoc[] +include::publishing.adoc[] +include::running.adoc[] +include::integrating-with-actuator.adoc[] +include::reacting.adoc[] diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/integrating-with-actuator.adoc b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/integrating-with-actuator.adoc similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/integrating-with-actuator.adoc rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/integrating-with-actuator.adoc diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/managing-dependencies.adoc b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/managing-dependencies.adoc similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/managing-dependencies.adoc rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/managing-dependencies.adoc diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/packaging.adoc b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/packaging.adoc similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/packaging.adoc rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/packaging.adoc diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/publishing.adoc b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/publishing.adoc similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/publishing.adoc rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/publishing.adoc diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/reacting.adoc b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/reacting.adoc similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/reacting.adoc rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/reacting.adoc diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/running.adoc b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/running.adoc similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/running.adoc rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/asciidoc/running.adoc diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/getting-started/apply-plugin-release.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/getting-started/apply-plugin-release.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/getting-started/apply-plugin-release.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/getting-started/apply-plugin-release.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/getting-started/apply-plugin-release.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/getting-started/apply-plugin-release.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/getting-started/apply-plugin-release.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/getting-started/apply-plugin-release.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/getting-started/apply-plugin-snapshot.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/getting-started/apply-plugin-snapshot.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/getting-started/apply-plugin-snapshot.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/getting-started/apply-plugin-snapshot.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/getting-started/milestone-settings.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/getting-started/milestone-settings.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/getting-started/milestone-settings.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/getting-started/milestone-settings.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/getting-started/milestone-settings.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/getting-started/milestone-settings.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/getting-started/milestone-settings.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/getting-started/milestone-settings.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/getting-started/snapshot-settings.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/getting-started/snapshot-settings.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/getting-started/snapshot-settings.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/getting-started/snapshot-settings.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/getting-started/snapshot-settings.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/getting-started/snapshot-settings.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/getting-started/snapshot-settings.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/getting-started/snapshot-settings.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/getting-started/typical-plugins.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/getting-started/typical-plugins.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/getting-started/typical-plugins.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/getting-started/typical-plugins.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/getting-started/typical-plugins.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/getting-started/typical-plugins.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/getting-started/typical-plugins.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/getting-started/typical-plugins.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/integrating-with-actuator/build-info-additional.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/integrating-with-actuator/build-info-additional.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/integrating-with-actuator/build-info-additional.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/integrating-with-actuator/build-info-additional.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/integrating-with-actuator/build-info-additional.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/integrating-with-actuator/build-info-additional.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/integrating-with-actuator/build-info-additional.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/integrating-with-actuator/build-info-additional.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/integrating-with-actuator/build-info-basic.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/integrating-with-actuator/build-info-basic.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/integrating-with-actuator/build-info-basic.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/integrating-with-actuator/build-info-basic.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/integrating-with-actuator/build-info-basic.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/integrating-with-actuator/build-info-basic.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/integrating-with-actuator/build-info-basic.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/integrating-with-actuator/build-info-basic.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/integrating-with-actuator/build-info-custom-values.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/integrating-with-actuator/build-info-custom-values.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/integrating-with-actuator/build-info-custom-values.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/integrating-with-actuator/build-info-custom-values.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/integrating-with-actuator/build-info-custom-values.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/integrating-with-actuator/build-info-custom-values.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/integrating-with-actuator/build-info-custom-values.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/integrating-with-actuator/build-info-custom-values.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/configure-bom-with-plugins.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/configure-bom-with-plugins.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/configure-bom-with-plugins.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/configure-bom-with-plugins.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/configure-bom.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/configure-bom.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/configure-bom.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/configure-bom.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/configure-bom.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/configure-bom.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/configure-bom.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/configure-bom.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/custom-version.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/custom-version.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/custom-version.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/custom-version.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/custom-version.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/custom-version.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/custom-version.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/custom-version.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/depend-on-plugin-milestone.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/depend-on-plugin-milestone.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/depend-on-plugin-milestone.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/depend-on-plugin-milestone.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/depend-on-plugin-release.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/depend-on-plugin-release.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/depend-on-plugin-release.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/depend-on-plugin-release.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/depend-on-plugin-release.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/depend-on-plugin-release.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/depend-on-plugin-release.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/depend-on-plugin-release.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/depend-on-plugin-snapshot.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/depend-on-plugin-snapshot.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/depend-on-plugin-snapshot.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/depend-on-plugin-snapshot.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/dependencies.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/dependencies.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/dependencies.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/dependencies.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/dependencies.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/dependencies.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/managing-dependencies/dependencies.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/managing-dependencies/dependencies.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/application-plugin-main-class.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/application-plugin-main-class.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/application-plugin-main-class.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/application-plugin-main-class.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/application-plugin-main-class.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/application-plugin-main-class.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/application-plugin-main-class.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/application-plugin-main-class.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-and-jar.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-and-jar.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-and-jar.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-and-jar.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-and-jar.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-and-jar.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-and-jar.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-and-jar.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-custom-launch-script.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-custom-launch-script.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-custom-launch-script.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-custom-launch-script.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-custom-launch-script.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-custom-launch-script.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-custom-launch-script.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-custom-launch-script.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-include-launch-script.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-include-launch-script.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-include-launch-script.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-include-launch-script.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-include-launch-script.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-include-launch-script.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-include-launch-script.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-include-launch-script.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-launch-script-properties.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-launch-script-properties.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-launch-script-properties.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-launch-script-properties.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-launch-script-properties.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-launch-script-properties.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-launch-script-properties.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-launch-script-properties.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-main-class.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-main-class.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-main-class.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-main-class.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-main-class.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-main-class.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-main-class.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-main-class.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-manifest-main-class.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-manifest-main-class.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-manifest-main-class.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-manifest-main-class.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-manifest-main-class.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-manifest-main-class.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-manifest-main-class.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-manifest-main-class.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-requires-unpack.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-requires-unpack.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-requires-unpack.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-requires-unpack.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-requires-unpack.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-requires-unpack.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-jar-requires-unpack.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-jar-requires-unpack.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-war-include-devtools.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-war-include-devtools.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-war-include-devtools.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-war-include-devtools.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-war-include-devtools.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-war-include-devtools.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-war-include-devtools.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-war-include-devtools.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-war-properties-launcher.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-war-properties-launcher.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-war-properties-launcher.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-war-properties-launcher.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-war-properties-launcher.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-war-properties-launcher.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/boot-war-properties-launcher.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/boot-war-properties-launcher.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/spring-boot-dsl-main-class.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/spring-boot-dsl-main-class.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/spring-boot-dsl-main-class.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/spring-boot-dsl-main-class.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/spring-boot-dsl-main-class.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/spring-boot-dsl-main-class.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/spring-boot-dsl-main-class.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/spring-boot-dsl-main-class.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/war-container-dependency.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/war-container-dependency.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/war-container-dependency.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/war-container-dependency.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/war-container-dependency.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/war-container-dependency.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/packaging/war-container-dependency.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/packaging/war-container-dependency.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/publishing/maven-publish.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/publishing/maven-publish.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/publishing/maven-publish.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/publishing/maven-publish.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/publishing/maven-publish.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/publishing/maven-publish.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/publishing/maven-publish.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/publishing/maven-publish.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/publishing/maven.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/publishing/maven.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/publishing/maven.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/publishing/maven.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/publishing/maven.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/publishing/maven.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/publishing/maven.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/publishing/maven.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/running/application-plugin-main-class-name.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/running/application-plugin-main-class-name.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/running/application-plugin-main-class-name.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/running/application-plugin-main-class-name.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/running/application-plugin-main-class-name.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/running/application-plugin-main-class-name.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/running/application-plugin-main-class-name.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/running/application-plugin-main-class-name.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/running/boot-run-disable-optimized-launch.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/running/boot-run-disable-optimized-launch.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/running/boot-run-disable-optimized-launch.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/running/boot-run-disable-optimized-launch.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/running/boot-run-disable-optimized-launch.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/running/boot-run-disable-optimized-launch.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/running/boot-run-disable-optimized-launch.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/running/boot-run-disable-optimized-launch.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/running/boot-run-main.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/running/boot-run-main.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/running/boot-run-main.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/running/boot-run-main.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/running/boot-run-main.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/running/boot-run-main.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/running/boot-run-main.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/running/boot-run-main.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/running/boot-run-source-resources.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/running/boot-run-source-resources.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/running/boot-run-source-resources.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/running/boot-run-source-resources.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/running/boot-run-source-resources.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/running/boot-run-source-resources.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/running/boot-run-source-resources.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/running/boot-run-source-resources.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/running/spring-boot-dsl-main-class-name.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/running/spring-boot-dsl-main-class-name.gradle similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/running/spring-boot-dsl-main-class-name.gradle rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/running/spring-boot-dsl-main-class-name.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/running/spring-boot-dsl-main-class-name.gradle.kts b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/running/spring-boot-dsl-main-class-name.gradle.kts similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/gradle/running/spring-boot-dsl-main-class-name.gradle.kts rename to spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/docs/gradle/running/spring-boot-dsl-main-class-name.gradle.kts diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/index.adoc b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/index.adoc deleted file mode 100644 index c13bb7fdc0..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/index.adoc +++ /dev/null @@ -1,51 +0,0 @@ -= Spring Boot Gradle Plugin Reference Guide -Andy Wilkinson -:doctype: book -:toc: left -:toclevels: 4 -:source-highlighter: prettify -:numbered: -:icons: font -:hide-uri-scheme: -:docinfo: shared,private - -:dependency-management-plugin: https://github.com/spring-gradle-plugins/dependency-management-plugin -:dependency-management-plugin-documentation: {dependency-management-plugin}/blob/master/README.md -:gradle-userguide: https://docs.gradle.org/current/userguide -:gradle-dsl: https://docs.gradle.org/current/dsl -:gradle-api: https://docs.gradle.org/current/javadoc -:application-plugin: {gradle-userguide}/application_plugin.html -:groovy-plugin: {gradle-userguide}/groovy_plugin.html -:java-plugin: {gradle-userguide}/java_plugin.html -:war-plugin: {gradle-userguide}/war_plugin.html -:maven-plugin: {gradle-userguide}/maven_plugin.html -:maven-publish-plugin: {gradle-userguide}/maven_publish_plugin.html -:software-component: {gradle-userguide}/software_model_extend.html -:kotlin-plugin: https://kotlinlang.org/docs/reference/using-gradle.html -:spring-boot-docs: https://docs.spring.io/spring-boot/docs/{version} -:api-documentation: {spring-boot-docs}/gradle-plugin/api -:spring-boot-reference: {spring-boot-docs}/reference/htmlsingle -:build-info-javadoc: {api-documentation}/org/springframework/boot/gradle/tasks/buildinfo/BuildInfo.html -:boot-jar-javadoc: {api-documentation}/org/springframework/boot/gradle/tasks/bundling/BootJar.html -:boot-war-javadoc: {api-documentation}/org/springframework/boot/gradle/tasks/bundling/BootWar.html -:boot-run-javadoc: {api-documentation}/org/springframework/boot/gradle/tasks/run/BootRun.html -:github-code: https://github.com/spring-projects/spring-boot/tree/{github-tag} - - - -[[introduction]] -== Introduction - -The Spring Boot Gradle Plugin provides Spring Boot support in https://gradle.org[Gradle]. -It allows you to package executable jar or war archives, run Spring Boot applications, and use the dependency management provided by `spring-boot-dependencies`. -Spring Boot's Gradle plugin requires Gradle 5.x or 6.x (4.10 is also supported but this support is deprecated and will be removed in a future release). - -In addition to this user guide, {api-documentation}[API documentation] is also available. - -include::getting-started.adoc[] -include::managing-dependencies.adoc[] -include::packaging.adoc[] -include::publishing.adoc[] -include::running.adoc[] -include::integrating-with-actuator.adoc[] -include::reacting.adoc[] diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.springframework.boot.properties b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.springframework.boot.properties deleted file mode 100644 index 730938f5c3..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.springframework.boot.properties +++ /dev/null @@ -1 +0,0 @@ -implementation-class=org.springframework.boot.gradle.plugin.SpringBootPlugin diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/GettingStartedDocumentationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/GettingStartedDocumentationTests.java index 1d52c421af..2176bc64f3 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/GettingStartedDocumentationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/GettingStartedDocumentationTests.java @@ -38,7 +38,7 @@ class GettingStartedDocumentationTests { @TestTemplate void typicalPluginsAppliesExceptedPlugins() { - this.gradleBuild.script("src/main/gradle/getting-started/typical-plugins").build("verify"); + this.gradleBuild.script("src/docs/gradle/getting-started/typical-plugins").build("verify"); } } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/IntegratingWithActuatorDocumentationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/IntegratingWithActuatorDocumentationTests.java index 02579592db..a11e84eb07 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/IntegratingWithActuatorDocumentationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/IntegratingWithActuatorDocumentationTests.java @@ -42,14 +42,14 @@ class IntegratingWithActuatorDocumentationTests { @TestTemplate void basicBuildInfo() throws IOException { - this.gradleBuild.script("src/main/gradle/integrating-with-actuator/build-info-basic").build("bootBuildInfo"); + this.gradleBuild.script("src/docs/gradle/integrating-with-actuator/build-info-basic").build("bootBuildInfo"); assertThat(new File(this.gradleBuild.getProjectDir(), "build/resources/main/META-INF/build-info.properties")) .isFile(); } @TestTemplate void buildInfoCustomValues() throws IOException { - this.gradleBuild.script("src/main/gradle/integrating-with-actuator/build-info-custom-values") + this.gradleBuild.script("src/docs/gradle/integrating-with-actuator/build-info-custom-values") .build("bootBuildInfo"); File file = new File(this.gradleBuild.getProjectDir(), "build/resources/main/META-INF/build-info.properties"); assertThat(file).isFile(); @@ -62,7 +62,7 @@ class IntegratingWithActuatorDocumentationTests { @TestTemplate void buildInfoAdditional() throws IOException { - this.gradleBuild.script("src/main/gradle/integrating-with-actuator/build-info-additional") + this.gradleBuild.script("src/docs/gradle/integrating-with-actuator/build-info-additional") .build("bootBuildInfo"); File file = new File(this.gradleBuild.getProjectDir(), "build/resources/main/META-INF/build-info.properties"); assertThat(file).isFile(); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/ManagingDependenciesDocumentationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/ManagingDependenciesDocumentationTests.java index 91d43545c5..1b75a2ac62 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/ManagingDependenciesDocumentationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/ManagingDependenciesDocumentationTests.java @@ -39,18 +39,18 @@ class ManagingDependenciesDocumentationTests { @TestTemplate void dependenciesExampleEvaluatesSuccessfully() { - this.gradleBuild.script("src/main/gradle/managing-dependencies/dependencies").build(); + this.gradleBuild.script("src/docs/gradle/managing-dependencies/dependencies").build(); } @TestTemplate void customManagedVersions() { - assertThat(this.gradleBuild.script("src/main/gradle/managing-dependencies/custom-version").build("slf4jVersion") + assertThat(this.gradleBuild.script("src/docs/gradle/managing-dependencies/custom-version").build("slf4jVersion") .getOutput()).contains("1.7.20"); } @TestTemplate void dependencyManagementInIsolation() { - assertThat(this.gradleBuild.script("src/main/gradle/managing-dependencies/configure-bom") + assertThat(this.gradleBuild.script("src/docs/gradle/managing-dependencies/configure-bom") .build("dependencyManagement").getOutput()).contains("org.springframework.boot:spring-boot-starter "); } @@ -58,7 +58,7 @@ class ManagingDependenciesDocumentationTests { void dependencyManagementInIsolationWithPluginsBlock() { assumingThat(this.gradleBuild.getDsl() == Dsl.KOTLIN, () -> assertThat( - this.gradleBuild.script("src/main/gradle/managing-dependencies/configure-bom-with-plugins") + this.gradleBuild.script("src/docs/gradle/managing-dependencies/configure-bom-with-plugins") .build("dependencyManagement").getOutput()) .contains("org.springframework.boot:spring-boot-starter TEST-SNAPSHOT")); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/PackagingDocumentationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/PackagingDocumentationTests.java index badd512745..5f06a97597 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/PackagingDocumentationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/PackagingDocumentationTests.java @@ -49,12 +49,12 @@ class PackagingDocumentationTests { @TestTemplate void warContainerDependencyEvaluatesSuccessfully() { - this.gradleBuild.script("src/main/gradle/packaging/war-container-dependency").build(); + this.gradleBuild.script("src/docs/gradle/packaging/war-container-dependency").build(); } @TestTemplate void bootJarMainClass() throws IOException { - this.gradleBuild.script("src/main/gradle/packaging/boot-jar-main-class").build("bootJar"); + this.gradleBuild.script("src/docs/gradle/packaging/boot-jar-main-class").build("bootJar"); File file = new File(this.gradleBuild.getProjectDir(), "build/libs/" + this.gradleBuild.getProjectDir().getName() + ".jar"); assertThat(file).isFile(); @@ -66,7 +66,7 @@ class PackagingDocumentationTests { @TestTemplate void bootJarManifestMainClass() throws IOException { - this.gradleBuild.script("src/main/gradle/packaging/boot-jar-manifest-main-class").build("bootJar"); + this.gradleBuild.script("src/docs/gradle/packaging/boot-jar-manifest-main-class").build("bootJar"); File file = new File(this.gradleBuild.getProjectDir(), "build/libs/" + this.gradleBuild.getProjectDir().getName() + ".jar"); assertThat(file).isFile(); @@ -78,7 +78,7 @@ class PackagingDocumentationTests { @TestTemplate void applicationPluginMainClass() throws IOException { - this.gradleBuild.script("src/main/gradle/packaging/application-plugin-main-class").build("bootJar"); + this.gradleBuild.script("src/docs/gradle/packaging/application-plugin-main-class").build("bootJar"); File file = new File(this.gradleBuild.getProjectDir(), "build/libs/" + this.gradleBuild.getProjectDir().getName() + ".jar"); assertThat(file).isFile(); @@ -90,7 +90,7 @@ class PackagingDocumentationTests { @TestTemplate void springBootDslMainClass() throws IOException { - this.gradleBuild.script("src/main/gradle/packaging/spring-boot-dsl-main-class").build("bootJar"); + this.gradleBuild.script("src/docs/gradle/packaging/spring-boot-dsl-main-class").build("bootJar"); File file = new File(this.gradleBuild.getProjectDir(), "build/libs/" + this.gradleBuild.getProjectDir().getName() + ".jar"); assertThat(file).isFile(); @@ -103,7 +103,7 @@ class PackagingDocumentationTests { @TestTemplate void bootWarIncludeDevtools() throws IOException { jarFile(new File(this.gradleBuild.getProjectDir(), "spring-boot-devtools-1.2.3.RELEASE.jar")); - this.gradleBuild.script("src/main/gradle/packaging/boot-war-include-devtools").build("bootWar"); + this.gradleBuild.script("src/docs/gradle/packaging/boot-war-include-devtools").build("bootWar"); File file = new File(this.gradleBuild.getProjectDir(), "build/libs/" + this.gradleBuild.getProjectDir().getName() + ".war"); assertThat(file).isFile(); @@ -114,7 +114,7 @@ class PackagingDocumentationTests { @TestTemplate void bootJarRequiresUnpack() throws IOException { - this.gradleBuild.script("src/main/gradle/packaging/boot-jar-requires-unpack").build("bootJar"); + this.gradleBuild.script("src/docs/gradle/packaging/boot-jar-requires-unpack").build("bootJar"); File file = new File(this.gradleBuild.getProjectDir(), "build/libs/" + this.gradleBuild.getProjectDir().getName() + ".jar"); assertThat(file).isFile(); @@ -127,7 +127,7 @@ class PackagingDocumentationTests { @TestTemplate void bootJarIncludeLaunchScript() throws IOException { - this.gradleBuild.script("src/main/gradle/packaging/boot-jar-include-launch-script").build("bootJar"); + this.gradleBuild.script("src/docs/gradle/packaging/boot-jar-include-launch-script").build("bootJar"); File file = new File(this.gradleBuild.getProjectDir(), "build/libs/" + this.gradleBuild.getProjectDir().getName() + ".jar"); assertThat(file).isFile(); @@ -136,7 +136,7 @@ class PackagingDocumentationTests { @TestTemplate void bootJarLaunchScriptProperties() throws IOException { - this.gradleBuild.script("src/main/gradle/packaging/boot-jar-launch-script-properties").build("bootJar"); + this.gradleBuild.script("src/docs/gradle/packaging/boot-jar-launch-script-properties").build("bootJar"); File file = new File(this.gradleBuild.getProjectDir(), "build/libs/" + this.gradleBuild.getProjectDir().getName() + ".jar"); assertThat(file).isFile(); @@ -148,7 +148,7 @@ class PackagingDocumentationTests { File customScriptFile = new File(this.gradleBuild.getProjectDir(), "src/custom.script"); customScriptFile.getParentFile().mkdirs(); FileCopyUtils.copy("custom", new FileWriter(customScriptFile)); - this.gradleBuild.script("src/main/gradle/packaging/boot-jar-custom-launch-script").build("bootJar"); + this.gradleBuild.script("src/docs/gradle/packaging/boot-jar-custom-launch-script").build("bootJar"); File file = new File(this.gradleBuild.getProjectDir(), "build/libs/" + this.gradleBuild.getProjectDir().getName() + ".jar"); assertThat(file).isFile(); @@ -157,7 +157,7 @@ class PackagingDocumentationTests { @TestTemplate void bootWarPropertiesLauncher() throws IOException { - this.gradleBuild.script("src/main/gradle/packaging/boot-war-properties-launcher").build("bootWar"); + this.gradleBuild.script("src/docs/gradle/packaging/boot-war-properties-launcher").build("bootWar"); File file = new File(this.gradleBuild.getProjectDir(), "build/libs/" + this.gradleBuild.getProjectDir().getName() + ".war"); assertThat(file).isFile(); @@ -169,7 +169,7 @@ class PackagingDocumentationTests { @TestTemplate void bootJarAndJar() { - this.gradleBuild.script("src/main/gradle/packaging/boot-jar-and-jar").build("assemble"); + this.gradleBuild.script("src/docs/gradle/packaging/boot-jar-and-jar").build("assemble"); File jar = new File(this.gradleBuild.getProjectDir(), "build/libs/" + this.gradleBuild.getProjectDir().getName() + ".jar"); assertThat(jar).isFile(); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/PublishingDocumentationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/PublishingDocumentationTests.java index 0e3fd00c29..f1d4bb2014 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/PublishingDocumentationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/PublishingDocumentationTests.java @@ -39,13 +39,13 @@ class PublishingDocumentationTests { @TestTemplate void mavenUpload() throws IOException { - assertThat(this.gradleBuild.script("src/main/gradle/publishing/maven").build("deployerRepository").getOutput()) + assertThat(this.gradleBuild.script("src/docs/gradle/publishing/maven").build("deployerRepository").getOutput()) .contains("https://repo.example.com"); } @TestTemplate void mavenPublish() throws IOException { - assertThat(this.gradleBuild.script("src/main/gradle/publishing/maven-publish").build("publishingConfiguration") + assertThat(this.gradleBuild.script("src/docs/gradle/publishing/maven-publish").build("publishingConfiguration") .getOutput()).contains("MavenPublication").contains("https://repo.example.com"); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/RunningDocumentationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/RunningDocumentationTests.java index cad05fca05..cf666000e7 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/RunningDocumentationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/docs/RunningDocumentationTests.java @@ -20,6 +20,8 @@ import java.io.File; import java.io.IOException; import org.junit.jupiter.api.TestTemplate; +import org.junit.jupiter.api.condition.DisabledOnJre; +import org.junit.jupiter.api.condition.JRE; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.gradle.junit.GradleMultiDslExtension; @@ -39,32 +41,35 @@ class RunningDocumentationTests { GradleBuild gradleBuild; @TestTemplate + @DisabledOnJre(JRE.JAVA_13) void bootRunMain() throws IOException { - assertThat(this.gradleBuild.script("src/main/gradle/running/boot-run-main").build("configuredMainClass") - .getOutput()).contains("com.example.ExampleApplication"); + // TODO Testing of convention mappings is flakey in 5.2+ + // https://github.com/gradle/gradle/issues/11323 + assertThat(this.gradleBuild.gradleVersion("5.1.1").script("src/docs/gradle/running/boot-run-main") + .build("configuredMainClass").getOutput()).contains("com.example.ExampleApplication"); } @TestTemplate void applicationPluginMainClassName() { - assertThat(this.gradleBuild.script("src/main/gradle/running/application-plugin-main-class-name") + assertThat(this.gradleBuild.script("src/docs/gradle/running/application-plugin-main-class-name") .build("configuredMainClass").getOutput()).contains("com.example.ExampleApplication"); } @TestTemplate void springBootDslMainClassName() throws IOException { - assertThat(this.gradleBuild.script("src/main/gradle/running/spring-boot-dsl-main-class-name") + assertThat(this.gradleBuild.script("src/docs/gradle/running/spring-boot-dsl-main-class-name") .build("configuredMainClass").getOutput()).contains("com.example.ExampleApplication"); } @TestTemplate void bootRunSourceResources() throws IOException { - assertThat(this.gradleBuild.script("src/main/gradle/running/boot-run-source-resources") + assertThat(this.gradleBuild.script("src/docs/gradle/running/boot-run-source-resources") .build("configuredClasspath").getOutput()).contains(new File("src/main/resources").getPath()); } @TestTemplate void bootRunDisableOptimizedLaunch() throws IOException { - assertThat(this.gradleBuild.script("src/main/gradle/running/boot-run-disable-optimized-launch") + assertThat(this.gradleBuild.script("src/docs/gradle/running/boot-run-disable-optimized-launch") .build("optimizedLaunch").getOutput()).contains("false"); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleCompatibilityExtension.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleCompatibilityExtension.java index 3ad999ec12..8d84f1dc6f 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleCompatibilityExtension.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleCompatibilityExtension.java @@ -17,9 +17,11 @@ package org.springframework.boot.gradle.junit; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.stream.Stream; +import org.gradle.api.JavaVersion; import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.api.extension.Extension; import org.junit.jupiter.api.extension.ExtensionContext; @@ -38,8 +40,17 @@ import org.springframework.boot.gradle.testkit.GradleBuildExtension; */ public final class GradleCompatibilityExtension implements TestTemplateInvocationContextProvider { - private static final List GRADLE_VERSIONS = Arrays.asList("default", "5.0", "5.1.1", "5.2.1", "5.3.1", - "5.4.1", "5.5.1", "5.6.4", "6.0.1"); + private static final List GRADLE_VERSIONS; + + static { + if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_13)) { + GRADLE_VERSIONS = Collections.singletonList("default"); + } + else { + GRADLE_VERSIONS = Arrays.asList("4.10.3", "5.0", "5.1.1", "5.2.1", "5.3.1", "5.4.1", "5.5.1", "5.6.4", + "default"); + } + } @Override public Stream provideTestTemplateInvocationContexts(ExtensionContext context) { diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveTests.java index 9b2ecd048c..0735d55ded 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveTests.java @@ -99,8 +99,7 @@ abstract class AbstractBootArchiveTests { void basicArchiveCreation() throws IOException { this.task.setMainClassName("com.example.Main"); executeTask(); - assertThat(this.task.getArchivePath()).exists(); - try (JarFile jarFile = new JarFile(this.task.getArchivePath())) { + try (JarFile jarFile = new JarFile(this.task.getArchiveFile().get().getAsFile())) { assertThat(jarFile.getManifest().getMainAttributes().getValue("Main-Class")).isEqualTo(this.launcherClass); assertThat(jarFile.getManifest().getMainAttributes().getValue("Start-Class")).isEqualTo("com.example.Main"); assertThat(jarFile.getManifest().getMainAttributes().getValue("Spring-Boot-Classes")) @@ -115,7 +114,7 @@ abstract class AbstractBootArchiveTests { this.task.setMainClassName("com.example.Main"); this.task.classpath(jarFile("one.jar"), jarFile("two.jar")); executeTask(); - try (JarFile jarFile = new JarFile(this.task.getArchivePath())) { + try (JarFile jarFile = new JarFile(this.task.getArchiveFile().get().getAsFile())) { assertThat(jarFile.getEntry(this.libPath + "one.jar")).isNotNull(); assertThat(jarFile.getEntry(this.libPath + "two.jar")).isNotNull(); } @@ -130,7 +129,7 @@ abstract class AbstractBootArchiveTests { applicationClass.createNewFile(); this.task.classpath(classpathFolder); executeTask(); - try (JarFile jarFile = new JarFile(this.task.getArchivePath())) { + try (JarFile jarFile = new JarFile(this.task.getArchiveFile().get().getAsFile())) { assertThat(jarFile.getEntry(this.classesPath + "com/example/Application.class")).isNotNull(); } } @@ -146,8 +145,8 @@ abstract class AbstractBootArchiveTests { applicationClass.getParentFile().mkdirs(); applicationClass.createNewFile(); this.task.classpath(classpathFolder); - this.task.execute(); - try (JarFile jarFile = new JarFile(this.task.getArchivePath())) { + executeTask(); + try (JarFile jarFile = new JarFile(this.task.getArchiveFile().get().getAsFile())) { assertThat(jarFile.getEntry(this.classesPath + "com/example/Application.class")).isNotNull(); assertThat(jarFile.getEntry("com/example/Application.class")).isNull(); assertThat(jarFile.getEntry("module-info.class")).isNotNull(); @@ -161,7 +160,7 @@ abstract class AbstractBootArchiveTests { this.task.classpath(jarFile("one.jar")); this.task.setClasspath(this.task.getProject().files(jarFile("two.jar"))); executeTask(); - try (JarFile jarFile = new JarFile(this.task.getArchivePath())) { + try (JarFile jarFile = new JarFile(this.task.getArchiveFile().get().getAsFile())) { assertThat(jarFile.getEntry(this.libPath + "one.jar")).isNull(); assertThat(jarFile.getEntry(this.libPath + "two.jar")).isNotNull(); } @@ -173,7 +172,7 @@ abstract class AbstractBootArchiveTests { this.task.classpath(jarFile("one.jar")); this.task.setClasspath(jarFile("two.jar")); executeTask(); - try (JarFile jarFile = new JarFile(this.task.getArchivePath())) { + try (JarFile jarFile = new JarFile(this.task.getArchiveFile().get().getAsFile())) { assertThat(jarFile.getEntry(this.libPath + "one.jar")).isNull(); assertThat(jarFile.getEntry(this.libPath + "two.jar")).isNotNull(); } @@ -183,8 +182,8 @@ abstract class AbstractBootArchiveTests { void filesOnTheClasspathThatAreNotZipFilesAreSkipped() throws IOException { this.task.setMainClassName("com.example.Main"); this.task.classpath(new File("test.pom")); - this.task.execute(); - try (JarFile jarFile = new JarFile(this.task.getArchivePath())) { + executeTask(); + try (JarFile jarFile = new JarFile(this.task.getArchiveFile().get().getAsFile())) { assertThat(jarFile.getEntry(this.libPath + "/test.pom")).isNull(); } } @@ -193,12 +192,13 @@ abstract class AbstractBootArchiveTests { void loaderIsWrittenToTheRootOfTheJarAfterManifest() throws IOException { this.task.setMainClassName("com.example.Main"); executeTask(); - try (JarFile jarFile = new JarFile(this.task.getArchivePath())) { + try (JarFile jarFile = new JarFile(this.task.getArchiveFile().get().getAsFile())) { assertThat(jarFile.getEntry("org/springframework/boot/loader/LaunchedURLClassLoader.class")).isNotNull(); assertThat(jarFile.getEntry("org/springframework/boot/loader/")).isNotNull(); } // gh-16698 - try (ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(this.task.getArchivePath()))) { + try (ZipInputStream zipInputStream = new ZipInputStream( + new FileInputStream(this.task.getArchiveFile().get().getAsFile()))) { assertThat(zipInputStream.getNextEntry().getName()).isEqualTo("META-INF/"); assertThat(zipInputStream.getNextEntry().getName()).isEqualTo("META-INF/MANIFEST.MF"); } @@ -209,7 +209,7 @@ abstract class AbstractBootArchiveTests { this.task.setMainClassName("com.example.Main"); executeTask(); this.task.getManifest().getAttributes().put("Main-Class", "org.springframework.boot.loader.PropertiesLauncher"); - try (JarFile jarFile = new JarFile(this.task.getArchivePath())) { + try (JarFile jarFile = new JarFile(this.task.getArchiveFile().get().getAsFile())) { assertThat(jarFile.getEntry("org/springframework/boot/loader/LaunchedURLClassLoader.class")).isNotNull(); assertThat(jarFile.getEntry("org/springframework/boot/loader/")).isNotNull(); } @@ -221,7 +221,7 @@ abstract class AbstractBootArchiveTests { this.task.classpath(jarFile("one.jar"), jarFile("two.jar")); this.task.requiresUnpack("**/one.jar"); executeTask(); - try (JarFile jarFile = new JarFile(this.task.getArchivePath())) { + try (JarFile jarFile = new JarFile(this.task.getArchiveFile().get().getAsFile())) { assertThat(jarFile.getEntry(this.libPath + "one.jar").getComment()).startsWith("UNPACK:"); assertThat(jarFile.getEntry(this.libPath + "two.jar").getComment()).isNull(); } @@ -233,7 +233,7 @@ abstract class AbstractBootArchiveTests { this.task.classpath(jarFile("one.jar"), jarFile("two.jar")); this.task.requiresUnpack((element) -> element.getName().endsWith("two.jar")); executeTask(); - try (JarFile jarFile = new JarFile(this.task.getArchivePath())) { + try (JarFile jarFile = new JarFile(this.task.getArchiveFile().get().getAsFile())) { assertThat(jarFile.getEntry(this.libPath + "two.jar").getComment()).startsWith("UNPACK:"); assertThat(jarFile.getEntry(this.libPath + "one.jar").getComment()).isNull(); } @@ -245,13 +245,14 @@ abstract class AbstractBootArchiveTests { this.task.launchScript(); executeTask(); Map properties = new HashMap<>(); - properties.put("initInfoProvides", this.task.getBaseName()); + properties.put("initInfoProvides", this.task.getArchiveBaseName().get()); properties.put("initInfoShortDescription", this.project.getDescription()); properties.put("initInfoDescription", this.project.getDescription()); - assertThat(Files.readAllBytes(this.task.getArchivePath().toPath())) + assertThat(Files.readAllBytes(this.task.getArchiveFile().get().getAsFile().toPath())) .startsWith(new DefaultLaunchScript(null, properties).toByteArray()); try { - Set permissions = Files.getPosixFilePermissions(this.task.getArchivePath().toPath()); + Set permissions = Files + .getPosixFilePermissions(this.task.getArchiveFile().get().getAsFile().toPath()); assertThat(permissions).contains(PosixFilePermission.OWNER_EXECUTE); } catch (UnsupportedOperationException ex) { @@ -266,7 +267,8 @@ abstract class AbstractBootArchiveTests { Files.write(customScript.toPath(), Arrays.asList("custom script"), StandardOpenOption.CREATE); this.task.launchScript((configuration) -> configuration.setScript(customScript)); executeTask(); - assertThat(Files.readAllBytes(this.task.getArchivePath().toPath())).startsWith("custom script".getBytes()); + assertThat(Files.readAllBytes(this.task.getArchiveFile().get().getAsFile().toPath())) + .startsWith("custom script".getBytes()); } @Test @@ -278,7 +280,7 @@ abstract class AbstractBootArchiveTests { configuration.getProperties().put("initInfoDescription", "description"); }); executeTask(); - byte[] bytes = Files.readAllBytes(this.task.getArchivePath().toPath()); + byte[] bytes = Files.readAllBytes(this.task.getArchiveFile().get().getAsFile().toPath()); assertThat(bytes).containsSequence("Provides: provides".getBytes()); assertThat(bytes).containsSequence("Short-Description: short description".getBytes()); assertThat(bytes).containsSequence("Description: description".getBytes()); @@ -289,8 +291,8 @@ abstract class AbstractBootArchiveTests { this.task.setMainClassName("com.example.Main"); this.task.getManifest().getAttributes().put("Main-Class", "com.example.CustomLauncher"); executeTask(); - assertThat(this.task.getArchivePath()).exists(); - try (JarFile jarFile = new JarFile(this.task.getArchivePath())) { + assertThat(this.task.getArchiveFile().get().getAsFile()).exists(); + try (JarFile jarFile = new JarFile(this.task.getArchiveFile().get().getAsFile())) { assertThat(jarFile.getManifest().getMainAttributes().getValue("Main-Class")) .isEqualTo("com.example.CustomLauncher"); assertThat(jarFile.getManifest().getMainAttributes().getValue("Start-Class")).isEqualTo("com.example.Main"); @@ -303,8 +305,8 @@ abstract class AbstractBootArchiveTests { this.task.setMainClassName("com.example.Main"); this.task.getManifest().getAttributes().put("Start-Class", "com.example.CustomMain"); executeTask(); - assertThat(this.task.getArchivePath()).exists(); - try (JarFile jarFile = new JarFile(this.task.getArchivePath())) { + assertThat(this.task.getArchiveFile().get().getAsFile()).exists(); + try (JarFile jarFile = new JarFile(this.task.getArchiveFile().get().getAsFile())) { assertThat(jarFile.getManifest().getMainAttributes().getValue("Main-Class")).isEqualTo(this.launcherClass); assertThat(jarFile.getManifest().getMainAttributes().getValue("Start-Class")) .isEqualTo("com.example.CustomMain"); @@ -316,8 +318,8 @@ abstract class AbstractBootArchiveTests { this.task.setMainClassName("com.example.Main"); this.task.setPreserveFileTimestamps(false); executeTask(); - assertThat(this.task.getArchivePath()).exists(); - try (JarFile jarFile = new JarFile(this.task.getArchivePath())) { + assertThat(this.task.getArchiveFile().get().getAsFile()).exists(); + try (JarFile jarFile = new JarFile(this.task.getArchiveFile().get().getAsFile())) { Enumeration entries = jarFile.entries(); while (entries.hasMoreElements()) { JarEntry entry = entries.nextElement(); @@ -332,9 +334,9 @@ abstract class AbstractBootArchiveTests { this.task.from(newFile("bravo.txt"), newFile("alpha.txt"), newFile("charlie.txt")); this.task.setReproducibleFileOrder(true); executeTask(); - assertThat(this.task.getArchivePath()).exists(); + assertThat(this.task.getArchiveFile().get().getAsFile()).exists(); List textFiles = new ArrayList<>(); - try (JarFile jarFile = new JarFile(this.task.getArchivePath())) { + try (JarFile jarFile = new JarFile(this.task.getArchiveFile().get().getAsFile())) { Enumeration entries = jarFile.entries(); while (entries.hasMoreElements()) { JarEntry entry = entries.nextElement(); @@ -351,8 +353,8 @@ abstract class AbstractBootArchiveTests { this.task.setMainClassName("com.example.Main"); this.task.classpath(newFile("spring-boot-devtools-0.1.2.jar")); executeTask(); - assertThat(this.task.getArchivePath()).exists(); - try (JarFile jarFile = new JarFile(this.task.getArchivePath())) { + assertThat(this.task.getArchiveFile().get().getAsFile()).exists(); + try (JarFile jarFile = new JarFile(this.task.getArchiveFile().get().getAsFile())) { assertThat(jarFile.getEntry(this.libPath + "spring-boot-devtools-0.1.2.jar")).isNull(); } } @@ -363,8 +365,8 @@ abstract class AbstractBootArchiveTests { this.task.classpath(jarFile("spring-boot-devtools-0.1.2.jar")); this.task.setExcludeDevtools(false); executeTask(); - assertThat(this.task.getArchivePath()).exists(); - try (JarFile jarFile = new JarFile(this.task.getArchivePath())) { + assertThat(this.task.getArchiveFile().get().getAsFile()).exists(); + try (JarFile jarFile = new JarFile(this.task.getArchiveFile().get().getAsFile())) { assertThat(jarFile.getEntry(this.libPath + "spring-boot-devtools-0.1.2.jar")).isNotNull(); } } @@ -379,7 +381,7 @@ abstract class AbstractBootArchiveTests { resource.createNewFile(); this.task.classpath(classpathFolder); executeTask(); - File archivePath = this.task.getArchivePath(); + File archivePath = this.task.getArchiveFile().get().getAsFile(); try (ZipFile zip = new ZipFile(archivePath)) { Enumeration entries = zip.getEntries(); while (entries.hasMoreElements()) { @@ -401,9 +403,10 @@ abstract class AbstractBootArchiveTests { jarFile("third-library.jar")); this.task.requiresUnpack("second-library.jar"); executeTask(); - assertThat(getEntryNames(this.task.getArchivePath())).containsSubsequence("org/springframework/boot/loader/", - this.classesPath + "com/example/Application.class", this.libPath + "first-library.jar", - this.libPath + "second-library.jar", this.libPath + "third-library.jar"); + assertThat(getEntryNames(this.task.getArchiveFile().get().getAsFile())).containsSubsequence( + "org/springframework/boot/loader/", this.classesPath + "com/example/Application.class", + this.libPath + "first-library.jar", this.libPath + "second-library.jar", + this.libPath + "third-library.jar"); } protected File jarFile(String name) throws IOException { @@ -418,10 +421,10 @@ abstract class AbstractBootArchiveTests { private T configure(T task) throws IOException { AbstractArchiveTask archiveTask = task; - archiveTask.setBaseName("test"); + archiveTask.getArchiveBaseName().set("test"); File destination = new File(this.temp, "destination"); destination.mkdirs(); - archiveTask.setDestinationDir(destination); + archiveTask.getDestinationDirectory().set(destination); return task; } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootJarTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootJarTests.java index 5fae9e8d13..141c992dca 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootJarTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootJarTests.java @@ -41,7 +41,7 @@ class BootJarTests extends AbstractBootArchiveTests { bootJar.setMainClassName("com.example.Application"); bootJar.getBootInf().into("test").from(new File("build.gradle").getAbsolutePath()); bootJar.copy(); - try (JarFile jarFile = new JarFile(bootJar.getArchivePath())) { + try (JarFile jarFile = new JarFile(bootJar.getArchiveFile().get().getAsFile())) { assertThat(jarFile.getJarEntry("BOOT-INF/test/build.gradle")).isNotNull(); } } @@ -52,7 +52,7 @@ class BootJarTests extends AbstractBootArchiveTests { bootJar.setMainClassName("com.example.Application"); bootJar.bootInf((copySpec) -> copySpec.into("test").from(new File("build.gradle").getAbsolutePath())); bootJar.copy(); - try (JarFile jarFile = new JarFile(bootJar.getArchivePath())) { + try (JarFile jarFile = new JarFile(bootJar.getArchiveFile().get().getAsFile())) { assertThat(jarFile.getJarEntry("BOOT-INF/test/build.gradle")).isNotNull(); } } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootWarTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootWarTests.java index 107a827283..e29ca6a0a3 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootWarTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootWarTests.java @@ -40,7 +40,7 @@ class BootWarTests extends AbstractBootArchiveTests { getTask().setMainClassName("com.example.Main"); getTask().providedClasspath(jarFile("one.jar"), jarFile("two.jar")); executeTask(); - try (JarFile jarFile = new JarFile(getTask().getArchivePath())) { + try (JarFile jarFile = new JarFile(getTask().getArchiveFile().get().getAsFile())) { assertThat(jarFile.getEntry("WEB-INF/lib-provided/one.jar")).isNotNull(); assertThat(jarFile.getEntry("WEB-INF/lib-provided/two.jar")).isNotNull(); } @@ -52,7 +52,7 @@ class BootWarTests extends AbstractBootArchiveTests { getTask().providedClasspath(jarFile("one.jar")); getTask().setProvidedClasspath(getTask().getProject().files(jarFile("two.jar"))); executeTask(); - try (JarFile jarFile = new JarFile(getTask().getArchivePath())) { + try (JarFile jarFile = new JarFile(getTask().getArchiveFile().get().getAsFile())) { assertThat(jarFile.getEntry("WEB-INF/lib-provided/one.jar")).isNull(); assertThat(jarFile.getEntry("WEB-INF/lib-provided/two.jar")).isNotNull(); } @@ -64,7 +64,7 @@ class BootWarTests extends AbstractBootArchiveTests { getTask().providedClasspath(jarFile("one.jar")); getTask().setProvidedClasspath(jarFile("two.jar")); executeTask(); - try (JarFile jarFile = new JarFile(getTask().getArchivePath())) { + try (JarFile jarFile = new JarFile(getTask().getArchiveFile().get().getAsFile())) { assertThat(jarFile.getEntry("WEB-INF/lib-provided/one.jar")).isNull(); assertThat(jarFile.getEntry("WEB-INF/lib-provided/two.jar")).isNotNull(); } @@ -75,8 +75,7 @@ class BootWarTests extends AbstractBootArchiveTests { getTask().setMainClassName("com.example.Main"); getTask().providedClasspath(newFile("spring-boot-devtools-0.1.2.jar")); executeTask(); - assertThat(getTask().getArchivePath()).exists(); - try (JarFile jarFile = new JarFile(getTask().getArchivePath())) { + try (JarFile jarFile = new JarFile(getTask().getArchiveFile().get().getAsFile())) { assertThat(jarFile.getEntry("WEB-INF/lib-provided/spring-boot-devtools-0.1.2.jar")).isNull(); } } @@ -87,8 +86,7 @@ class BootWarTests extends AbstractBootArchiveTests { getTask().providedClasspath(jarFile("spring-boot-devtools-0.1.2.jar")); getTask().setExcludeDevtools(false); executeTask(); - assertThat(getTask().getArchivePath()).exists(); - try (JarFile jarFile = new JarFile(getTask().getArchivePath())) { + try (JarFile jarFile = new JarFile(getTask().getArchiveFile().get().getAsFile())) { assertThat(jarFile.getEntry("WEB-INF/lib-provided/spring-boot-devtools-0.1.2.jar")).isNotNull(); } } @@ -103,8 +101,7 @@ class BootWarTests extends AbstractBootArchiveTests { getTask().from(webappFolder); getTask().setMainClassName("com.example.Main"); executeTask(); - assertThat(getTask().getArchivePath()).exists(); - try (JarFile jarFile = new JarFile(getTask().getArchivePath())) { + try (JarFile jarFile = new JarFile(getTask().getArchiveFile().get().getAsFile())) { assertThat(jarFile.getEntry("org/")).isNotNull(); assertThat(jarFile.getEntry("org/foo.txt")).isNotNull(); } @@ -116,8 +113,8 @@ class BootWarTests extends AbstractBootArchiveTests { getTask().classpath(jarFile("library.jar")); getTask().providedClasspath(jarFile("provided-library.jar")); executeTask(); - assertThat(getEntryNames(getTask().getArchivePath())).containsSubsequence("WEB-INF/lib/library.jar", - "WEB-INF/lib-provided/provided-library.jar"); + assertThat(getEntryNames(getTask().getArchiveFile().get().getAsFile())) + .containsSubsequence("WEB-INF/lib/library.jar", "WEB-INF/lib-provided/provided-library.jar"); } @Override diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/LaunchScriptConfigurationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/LaunchScriptConfigurationTests.java index bbff7099e9..895cde6b3d 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/LaunchScriptConfigurationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/LaunchScriptConfigurationTests.java @@ -17,6 +17,7 @@ package org.springframework.boot.gradle.tasks.bundling; import org.gradle.api.Project; +import org.gradle.api.provider.Property; import org.gradle.api.tasks.bundling.AbstractArchiveTask; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -43,7 +44,8 @@ class LaunchScriptConfigurationTests { @Test void initInfoProvidesUsesArchiveBaseNameByDefault() { - given(this.task.getBaseName()).willReturn("base-name"); + Property baseName = stringProperty("base-name"); + given(this.task.getArchiveBaseName()).willReturn(baseName); assertThat(new LaunchScriptConfiguration(this.task).getProperties()).containsEntry("initInfoProvides", "base-name"); } @@ -57,7 +59,8 @@ class LaunchScriptConfigurationTests { @Test void initInfoShortDescriptionUsesArchiveBaseNameWhenDescriptionIsNull() { - given(this.task.getBaseName()).willReturn("base-name"); + Property baseName = stringProperty("base-name"); + given(this.task.getArchiveBaseName()).willReturn(baseName); assertThat(new LaunchScriptConfiguration(this.task).getProperties()).containsEntry("initInfoShortDescription", "base-name"); } @@ -71,7 +74,8 @@ class LaunchScriptConfigurationTests { @Test void initInfoDescriptionUsesArchiveBaseNameWhenDescriptionIsNull() { - given(this.task.getBaseName()).willReturn("base-name"); + Property baseName = stringProperty("base-name"); + given(this.task.getArchiveBaseName()).willReturn(baseName); assertThat(new LaunchScriptConfiguration(this.task).getProperties()).containsEntry("initInfoDescription", "base-name"); } @@ -90,4 +94,11 @@ class LaunchScriptConfigurationTests { "The\n# project\n# description"); } + @SuppressWarnings("unchecked") + private Property stringProperty(String value) { + Property property = mock(Property.class); + given(property.get()).willReturn(value); + return property; + } + } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/run/BootRunIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/run/BootRunIntegrationTests.java index b4cccc4276..0b56478f6b 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/run/BootRunIntegrationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/run/BootRunIntegrationTests.java @@ -19,6 +19,7 @@ package org.springframework.boot.gradle.tasks.run; import java.io.File; import java.io.IOException; +import org.gradle.api.JavaVersion; import org.gradle.testkit.runner.BuildResult; import org.gradle.testkit.runner.TaskOutcome; import org.junit.jupiter.api.TestTemplate; @@ -88,7 +89,12 @@ class BootRunIntegrationTests { copyJvmArgsApplication(); BuildResult result = this.gradleBuild.build("bootRun"); assertThat(result.task(":bootRun").getOutcome()).isEqualTo(TaskOutcome.SUCCESS); - assertThat(result.getOutput()).contains("1. -Xverify:none").contains("2. -XX:TieredStopAtLevel=1"); + if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_13)) { + assertThat(result.getOutput()).contains("1. -XX:TieredStopAtLevel=1"); + } + else { + assertThat(result.getOutput()).contains("1. -Xverify:none").contains("2. -XX:TieredStopAtLevel=1"); + } } @TestTemplate @@ -104,8 +110,14 @@ class BootRunIntegrationTests { copyJvmArgsApplication(); BuildResult result = this.gradleBuild.build("bootRun"); assertThat(result.task(":bootRun").getOutcome()).isEqualTo(TaskOutcome.SUCCESS); - assertThat(result.getOutput()).contains("1. -Dcom.bar=baz").contains("2. -Dcom.foo=bar") - .contains("3. -Xverify:none").contains("4. -XX:TieredStopAtLevel=1"); + if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_13)) { + assertThat(result.getOutput()).contains("1. -Dcom.bar=baz").contains("2. -Dcom.foo=bar") + .contains("3. -XX:TieredStopAtLevel=1"); + } + else { + assertThat(result.getOutput()).contains("1. -Dcom.bar=baz").contains("2. -Dcom.foo=bar") + .contains("3. -Xverify:none").contains("4. -XX:TieredStopAtLevel=1"); + } } private void copyClasspathApplication() throws IOException { diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/build.gradle b/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/build.gradle new file mode 100644 index 0000000000..161f106bb2 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/build.gradle @@ -0,0 +1,50 @@ +plugins { + id 'java-library' + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.deployed' +} + +description = 'Spring Boot Loader Tools' + +def generatedResources = "${buildDir}/generated-resources/main" + +configurations { + loader +} + +dependencies { + api "org.apache.commons:commons-compress:1.19" + + compileOnly "ch.qos.logback:logback-classic" + + implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + implementation "org.springframework:spring-core" + + loader project(":spring-boot-project:spring-boot-tools:spring-boot-loader") + + testImplementation "org.assertj:assertj-core" + testImplementation "org.junit.jupiter:junit-jupiter" + testImplementation "org.mockito:mockito-core" + testImplementation "org.zeroturnaround:zt-zip:1.13" +} + +sourceSets { + main { + output.dir(generatedResources, builtBy: 'reproducibleLoaderJar') + } +} + +task reproducibleLoaderJar(type: Jar) { + dependsOn configurations.loader + from { + zipTree(configurations.loader.incoming.files.filter {it.name.startsWith "spring-boot-loader" }.singleFile) + } + reproducibleFileOrder = true + preserveFileTimestamps = false + archiveFileName = 'spring-boot-loader.jar' + destinationDirectory = file("${generatedResources}/META-INF/loader") +} + +jar { + dependsOn reproducibleLoaderJar +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/pom.xml deleted file mode 100644 index 889fc90bfe..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/pom.xml +++ /dev/null @@ -1,109 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-tools - ${revision} - - spring-boot-loader-tools - Spring Boot Loader Tools - Spring Boot Loader Tools - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - - org.springframework - spring-core - - - org.apache.commons - commons-compress - - - - org.springframework.boot - spring-boot-loader - provided - - - ch.qos.logback - logback-classic - provided - - - - org.zeroturnaround - zt-zip - test - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - include-loader-jar - generate-resources - - copy - - - - - org.springframework.boot - spring-boot-loader - ${project.version} - spring-boot-loader.jar - - - ${basedir}/target/generated-resources/loader/META-INF/loader - false - true - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - add-resources - generate-resources - - add-resource - - - - - ${basedir}/target/generated-resources/loader - - - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - ${git.commit.id} - - - - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/build.gradle b/spring-boot-project/spring-boot-tools/spring-boot-loader/build.gradle new file mode 100644 index 0000000000..b80575d23b --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/build.gradle @@ -0,0 +1,26 @@ +plugins { + id 'java-library' + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.deployed' +} + +description = 'Spring Boot Loader' + +dependencies { + compileOnly "org.springframework:spring-core" + + implementation enforcedPlatform(project(":spring-boot-project:spring-boot-dependencies")) + + testImplementation project(":spring-boot-project:spring-boot-tools:spring-boot-test-support") + + testImplementation "org.assertj:assertj-core" + testImplementation "org.awaitility:awaitility" + testImplementation "org.junit.jupiter:junit-jupiter" + testImplementation "org.mockito:mockito-core" + testImplementation "org.springframework:spring-test" + + testRuntimeOnly "ch.qos.logback:logback-classic" + testRuntimeOnly "org.bouncycastle:bcprov-jdk16:1.46" + testRuntimeOnly "org.slf4j:jcl-over-slf4j" + testRuntimeOnly "org.springframework:spring-webmvc" +} \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-loader/pom.xml deleted file mode 100644 index 09f459c6ef..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/pom.xml +++ /dev/null @@ -1,122 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-tools - ${revision} - - spring-boot-loader - Spring Boot Loader - Spring Boot Loader - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - - org.springframework - spring-core - true - - - - org.springframework.boot - spring-boot-test-support - test - - - ch.qos.logback - logback-classic - test - - - org.awaitility - awaitility - test - - - - org.bouncycastle - bcprov-jdk16 - 1.46 - test - - - org.springframework - spring-webmvc - test - - - - - integration - - true - - - - - org.apache.maven.plugins - maven-invoker-plugin - - ${project.build.directory}/local-repo - - - - prepare-integration-test - pre-integration-test - - install - - - - integration-test - - run - - - ${project.build.directory}/it - src/it/settings.xml - verify - true - ${skipTests} - true - - - - - - org.apache.maven.plugins - maven-antrun-plugin - - - cleanup-local-integration-repo - pre-integration-test - - run - - - - - - - - - - - - - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-dir/application.properties b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-dir/application.properties deleted file mode 100644 index 42acafa985..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-dir/application.properties +++ /dev/null @@ -1,2 +0,0 @@ -loader.path: target,target/lib,. -loader.main: org.springframework.boot.load.it.jar.EmbeddedJarStarter \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-dir/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-dir/pom.xml deleted file mode 100644 index 62ccd436bd..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-dir/pom.xml +++ /dev/null @@ -1,97 +0,0 @@ - - - 4.0.0 - org.springframework.boot.launcher.it - executable-dir - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - org.apache.maven.plugins - maven-compiler-plugin - @maven-compiler-plugin.version@ - - - org.apache.maven.plugins - maven-dependency-plugin - @maven-dependency-plugin.version@ - - - unpack - prepare-package - - copy - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - jar - - - ${project.build.directory}/lib - - - - copy - prepare-package - - copy-dependencies - - - ${project.build.directory}/lib - - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - org.apache.maven.plugins - maven-surefire-plugin - @maven-surefire-plugin.version@ - - - org.codehaus.mojo - exec-maven-plugin - @exec-maven-plugin.version@ - - java - - -cp - ${project.build.directory}/lib/@project.artifactId@-@project.version@.jar - org.springframework.boot.loader.PropertiesLauncher - - - - - - - - org.eclipse.jetty - jetty-webapp - @jetty.version@ - - - org.eclipse.jetty - jetty-annotations - @jetty.version@ - - - org.springframework - spring-webmvc - @spring-framework.version@ - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-dir/src/main/java/org/springframework/launcher/it/jar/EmbeddedJarStarter.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-dir/src/main/java/org/springframework/launcher/it/jar/EmbeddedJarStarter.java deleted file mode 100644 index 86afc3a61e..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-dir/src/main/java/org/springframework/launcher/it/jar/EmbeddedJarStarter.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.load.it.jar; - -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; -import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; -import org.springframework.web.servlet.DispatcherServlet; - -/** - * Main class to start the embedded server. - * - * @author Phillip Webb - */ -public final class EmbeddedJarStarter { - - public static void main(String[] args) throws Exception { - Server server = new Server(8080); - - ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); - context.setContextPath("/"); - server.setHandler(context); - - AnnotationConfigWebApplicationContext webApplicationContext = new AnnotationConfigWebApplicationContext(); - webApplicationContext.register(SpringConfiguration.class); - DispatcherServlet dispatcherServlet = new DispatcherServlet(webApplicationContext); - context.addServlet(new ServletHolder(dispatcherServlet), "/*"); - - server.start(); - server.join(); - } -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-dir/src/main/java/org/springframework/launcher/it/jar/ExampleController.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-dir/src/main/java/org/springframework/launcher/it/jar/ExampleController.java deleted file mode 100644 index 41df3759ee..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-dir/src/main/java/org/springframework/launcher/it/jar/ExampleController.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.load.it.jar; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -/** - * Simple example Spring MVC Controller. - * - * @author Phillip Webb - */ -@Controller -public class ExampleController { - - @RequestMapping("/") - @ResponseBody - public String helloWorld() { - return "Hello Embedded Jar World!"; - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-dir/src/main/java/org/springframework/launcher/it/jar/SpringConfiguration.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-dir/src/main/java/org/springframework/launcher/it/jar/SpringConfiguration.java deleted file mode 100644 index c7c0d0bf20..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-dir/src/main/java/org/springframework/launcher/it/jar/SpringConfiguration.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.load.it.jar; - -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; - -/** - * Spring configuration. - * - * @author Phillip Webb - */ -@Configuration(proxyBeanMethods = false) -@EnableWebMvc -@ComponentScan -public class SpringConfiguration { - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-jar/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-jar/pom.xml deleted file mode 100644 index 7111e1f217..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-jar/pom.xml +++ /dev/null @@ -1,111 +0,0 @@ - - - 4.0.0 - org.springframework.boot.launcher.it - executable-jar - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - maven-assembly-plugin - @maven-assembly-plugin.version@ - - - src/main/assembly/jar-with-dependencies.xml - - false - - - org.springframework.boot.loader.JarLauncher - - - org.springframework.boot.load.it.jar.EmbeddedJarStarter - - - - - - jar-with-dependencies - package - - single - - - - - - org.apache.maven.plugins - maven-compiler-plugin - @maven-compiler-plugin.version@ - - - org.apache.maven.plugins - maven-dependency-plugin - @maven-dependency-plugin.version@ - - - unpack - prepare-package - - unpack - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - jar - - - ${project.build.directory}/assembly - - - - copy - prepare-package - - copy-dependencies - - - ${project.build.directory}/assembly/lib - - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - org.apache.maven.plugins - maven-surefire-plugin - @maven-surefire-plugin.version@ - - - - - - org.eclipse.jetty - jetty-webapp - @jetty.version@ - - - org.eclipse.jetty - jetty-annotations - @jetty.version@ - - - org.springframework - spring-webmvc - @spring-framework.version@ - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-jar/src/main/assembly/jar-with-dependencies.xml b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-jar/src/main/assembly/jar-with-dependencies.xml deleted file mode 100644 index 1f7cf8ec13..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-jar/src/main/assembly/jar-with-dependencies.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - full - - jar - - false - - - - - ${project.groupId}:${project.artifactId} - - true - - - - - ${project.build.directory}/assembly - / - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-jar/src/main/java/org/springframework/launcher/it/jar/EmbeddedJarStarter.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-jar/src/main/java/org/springframework/launcher/it/jar/EmbeddedJarStarter.java deleted file mode 100644 index 86afc3a61e..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-jar/src/main/java/org/springframework/launcher/it/jar/EmbeddedJarStarter.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.load.it.jar; - -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; -import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; -import org.springframework.web.servlet.DispatcherServlet; - -/** - * Main class to start the embedded server. - * - * @author Phillip Webb - */ -public final class EmbeddedJarStarter { - - public static void main(String[] args) throws Exception { - Server server = new Server(8080); - - ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); - context.setContextPath("/"); - server.setHandler(context); - - AnnotationConfigWebApplicationContext webApplicationContext = new AnnotationConfigWebApplicationContext(); - webApplicationContext.register(SpringConfiguration.class); - DispatcherServlet dispatcherServlet = new DispatcherServlet(webApplicationContext); - context.addServlet(new ServletHolder(dispatcherServlet), "/*"); - - server.start(); - server.join(); - } -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-jar/src/main/java/org/springframework/launcher/it/jar/ExampleController.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-jar/src/main/java/org/springframework/launcher/it/jar/ExampleController.java deleted file mode 100644 index 41df3759ee..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-jar/src/main/java/org/springframework/launcher/it/jar/ExampleController.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.load.it.jar; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -/** - * Simple example Spring MVC Controller. - * - * @author Phillip Webb - */ -@Controller -public class ExampleController { - - @RequestMapping("/") - @ResponseBody - public String helloWorld() { - return "Hello Embedded Jar World!"; - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-jar/src/main/java/org/springframework/launcher/it/jar/SpringConfiguration.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-jar/src/main/java/org/springframework/launcher/it/jar/SpringConfiguration.java deleted file mode 100644 index c7c0d0bf20..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-jar/src/main/java/org/springframework/launcher/it/jar/SpringConfiguration.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.load.it.jar; - -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; - -/** - * Spring configuration. - * - * @author Phillip Webb - */ -@Configuration(proxyBeanMethods = false) -@EnableWebMvc -@ComponentScan -public class SpringConfiguration { - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/loader.properties b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/loader.properties deleted file mode 100644 index 48a576ba04..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/loader.properties +++ /dev/null @@ -1 +0,0 @@ -loader.path=jar:file:target/executable-props-lib-0.0.1.BUILD-SNAPSHOT-dependencies.jar/!BOOT-INF/lib \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/pom.xml deleted file mode 100644 index c466d86f44..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/pom.xml +++ /dev/null @@ -1,114 +0,0 @@ - - - 4.0.0 - org.springframework.boot.launcher.it - executable-props-lib - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - maven-assembly-plugin - @maven-assembly-plugin.version@ - - - app - package - - single - - - - src/main/assembly/app.xml - - false - - - org.springframework.boot.loader.PropertiesLauncher - - - org.springframework.boot.launcher.it.props.EmbeddedJarStarter - - - - - - depedendencies - package - - single - - - - src/main/assembly/dependencies.xml - - false - - - - - - org.apache.maven.plugins - maven-compiler-plugin - @maven-compiler-plugin.version@ - - - org.apache.maven.plugins - maven-dependency-plugin - @maven-dependency-plugin.version@ - - - unpack - prepare-package - - unpack - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - jar - - - ${project.build.directory}/app-assembly - - - - copy - prepare-package - - copy-dependencies - - - ${project.build.directory}/dependencies-assembly/BOOT-INF/lib - - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - org.apache.maven.plugins - maven-surefire-plugin - @maven-surefire-plugin.version@ - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/src/main/assembly/app.xml b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/src/main/assembly/app.xml deleted file mode 100644 index 83a4f927e2..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/src/main/assembly/app.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - app - - jar - - false - - - - - ${project.groupId}:${project.artifactId} - - BOOT-INF/classes - true - - - - - ${project.build.directory}/app-assembly - / - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/src/main/assembly/dependencies.xml b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/src/main/assembly/dependencies.xml deleted file mode 100644 index 306b55e4e9..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/src/main/assembly/dependencies.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - dependencies - - jar - - false - - - ${project.build.directory}/dependencies-assembly - / - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/src/main/java/org/springframework/boot/launcher/it/props/EmbeddedJarStarter.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/src/main/java/org/springframework/boot/launcher/it/props/EmbeddedJarStarter.java deleted file mode 100644 index 23a4a38fd0..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/src/main/java/org/springframework/boot/launcher/it/props/EmbeddedJarStarter.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.launcher.it.props; - -import org.springframework.context.annotation.AnnotationConfigApplicationContext; - -/** - * Main class to start the embedded server. - * - * @author Dave Syer - */ -public final class EmbeddedJarStarter { - - public static void main(String[] args) throws Exception { - AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfiguration.class); - context.getBean(SpringConfiguration.class).run(args); - context.close(); - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/src/main/java/org/springframework/boot/launcher/it/props/SpringConfiguration.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/src/main/java/org/springframework/boot/launcher/it/props/SpringConfiguration.java deleted file mode 100644 index 9bdd06d447..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/src/main/java/org/springframework/boot/launcher/it/props/SpringConfiguration.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.launcher.it.props; - -import java.io.IOException; -import java.util.Properties; - -import org.springframework.beans.factory.InitializingBean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.ClassPathResource; - -/** - * Spring configuration. - * - * @author Dave Syer - */ -@Configuration(proxyBeanMethods = false) -@ComponentScan -public class SpringConfiguration implements InitializingBean { - - private String message = "Jar"; - - @Override - public void afterPropertiesSet() throws IOException { - Properties props = new Properties(); - props.load(new ClassPathResource("application.properties").getInputStream()); - String value = props.getProperty("message"); - if (value!=null) { - this.message = value; - } - - } - - public void run(String... args) { - System.err.println("Hello Embedded " + this.message + "!"); - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/src/main/resources/application.properties b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/src/main/resources/application.properties deleted file mode 100644 index c11051e347..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -message: World \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/verify.groovy deleted file mode 100644 index b855fbe7c7..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props-lib/verify.groovy +++ /dev/null @@ -1,17 +0,0 @@ -def jarfile = './target/executable-props-lib-0.0.1.BUILD-SNAPSHOT-app.jar' - -new File("${basedir}/application.properties").delete() - -String exec(String command) { - def proc = command.execute([], basedir) - proc.waitFor() - proc.err.text -} - -String out = exec("java -jar ${jarfile}") -assert out.contains('Hello Embedded World!'), - 'Using -jar my.jar should load dependencies from separate jar and use the application.properties from the jar\n' + out - -out = exec("java -cp ${jarfile} org.springframework.boot.loader.PropertiesLauncher") -assert out.contains('Hello Embedded World!'), - 'Using -cp my.jar with PropertiesLauncher should load dependencies from separate jar and use the application.properties from the jar\n' + out diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/pom.xml deleted file mode 100644 index 3e2a75482c..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/pom.xml +++ /dev/null @@ -1,101 +0,0 @@ - - - 4.0.0 - org.springframework.boot.launcher.it - executable-props - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - maven-assembly-plugin - @maven-assembly-plugin.version@ - - - src/main/assembly/jar-with-dependencies.xml - - false - - - org.springframework.boot.loader.PropertiesLauncher - - - org.springframework.boot.load.it.props.EmbeddedJarStarter - - - - - - jar-with-dependencies - package - - single - - - - - - org.apache.maven.plugins - maven-compiler-plugin - @maven-compiler-plugin.version@ - - - org.apache.maven.plugins - maven-dependency-plugin - @maven-dependency-plugin.version@ - - - unpack - prepare-package - - unpack - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - jar - - - ${project.build.directory}/assembly - - - - copy - prepare-package - - copy-dependencies - - - ${project.build.directory}/assembly/BOOT-INF/lib - - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - org.apache.maven.plugins - maven-surefire-plugin - @maven-surefire-plugin.version@ - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/src/main/assembly/jar-with-dependencies.xml b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/src/main/assembly/jar-with-dependencies.xml deleted file mode 100644 index 2dbf0f3a50..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/src/main/assembly/jar-with-dependencies.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - full - - jar - - false - - - - - ${project.groupId}:${project.artifactId} - - BOOT-INF/classes - true - - - - - ${project.build.directory}/assembly - / - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/src/main/java/org/springframework/launcher/it/props/EmbeddedJarStarter.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/src/main/java/org/springframework/launcher/it/props/EmbeddedJarStarter.java deleted file mode 100644 index 1837293b52..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/src/main/java/org/springframework/launcher/it/props/EmbeddedJarStarter.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.load.it.props; - -import org.springframework.context.annotation.AnnotationConfigApplicationContext; - -/** - * Main class to start the embedded server. - * - * @author Dave Syer - */ -public final class EmbeddedJarStarter { - - public static void main(String[] args) throws Exception { - AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfiguration.class); - context.getBean(SpringConfiguration.class).run(args); - context.close(); - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/src/main/java/org/springframework/launcher/it/props/SpringConfiguration.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/src/main/java/org/springframework/launcher/it/props/SpringConfiguration.java deleted file mode 100644 index eb5bc598b1..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/src/main/java/org/springframework/launcher/it/props/SpringConfiguration.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.load.it.props; - -import java.io.IOException; -import java.util.Properties; - -import org.springframework.beans.factory.InitializingBean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.ClassPathResource; - -/** - * Spring configuration. - * - * @author Dave Syer - */ -@Configuration(proxyBeanMethods = false) -@ComponentScan -public class SpringConfiguration implements InitializingBean { - - private String message = "Jar"; - - @Override - public void afterPropertiesSet() throws IOException { - Properties props = new Properties(); - props.load(new ClassPathResource("application.properties").getInputStream()); - String value = props.getProperty("message"); - if (value!=null) { - this.message = value; - } - - } - - public void run(String... args) { - System.err.println("Hello Embedded " + this.message + "!"); - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/src/main/resources/application.properties b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/src/main/resources/application.properties deleted file mode 100644 index c11051e347..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -message: World \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/verify.groovy deleted file mode 100644 index 0a0c034267..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-props/verify.groovy +++ /dev/null @@ -1,31 +0,0 @@ -def jarfile = './target/executable-props-0.0.1.BUILD-SNAPSHOT-full.jar' - -new File("${basedir}/application.properties").delete() - -String exec(String command) { - def proc = command.execute([], basedir) - proc.waitFor() - proc.err.text -} - -String out = exec("java -jar ${jarfile}") -assert out.contains('Hello Embedded World!'), - 'Using -jar my.jar should use the application.properties from the jar\n' + out - -out = exec("java -cp ${jarfile} org.springframework.boot.loader.PropertiesLauncher") -assert out.contains('Hello Embedded World!'), - 'Using -cp my.jar with PropertiesLauncher should use the application.properties from the jar\n' + out - -new File("${basedir}/application.properties").withWriter { it -> it << "message: Foo" } -out = exec("java -jar ${jarfile}") -assert out.contains('Hello Embedded World!'), - 'Should use the application.properties from the jar in preference to local filesystem\n' + out - -out = exec("java -Dloader.path=.,lib -jar ${jarfile}") -assert out.contains('Hello Embedded Foo!'), - 'With loader.path=.,lib should use the application.properties from the local filesystem\n' + out - -new File("${basedir}/target/application.properties").withWriter { it -> it << "message: Spam" } -out = exec("java -Dloader.path=target,.,lib -jar ${jarfile}") -assert out.contains('Hello Embedded Spam!'), - 'With loader.path=target,.,lib should use the application.properties from the target directory\n' + out \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/pom.xml deleted file mode 100644 index af6d71231e..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/pom.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - 4.0.0 - org.springframework.boot.launcher.it - executable-war - 0.0.1.BUILD-SNAPSHOT - war - - UTF-8 - @java.version@ - @java.version@ - - - - - org.apache.maven.plugins - maven-compiler-plugin - @maven-compiler-plugin.version@ - - - org.apache.maven.plugins - maven-dependency-plugin - @maven-dependency-plugin.version@ - - - unpack - prepare-package - - unpack - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - jar - - - ${project.build.directory}/${project.artifactId}-${project.version} - - - - - - org.apache.maven.plugins - maven-surefire-plugin - @maven-surefire-plugin.version@ - - - org.apache.maven.plugins - maven-war-plugin - @maven-war-plugin.version@ - - - - org.springframework.boot.loader.WarLauncher - - - org.springframework.boot.load.it.war.embedded.EmbeddedWarStarter - - - - - - - - - org.eclipse.jetty - jetty-webapp - @jetty.version@ - - - org.eclipse.jetty - jetty-plus - @jetty.version@ - - - org.eclipse.jetty - jetty-annotations - @jetty.version@ - - - org.springframework - spring-webmvc - @spring-framework.version@ - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/src/main/java/org/springframework/launcher/it/war/ExampleController.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/src/main/java/org/springframework/launcher/it/war/ExampleController.java deleted file mode 100644 index 6c0cbe3ca0..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/src/main/java/org/springframework/launcher/it/war/ExampleController.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.load.it.war; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -/** - * Simple example Spring MVC Controller. - * - * @author Phillip Webb - */ -@Controller -public class ExampleController { - - @RequestMapping("/") - @ResponseBody - public String helloWorld() { - return "Hello Embedded WAR World!"; - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/src/main/java/org/springframework/launcher/it/war/SpringConfiguration.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/src/main/java/org/springframework/launcher/it/war/SpringConfiguration.java deleted file mode 100644 index 1bc22a2efd..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/src/main/java/org/springframework/launcher/it/war/SpringConfiguration.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.load.it.war; - -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; - -/** - * Spring configuration. - * - * @author Phillip Webb - */ -@Configuration(proxyBeanMethods = false) -@EnableWebMvc -@ComponentScan -public class SpringConfiguration { - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/src/main/java/org/springframework/launcher/it/war/SpringInitializer.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/src/main/java/org/springframework/launcher/it/war/SpringInitializer.java deleted file mode 100644 index ee0cf7f882..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/src/main/java/org/springframework/launcher/it/war/SpringInitializer.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.load.it.war; - -import javax.servlet.ServletContext; -import javax.servlet.ServletException; - -import org.springframework.web.WebApplicationInitializer; -import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; -import org.springframework.web.servlet.DispatcherServlet; - -/** - * Spring {@link WebApplicationInitializer} for classic WAR deployment. - * - * @author Phillip Webb - */ -public class SpringInitializer implements WebApplicationInitializer { - - @Override - public void onStartup(ServletContext servletContext) throws ServletException { - AnnotationConfigWebApplicationContext webApplicationContext = new AnnotationConfigWebApplicationContext(); - webApplicationContext.register(SpringConfiguration.class); - servletContext.addServlet("dispatcherServlet", - new DispatcherServlet(webApplicationContext)).addMapping("/*"); - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/src/main/java/org/springframework/launcher/it/war/embedded/EmbeddedWarStarter.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/src/main/java/org/springframework/launcher/it/war/embedded/EmbeddedWarStarter.java deleted file mode 100644 index 4aac0a7dc6..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/src/main/java/org/springframework/launcher/it/war/embedded/EmbeddedWarStarter.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.load.it.war.embedded; - -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.webapp.Configuration; -import org.eclipse.jetty.webapp.WebAppContext; -import org.springframework.boot.load.it.war.SpringInitializer; - -/** - * Starter to launch the embedded server. NOTE: Jetty annotation scanning is not - * compatible with executable WARs so we must specify the {@link SpringInitializer}. - * - * @author Phillip Webb - */ -public final class EmbeddedWarStarter { - - public static void main(String[] args) throws Exception { - Server server = new Server(8080); - - WebAppContext webAppContext = new WebAppContext(); - webAppContext.setContextPath("/"); - webAppContext.setConfigurations(new Configuration[] { - new WebApplicationInitializersConfiguration(SpringInitializer.class) }); - - webAppContext.setParentLoaderPriority(true); - server.setHandler(webAppContext); - server.start(); - - server.join(); - } -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/src/main/java/org/springframework/launcher/it/war/embedded/WebApplicationInitializersConfiguration.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/src/main/java/org/springframework/launcher/it/war/embedded/WebApplicationInitializersConfiguration.java deleted file mode 100644 index 0d544e3076..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/executable-war/src/main/java/org/springframework/launcher/it/war/embedded/WebApplicationInitializersConfiguration.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.load.it.war.embedded; - -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; - -import org.eclipse.jetty.webapp.AbstractConfiguration; -import org.eclipse.jetty.webapp.Configuration; -import org.eclipse.jetty.webapp.WebAppContext; -import org.springframework.util.Assert; -import org.springframework.web.WebApplicationInitializer; - -/** - * Jetty {@link Configuration} that allows Spring {@link WebApplicationInitializer} to be - * started. This is required because Jetty annotation scanning does not work with packaged - * WARs. - * - * @author Phillip Webb - */ -public class WebApplicationInitializersConfiguration extends AbstractConfiguration { - - private Class[] webApplicationInitializers; - - public WebApplicationInitializersConfiguration(Class webApplicationInitializer, - Class... webApplicationInitializers) { - this.webApplicationInitializers = new Class[webApplicationInitializers.length + 1]; - this.webApplicationInitializers[0] = webApplicationInitializer; - System.arraycopy(webApplicationInitializers, 0, this.webApplicationInitializers, - 1, webApplicationInitializers.length); - for (Class i : webApplicationInitializers) { - Assert.notNull(i, "WebApplicationInitializer must not be null"); - Assert.isAssignable(WebApplicationInitializer.class, i); - } - } - - @Override - public void configure(WebAppContext context) throws Exception { - context.getServletContext().addListener(new ServletContextListener() { - - @Override - public void contextInitialized(ServletContextEvent sce) { - try { - for (Class webApplicationInitializer : webApplicationInitializers) { - WebApplicationInitializer initializer = (WebApplicationInitializer) webApplicationInitializer.newInstance(); - initializer.onStartup(sce.getServletContext()); - } - } - catch (Exception ex) { - throw new RuntimeException(ex); - } - } - - @Override - public void contextDestroyed(ServletContextEvent sce) { - } - }); - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/settings.xml b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/settings.xml deleted file mode 100644 index e1e0ace341..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/it/settings.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - it-repo - - true - - - - local.central - @localRepositoryUrl@ - - true - - - true - - - - - - local.central - @localRepositoryUrl@ - - true - - - true - - - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/PropertiesLauncherTests.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/PropertiesLauncherTests.java index 71fce71184..1777912765 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/PropertiesLauncherTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/PropertiesLauncherTests.java @@ -269,13 +269,19 @@ class PropertiesLauncherTests { List archives = new ArrayList<>(); String path = System.getProperty("java.class.path"); for (String url : path.split(File.pathSeparator)) { - archives.add(archive(url)); + Archive archive = archive(url); + if (archive != null) { + archives.add(archive); + } } return archives; } private Archive archive(String url) throws IOException { File file = new FileSystemResource(url).getFile(); + if (!file.exists()) { + return null; + } if (url.endsWith(".jar")) { return new JarFileArchive(file); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/build.gradle b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/build.gradle new file mode 100644 index 0000000000..aa76c5c447 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/build.gradle @@ -0,0 +1,88 @@ +plugins { + id 'org.asciidoctor.jvm.convert' + id 'org.asciidoctor.jvm.pdf' + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.maven-plugin' + id 'org.springframework.boot.optional-dependencies' +} + +description = "Spring Boot Maven Plugin" + +configurations { + documentation +} + +dependencies { + compileOnly 'org.apache.maven.plugin-tools:maven-plugin-annotations' + compileOnly 'org.sonatype.plexus:plexus-build-api' + + implementation enforcedPlatform(project(':spring-boot-project:spring-boot-parent')) + implementation project(':spring-boot-project:spring-boot-tools:spring-boot-loader-tools') + implementation 'org.apache.maven.shared:maven-common-artifact-filters' + implementation 'org.apache.maven:maven-plugin-api' + + intTestImplementation enforcedPlatform(project(':spring-boot-project:spring-boot-parent')) + intTestImplementation 'org.apache.maven.shared:maven-invoker' + intTestImplementation 'org.assertj:assertj-core' + intTestImplementation 'org.junit.jupiter:junit-jupiter' + + optional enforcedPlatform(project(':spring-boot-project:spring-boot-parent')) + optional 'org.apache.maven.plugins:maven-shade-plugin' + + runtimeOnly 'org.sonatype.plexus:plexus-build-api' + + testImplementation enforcedPlatform(project(':spring-boot-project:spring-boot-parent')) + testImplementation 'org.assertj:assertj-core' + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.mockito:mockito-core' + testImplementation 'org.springframework:spring-core' +} + +syncDocumentationSourceForAsciidoctor { + from(documentPluginGoals) { + into 'asciidoc/goals' + } +} + +asciidoctor { + sources { + include 'index.adoc' + } +} + +syncDocumentationSourceForAsciidoctorPdf { + from(documentPluginGoals) { + into 'asciidoc/goals' + } +} + +asciidoctorPdf { + sources { + include 'index.adoc' + } +} + +tasks.withType(org.asciidoctor.gradle.jvm.AbstractAsciidoctorTask) { + attributes 'maven-jar-plugin-version': '1.2.3', + 'maven-failsafe-plugin-version': '1.2.3', + 'build-helper-maven-plugin-version': '1.2.3' +} + +task zip(type: Zip) { + dependsOn asciidoctor, asciidoctorPdf + duplicatesStrategy 'fail' + from(asciidoctorPdf.outputDir) { + into 'pdf' + } + from(asciidoctor.outputDir) { + into 'html' + } +} + +prepareMavenBinaries { + versions '3.6.2', '3.5.4' +} + +artifacts { + 'documentation' zip +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/pom.xml deleted file mode 100644 index 10d5f0dc7b..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/pom.xml +++ /dev/null @@ -1,499 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-tools - ${revision} - - spring-boot-maven-plugin - maven-plugin - Spring Boot Maven Plugin - Spring Boot Maven Plugin - - ${basedir}/../../.. - 3.3.9 - ${project.build.directory}/refdocs/ - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - - org.springframework.boot - spring-boot-loader-tools - - - org.apache.maven - maven-archiver - - - org.apache.maven - maven-artifact - - - org.apache.maven - maven-core - - - javax.enterprise - cdi-api - - - - - org.apache.maven - maven-model - - - org.apache.maven - maven-plugin-api - - - org.apache.maven - maven-settings - - - org.apache.maven.shared - maven-common-artifact-filters - - - javax.enterprise - cdi-api - - - - - org.codehaus.plexus - plexus-archiver - - - org.codehaus.plexus - plexus-container-default - - - org.codehaus.plexus - plexus-component-api - - - - - org.codehaus.plexus - plexus-utils - - - org.sonatype.plexus - plexus-build-api - - - - org.apache.maven.plugins - maven-shade-plugin - true - - - - org.apache.maven.plugin-tools - maven-plugin-annotations - provided - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - org.apache.maven.plugins - maven-plugin-plugin - - spring-boot - true - - - - generate-descriptor - - descriptor - - - - generated-helpmojo - - helpmojo - - - - - - - - - integration - - true - - - - - org.apache.maven.plugins - maven-invoker-plugin - - ${project.build.directory}/local-repo - - - - prepare-integration-test - pre-integration-test - - install - - - - integration-test - - run - - - ${project.build.directory}/it - src/it/settings.xml - verify - true - ${skipTests} - true - - - - - - org.apache.maven.plugins - maven-antrun-plugin - - - cleanup-local-integration-repo - pre-integration-test - - run - - - - - - - - - - - - - - - - full - - - full - - - - - - org.apache.maven.plugins - maven-invoker-plugin - - ${project.build.directory}/local-repo - - - - prepare-integration-test - pre-integration-test - - install - - - - integration-test - - run - - - ${project.build.directory}/it - src/it/settings.xml - verify - true - ${skipTests} - true - - - - - - org.apache.maven.plugins - maven-antrun-plugin - - - ant-contrib - ant-contrib - 1.0b3 - - - ant - ant - - - - - org.apache.ant - ant-nodeps - 1.8.1 - - - org.tigris.antelope - antelopetasks - 3.2.10 - - - - - cleanup-local-integration-repo - pre-integration-test - - run - - - - - - - - - - - set-up-maven-properties - prepare-package - - run - - - true - - - - - - - - - - - - - - - package-docs-zip - package - - run - - - - - - - - - - - - - - - - - com.googlecode.maven-download-plugin - download-maven-plugin - - - unpack-doc-resources - generate-resources - - wget - - - ${spring-doc-resources.url} - true - ${refdocs.build.directory} - - - - - - org.codehaus.gmavenplus - gmavenplus-plugin - - - - execute - - prepare-package - - - - - - - - - - org.codehaus.groovy - groovy-ant - ${groovy.version} - - - org.codehaus.groovy - groovy-xml - ${groovy.version} - - - - - org.asciidoctor - asciidoctor-maven-plugin - - - generate-html-documentation - prepare-package - - process-asciidoc - - - html5 - ${project.build.directory}/generated-docs/reference/html - highlight.js - book - - js/highlight - github - true - ./images - font - css/ - spring.css - warn - - - true - - DEBUG - - - - - - generate-pdf-documentation - prepare-package - - process-asciidoc - - - pdf - ${project.build.directory}/generated-docs/reference/pdf - - - - - ${refdocs.build.directory} - index.adoc - - ${project.version} - ${build-helper-maven-plugin.version} - ${maven-failsafe-plugin.version} - ${maven-jar-plugin.version} - ${project.basedir}/target/generated-resources - - - - - org.asciidoctor - asciidoctorj-pdf - 1.5.0-alpha.18 - - - - - org.apache.maven.plugins - maven-resources-plugin - - - copy-asciidoc-resources - generate-resources - - copy-resources - - - ${refdocs.build.directory} - - - src/main/asciidoc - false - - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - attach-zip - - attach-artifact - - - - - ${project.build.directory}/${project.artifactId}-${project.version}-docs.zip - zip - docs - - - - - - - - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/build-info.adoc b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/build-info.adoc new file mode 100644 index 0000000000..f51b71b6a0 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/build-info.adoc @@ -0,0 +1,41 @@ +[[build-info]] +== Integrating with Actuator +Spring Boot Actuator displays build-related information if a `META-INF/build-info.properties` file is present. +The `build-info` goal generates such file with the coordinates of the project and the build time. +It also allows you to add an arbitrary number of additional properties, as shown in the following example: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + + + org.springframework.boot + spring-boot-maven-plugin + {version} + + + + build-info + + + + UTF-8 + UTF-8 + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + + + +---- + +This configuration will generate a `build-info.properties` at the expected location with four additional keys. +Note that `maven.compiler.source` and `maven.compiler.target` are expected to be regular properties available in the project. +They will be interpolated as you would expect. + +include::goals/build-info.adoc[leveloffset=+1] diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/getting-started.adoc b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/getting-started.adoc new file mode 100644 index 0000000000..e3121cbeac --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/getting-started.adoc @@ -0,0 +1,7 @@ +[[getting-started]] +== Getting started + +The Spring Boot Plugin has the following goals: + +include::goals/overview.adoc[] + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/help.adoc b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/help.adoc new file mode 100644 index 0000000000..79eb182a23 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/help.adoc @@ -0,0 +1,5 @@ +[[help]] +== Help information +The `help` goal is a standard goal that displays information on the capabilities of the plugin. + +include::goals/help.adoc[leveloffset=+1] diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/index.adoc b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/index.adoc similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/index.adoc rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/index.adoc diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/integration-tests.adoc b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/integration-tests.adoc new file mode 100644 index 0000000000..1915596155 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/integration-tests.adoc @@ -0,0 +1,179 @@ +[[integration-tests]] +== Running Integration tests + +While you may start your Spring Boot application very easily from your test (or test suite) itself, it may be desirable to handle that in the build itself. +To make sure that the lifecycle of your Spring Boot application is properly managed around your integration tests, you can use the `start` and `stop` goals, as shown in the following example: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + + org.springframework.boot + spring-boot-maven-plugin + {version} + + + pre-integration-test + + start + + + + post-integration-test + + stop + + + + + + +---- + +Such setup can now use the https://maven.apache.org/surefire/maven-failsafe-plugin[failsafe-plugin] to run your integration tests as you would expect. + +You could also configure a more advanced setup to skip the integration tests when a specific property has been set, see <>. + +include::goals/start.adoc[leveloffset=+1] + +include::goals/stop.adoc[leveloffset=+1] + + +[[integration-tests-example]] +=== Examples + + + +[[integration-tests-example-random-port]] +==== Random Port for Integration Tests +One nice feature of the Spring Boot test integration is that it can allocate a free port for the web application. +When the `start` goal of the plugin is used, the Spring Boot application is started separately, making it difficult to pass the actual port to the integration test itself. + +The example below showcases how you could achieve the same feature using the https://www.mojohaus.org/build-helper-maven-plugin[Build Helper Maven Plugin]: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + + + org.codehaus.mojo + build-helper-maven-plugin + {build-helper-maven-plugin-version} + + + reserve-tomcat-port + + reserve-network-port + + process-resources + + + tomcat.http.port + + + + + + + org.springframework.boot + spring-boot-maven-plugin + {version} + + + pre-integration-test + + start + + + + --server.port=${tomcat.http.port} + + + + + post-integration-test + + stop + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + {maven-failsafe-plugin-version} + + + ${tomcat.http.port} + + + + + + +---- + +You can now retrieve the `test.server.port` system property in any of your integration test to create a proper `URL` to the server. + + + +[[integration-tests-example-skip]] +==== Skip Integration Tests +The `skip` property allows to skip the execution of the Spring Boot maven plugin altogether. + +This example shows how you can skip integration tests with a command-line property and still make sure that the `repackage` goal runs: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + false + + + + + org.springframework.boot + spring-boot-maven-plugin + {version} + + + pre-integration-test + + start + + + ${skip.it} + + + + post-integration-test + + stop + + + ${skip.it} + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + {maven-failsafe-plugin-version} + + ${skip.it} + + + + + +---- + +By default, the integration tests will run but this setup allows you to easily disable them on the command-line as follows: + +[indent=0] +---- + $ mvn verify -Dskip.it=true +---- diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/packaging.adoc b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/packaging.adoc new file mode 100644 index 0000000000..9a9aa22dee --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/packaging.adoc @@ -0,0 +1,395 @@ +[[repackage]] +== Packaging executable archives + +The plugin can create executable archives (jar files and war files) that contain all of an application's dependencies and can then be run with `java -jar`. + +Packaging an executable archive is performed by the `repackage` goal, as shown in the following example: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + + org.springframework.boot + spring-boot-maven-plugin + {version} + + + + repackage + + + + + + +---- + +TIP: If you are using `spring-boot-starter-parent`, such execution is already pre-configured with a `repackage` execution id so that only the plugin definition should be added. + +The example above repackages a jar or war that is built during the package phase of the Maven lifecycle, including any `provided` dependencies that are defined in the project. +If some of these dependencies need to be excluded, you can use one of the exclude options, see the <> for more details. + +NOTE: The `outputFileNameMapping` feature of the `maven-war-plugin` is currently not supported. + +Devtools is automatically excluded by default (you can control that using the `excludeDevtools` property). +In order to make that work with `war` packaging, the `spring-boot-devtools` dependency must be set as `optional` or with the `provided` scope. + +The original (i.e. non executable) artifact is renamed to `.original` by default but it is also possible to keep the original artifact using a custom classifier. + +The plugin rewrites your manifest, and in particular it manages the "Main-Class" and "Start-Class" entries, so if the defaults don't work you have to configure those there (not in the jar plugin). +The "Main-Class" in the manifest is actually controlled by the "layout" property of the Spring Boot plugin, as shown in the following example: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + + org.springframework.boot + spring-boot-maven-plugin + {version} + + ${start.class} + ZIP + + + + + repackage + + + + + + +---- + +The `layout` property defaults to a guess based on the archive type (`jar` or `war`). The following layouts are available: + +* `JAR`: regular executable JAR layout. +* `WAR`: executable WAR layout. `provided` dependencies are placed in `WEB-INF/lib-provided` to avoid any clash when the `war` is deployed in a servlet container. +* `ZIP` (alias to `DIR`): similar to the `JAR` layout using `PropertiesLauncher`. +* `NONE`: Bundle all dependencies and project resources. Does not bundle a bootstrap loader. + +include::goals/repackage.adoc[leveloffset=+1] + +[[repackage-examples]] +=== Examples + +[[repackage-example-custom-classifier]] +==== Custom Classifier +By default, the `repackage` goal replaces the original artifact with the repackaged one. +That is a sane behavior for modules that represent an application but if your module is used as a dependency of another module, you need to provide a classifier for the repackaged one. +The reason for that is that application classes are packaged in `BOOT-INF/classes` so that the dependent module cannot load a repackaged jar's classes. + +If that is the case or if you prefer to keep the original artifact and attach the repackaged one with a different classifier, configure the plugin as shown in the following example: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + + + org.springframework.boot + spring-boot-maven-plugin + {version} + + + repackage + + repackage + + + exec + + + + + + + +---- + +If you are using `spring-boot-starter-parent`, the `repackage` goal is executed automatically in an execution with id `repackage`. +In that setup, only the configuration should be specified, as shown in the following example: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + + + org.springframework.boot + spring-boot-maven-plugin + + + repackage + + exec + + + + + + + +---- + +This configuration will generate two artifacts: the original one and the repackaged counter part produced by the repackage goal. +Both will be installed/deployed transparently. + +You can also use the same configuration if you want to repackage a secondary artifact the same way the main artifact is replaced. +The following configuration installs/deploys a single `task` classified artifact with the repackaged application: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + + + org.apache.maven.plugins + maven-jar-plugin + {maven-jar-plugin-version} + + + + jar + + package + + task + + + + + + org.springframework.boot + spring-boot-maven-plugin + {version} + + + repackage + + repackage + + + task + + + + + + + +---- + +As both the `maven-jar-plugin` and the `spring-boot-maven-plugin` runs at the same phase, it is important that the jar plugin is defined first (so that it runs before the repackage goal). +Again, if you are using `spring-boot-starter-parent`, this can be simplified as follows: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + + + org.apache.maven.plugins + maven-jar-plugin + + + default-jar + + task + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + repackage + + task + + + + + + + +---- + + + +[[repackage-example-custom-name]] +==== Custom Name +If you need the repackaged jar to have a different local name than the one defined by the `artifactId` attribute of the project, simply use the standard `finalName`, as shown in the following example: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + my-app + + + org.springframework.boot + spring-boot-maven-plugin + {version} + + + repackage + + repackage + + + + + + + +---- + +This configuration will generate the repackaged artifact in `target/my-app.jar`. + + + +[[repackage-example-local-artifact]] +==== Local Repackaged Artifact +By default, the `repackage` goal replaces the original artifact with the executable one. +If you need to only deploy the original jar and yet be able to run your app with the regular file name, configure the plugin as follows: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + + + org.springframework.boot + spring-boot-maven-plugin + {version} + + + repackage + + repackage + + + false + + + + + + + +---- + +This configuration generates two artifacts: the original one and the executable counter part produced by the `repackage` goal. +Only the original one will be installed/deployed. + + + +[[repackage-example-custom-layout]] +==== Custom Layout +Spring Boot repackages the jar file for this project using a custom layout factory defined in the additional jar file, provided as a dependency to the build plugin: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + + + org.springframework.boot + spring-boot-maven-plugin + {version} + + + repackage + + repackage + + + + value + + + + + + + com.example + custom-layout + 0.0.1.BUILD-SNAPSHOT + + + + + + +---- + +The layout factory is provided as an implementation of `LayoutFactory` (from `spring-boot-loader-tools`) explicitly specified in the pom. +If there is only one custom `LayoutFactory` on the plugin classpath and it is listed in `META-INF/spring.factories` then it is unnecessary to explicitly set it in the plugin configuration. + +Layout factories are always ignored if an explicit <> is set. + + + +[[repackage-example-exclude-dependency]] +==== Dependency Exclusion +By default, both the `repackage` and the `run` goals will include any `provided` dependencies that are defined in the project. +A Spring Boot project should consider `provided` dependencies as "container" dependencies that are required to run the application. + +Some of these dependencies may not be required at all and should be excluded from the executable jar. +For consistency, they should not be present either when running the application. + +There are two ways one can exclude a dependency from being packaged/used at runtime: + +* Exclude a specific artifact identified by `groupId` and `artifactId`, optionally with a `classifier` if needed. +* Exclude any artifact belonging to a given `groupId`. + +The following example excludes `com.foo:bar`, and only that artifact: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + + + org.springframework.boot + spring-boot-maven-plugin + {version} + + + + com.foo + bar + + + + + + + +---- + +This example excludes any artifact belonging to the `com.foo` group: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + + + org.springframework.boot + spring-boot-maven-plugin + {version} + + com.foo + + + + + +---- diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/running.adoc b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/running.adoc new file mode 100644 index 0000000000..cf9cfcfe59 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/docs/asciidoc/running.adoc @@ -0,0 +1,241 @@ +[[run]] +== Running your application with Maven + +The plugin includes a run goal which can be used to launch your application from the command line, as shown in the following example: + +[indent=0] +---- + $ mvn spring-boot:run +---- + +By default the application is executed in a forked process and setting properties on the command-line will not affect the application. +If you need to specify some JVM arguments (i.e. for debugging purposes), you can use the `jvmArguments` parameter, see <> for more details. +There is also explicit support for <> and <>. + +As enabling a profile is quite common, there is dedicated `profiles` property that offers a shortcut for `-Dspring-boot.run.jvmArguments="-Dspring.profiles.active=dev"`, see <>. + +Although this is not recommended, it is possible to execute the application directly from the Maven JVM by disabling the `fork` property. +Doing so means that the `jvmArguments`, `systemPropertyVariables`, `environmentVariables` and `agents` options are ignored. + +Spring Boot `devtools` is a module to improve the development-time experience when working on Spring Boot applications. +To enable it, just add the following dependency to your project: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + org.springframework.boot + spring-boot-devtools + {version} + true + + +---- + +When `devtools` is running, it detects change when you recompile your application and automatically refreshes it. +This works for not only resources but code as well. +It also provides a LiveReload server so that it can automatically trigger a browser refresh whenever things change. + +Devtools can also be configured to only refresh the browser whenever a static resource has changed (and ignore any change in the code). +Just include the following property in your project: + +[source,properties,indent=0] +---- + spring.devtools.remote.restart.enabled=false +---- + +Prior to `devtools`, the plugin supported hot refreshing of resources by default which has now be disabled in favour of the solution described above. +You can restore it at any time by configuring your project: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + + org.springframework.boot + spring-boot-maven-plugin + {version} + + true + + + + +---- + +When `addResources` is enabled, any `src/main/resources` folder will be added to the application classpath when you run the application and any duplicate found in `target/classes` will be removed. +This allows hot refreshing of resources which can be very useful when developing web applications. +For example, you can work on HTML, CSS or JavaScript files and see your changes immediately without recompiling your application. +It is also a helpful way of allowing your front end developers to work without needing to download and install a Java IDE. + +NOTE: A side effect of using this feature is that filtering of resources at build time will not work. + +In order to be consistent with the `repackage` goal, the `run` goal builds the classpath in such a way that any dependency that is excluded in the plugin's configuration gets excluded from the classpath as well. +For more details, see <>. + +Sometimes it is useful to include test dependencies when running the application. +For example, if you want to run your application in a test mode that uses stub classes. +If you wish to do this, you can set the `useTestClasspath` parameter to true. +Note that this is only applied when you run an application: the `repackage` goal will not add test dependencies to the resulting JAR/WAR. + +include::goals/run.adoc[leveloffset=+1] + +[[run-examples]] +=== Examples + + + +[[run-example-debug]] +==== Debug the Application +By default, the `run` goal runs your application in a forked process. +If you need to debug it, you should add the necessary JVM arguments to enable remote debugging. +The following configuration suspend the process until a debugger has joined on port 5005: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + + + org.springframework.boot + spring-boot-maven-plugin + {version} + + + -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 + + + + + + +---- + +These arguments can be specified on the command line as well, make sure to wrap that properly, that is: + +[indent=0] +---- + $ mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005" +---- + + + +[[run-example-system-properties]] +==== Using System Properties +System properties can be specified using the `systemPropertyVariables` attribute. +The following example sets `property1` to `test` and `property2` to 42: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + + 42 + + + + org.springframework.boot + spring-boot-maven-plugin + {version} + + + test + ${my.value} + + + + + + +---- + +If the value is empty or not defined (i.e. `), the system property is set with an empty String as the value. +Maven trims values specified in the pom so it is not possible to specify a System property which needs to start or end with a space via this mechanism: consider using `jvmArguments` instead. + +Any String typed Maven variable can be passed as system properties. +Any attempt to pass any other Maven variable type (e.g. a `List` or a `URL` variable) will cause the variable expression to be passed literally (unevaluated). + +The `jvmArguments` parameter takes precedence over system properties defined with the mechanism above. +In the following example, the value for `property1` is `overridden`: + +[indent=0] +---- + $ mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Dproperty1=overridden" +---- + + + +[[run-example-environment-variables]] +==== Using Environment Variables +Environment variables can be specified using the `environmentVariables` attribute. +The following example sets the 'ENV1', 'ENV2', 'ENV3', 'ENV4' env variables: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + + + org.springframework.boot + spring-boot-maven-plugin + {version} + + + 5000 + Some Text + + + + + + + + +---- + +If the value is empty or not defined (i.e. `), the env variable is set with an empty String as the value. +Maven trims values specified in the pom so it is not possible to specify an env variable which needs to start or end with a space. + +Any String typed Maven variable can be passed as system properties. +Any attempt to pass any other Maven variable type (e.g. a `List` or a `URL` variable) will cause the variable expression to be passed literally (unevaluated). + +Environment variables defined this way take precedence over existing values. + + + +[[run-example-active-profiles]] +==== Specify Active Profiles +The active profiles to use for a particular application can be specified using the `profiles` argument. + +The following configuration enables the `foo` and `bar` profiles: + +[source,xml,indent=0,subs="verbatim,attributes"] +---- + + + + + org.springframework.boot + spring-boot-maven-plugin + {version} + + + foo + bar + + + + + + +---- + +The profiles to enable can be specified on the command line as well, make sure to separate them with a comma, as shown in the following example: + +[indent=0] +---- + $ mvn spring-boot:run -Dspring-boot.run.profiles=foo,bar +---- + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/AbstractArchiveIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/AbstractArchiveIntegrationTests.java new file mode 100644 index 0000000000..8a373314a2 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/AbstractArchiveIntegrationTests.java @@ -0,0 +1,173 @@ +/* + * Copyright 2012-2020 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.boot.maven; + +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.jar.Manifest; +import java.util.stream.Stream; + +import org.assertj.core.api.AbstractAssert; +import org.assertj.core.api.AssertProvider; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.contentOf; + +/** + * Base class for archive (jar or war) related Maven plugin integration tests. + * + * @author Andy Wilkinson + */ +abstract class AbstractArchiveIntegrationTests { + + protected String buildLog(File project) { + return contentOf(new File(project, "target/build.log")); + } + + protected String launchScript(File jar) { + String content = contentOf(jar); + return content.substring(0, content.indexOf(new String(new byte[] { 0x50, 0x4b, 0x03, 0x04 }))); + } + + protected AssertProvider jar(File file) { + return new AssertProvider() { + + @Override + @Deprecated + public JarAssert assertThat() { + return new JarAssert(file); + } + + }; + } + + static final class JarAssert extends AbstractAssert { + + private JarAssert(File actual) { + super(actual, JarAssert.class); + assertThat(actual.exists()); + } + + JarAssert doesNotHaveEntryWithName(String name) { + withJarFile((jarFile) -> { + withEntries(jarFile, (entries) -> { + Optional match = entries.filter((entry) -> entry.getName().equals(name)).findFirst(); + assertThat(match).isNotPresent(); + }); + }); + return this; + } + + JarAssert hasEntryWithName(String name) { + withJarFile((jarFile) -> { + withEntries(jarFile, (entries) -> { + Optional match = entries.filter((entry) -> entry.getName().equals(name)).findFirst(); + assertThat(match).hasValueSatisfying((entry) -> assertThat(entry.getComment()).isNull()); + }); + }); + return this; + } + + JarAssert hasEntryWithNameStartingWith(String prefix) { + withJarFile((jarFile) -> { + withEntries(jarFile, (entries) -> { + Optional match = entries.filter((entry) -> entry.getName().startsWith(prefix)) + .findFirst(); + assertThat(match).hasValueSatisfying((entry) -> assertThat(entry.getComment()).isNull()); + }); + }); + return this; + } + + JarAssert hasUnpackEntryWithNameStartingWith(String prefix) { + withJarFile((jarFile) -> { + withEntries(jarFile, (entries) -> { + Optional match = entries.filter((entry) -> entry.getName().startsWith(prefix)) + .findFirst(); + assertThat(match).as("Name starting with %s", prefix) + .hasValueSatisfying((entry) -> assertThat(entry.getComment()).startsWith("UNPACK:")); + }); + }); + return this; + } + + JarAssert doesNotHaveEntryWithNameStartingWith(String prefix) { + withJarFile((jarFile) -> { + withEntries(jarFile, (entries) -> { + Optional match = entries.filter((entry) -> entry.getName().startsWith(prefix)) + .findFirst(); + assertThat(match).isNotPresent(); + }); + }); + return this; + } + + JarAssert manifest(Consumer consumer) { + withJarFile((jarFile) -> { + try { + consumer.accept(new ManifestAssert(jarFile.getManifest())); + } + catch (IOException ex) { + throw new RuntimeException(ex); + } + }); + return this; + } + + void withJarFile(Consumer consumer) { + try (JarFile jarFile = new JarFile(this.actual)) { + consumer.accept(jarFile); + } + catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + void withEntries(JarFile jarFile, Consumer> entries) { + entries.accept(Collections.list(jarFile.entries()).stream()); + } + + static final class ManifestAssert extends AbstractAssert { + + private ManifestAssert(Manifest actual) { + super(actual, ManifestAssert.class); + } + + ManifestAssert hasStartClass(String expected) { + assertThat(this.actual.getMainAttributes().getValue("Start-Class")).isEqualTo(expected); + return this; + } + + ManifestAssert hasMainClass(String expected) { + assertThat(this.actual.getMainAttributes().getValue("Main-Class")).isEqualTo(expected); + return this; + } + + ManifestAssert hasAttribute(String name, String value) { + assertThat(this.actual.getMainAttributes().getValue(name)).isEqualTo(value); + return this; + } + + } + + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/BuildInfoIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/BuildInfoIntegrationTests.java new file mode 100644 index 0000000000..ac36d2eba2 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/BuildInfoIntegrationTests.java @@ -0,0 +1,147 @@ +/* + * Copyright 2012-2020 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.boot.maven; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.Properties; +import java.util.function.Consumer; + +import org.assertj.core.api.AbstractMapAssert; +import org.assertj.core.api.AssertProvider; +import org.junit.jupiter.api.TestTemplate; +import org.junit.jupiter.api.extension.ExtendWith; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Integration tests for the Maven plugin's build info support. + * + * @author Andy Wilkinson + */ +@ExtendWith(MavenBuildExtension.class) +public class BuildInfoIntegrationTests { + + @TestTemplate + void buildInfoPropertiesAreGenerated(MavenBuild mavenBuild) { + mavenBuild.project("build-info").execute(buildInfo((buildInfo) -> assertThat(buildInfo) + .hasBuildGroup("org.springframework.boot.maven.it").hasBuildArtifact("build-info") + .hasBuildName("Generate build info").hasBuildVersion("0.0.1.BUILD-SNAPSHOT").containsBuildTime())); + } + + @TestTemplate + void generatedBuildInfoIncludesAdditionalProperties(MavenBuild mavenBuild) { + mavenBuild.project("build-info-additional-properties").execute(buildInfo((buildInfo) -> assertThat(buildInfo) + .hasBuildGroup("org.springframework.boot.maven.it").hasBuildArtifact("build-info-additional-properties") + .hasBuildName("Generate build info with additional properties").hasBuildVersion("0.0.1.BUILD-SNAPSHOT") + .containsBuildTime().containsEntry("build.foo", "bar").containsEntry("build.encoding", "UTF-8") + .containsEntry("build.java.source", "1.8"))); + } + + @TestTemplate + void generatedBuildInfoUsesCustomBuildTime(MavenBuild mavenBuild) { + mavenBuild.project("build-info-custom-build-time").execute(buildInfo((buildInfo) -> assertThat(buildInfo) + .hasBuildGroup("org.springframework.boot.maven.it").hasBuildArtifact("build-info-custom-build-time") + .hasBuildName("Generate build info with custom build time").hasBuildVersion("0.0.1.BUILD-SNAPSHOT") + .hasBuildTime("2019-07-08T08:00:00Z"))); + } + + @TestTemplate + void buildInfoPropertiesAreGeneratedToCustomOutputLocation(MavenBuild mavenBuild) { + mavenBuild.project("build-info-custom-file") + .execute(buildInfo("target/build.info", + (buildInfo) -> assertThat(buildInfo).hasBuildGroup("org.springframework.boot.maven.it") + .hasBuildArtifact("build-info-custom-file").hasBuildName("Generate custom build info") + .hasBuildVersion("0.0.1.BUILD-SNAPSHOT").containsBuildTime())); + } + + @TestTemplate + void whenBuildTimeIsDisabledIfDoesNotAppearInGeneratedBuildInfo(MavenBuild mavenBuild) { + mavenBuild.project("build-info-disable-build-time").execute(buildInfo((buildInfo) -> assertThat(buildInfo) + .hasBuildGroup("org.springframework.boot.maven.it").hasBuildArtifact("build-info-disable-build-time") + .hasBuildName("Generate build info with disabled build time").hasBuildVersion("0.0.1.BUILD-SNAPSHOT") + .doesNotContainBuildTime())); + } + + private Consumer buildInfo(Consumer> buildInfo) { + return buildInfo("target/classes/META-INF/build-info.properties", buildInfo); + } + + private Consumer buildInfo(String location, Consumer> buildInfo) { + return (project) -> buildInfo.accept((buildInfo(project, location))); + } + + private AssertProvider buildInfo(File project, String buildInfo) { + return new AssertProvider() { + + @Override + @Deprecated + public BuildInfoAssert assertThat() { + return new BuildInfoAssert(new File(project, buildInfo)); + } + + }; + } + + private static final class BuildInfoAssert extends AbstractMapAssert { + + private BuildInfoAssert(File actual) { + super(loadProperties(actual), BuildInfoAssert.class); + } + + private static Properties loadProperties(File file) { + try (FileReader reader = new FileReader(file)) { + Properties properties = new Properties(); + properties.load(reader); + return properties; + } + catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + BuildInfoAssert hasBuildGroup(String expected) { + return containsEntry("build.group", expected); + } + + BuildInfoAssert hasBuildArtifact(String expected) { + return containsEntry("build.artifact", expected); + } + + BuildInfoAssert hasBuildName(String expected) { + return containsEntry("build.name", expected); + } + + BuildInfoAssert hasBuildVersion(String expected) { + return containsEntry("build.version", expected); + } + + BuildInfoAssert containsBuildTime() { + return containsKey("build.time"); + } + + BuildInfoAssert doesNotContainBuildTime() { + return doesNotContainKey("build.time"); + } + + BuildInfoAssert hasBuildTime(String expected) { + return containsEntry("build.time", expected); + } + + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/JarIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/JarIntegrationTests.java new file mode 100644 index 0000000000..f05dcc4750 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/JarIntegrationTests.java @@ -0,0 +1,283 @@ +/* + * Copyright 2012-2020 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.boot.maven; + +import java.io.File; + +import org.junit.jupiter.api.TestTemplate; +import org.junit.jupiter.api.extension.ExtendWith; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Integration tests for the Maven plugin's jar support. + * + * @author Andy Wilkinson + */ +@ExtendWith(MavenBuildExtension.class) +class JarIntegrationTests extends AbstractArchiveIntegrationTests { + + @TestTemplate + void whenJarIsRepackagedInPlaceOnlyRepackagedJarIsInstalled(MavenBuild mavenBuild) { + mavenBuild.project("jar").goals("install").execute((project) -> { + File original = new File(project, "target/jar-0.0.1.BUILD-SNAPSHOT.jar.original"); + assertThat(original).isFile(); + File repackaged = new File(project, "target/jar-0.0.1.BUILD-SNAPSHOT.jar"); + assertThat(launchScript(repackaged)).isEmpty(); + assertThat(jar(repackaged)).manifest((manifest) -> { + manifest.hasMainClass("org.springframework.boot.loader.JarLauncher"); + manifest.hasStartClass("some.random.Main"); + manifest.hasAttribute("Not-Used", "Foo"); + }).hasEntryWithNameStartingWith("BOOT-INF/lib/spring-context") + .hasEntryWithNameStartingWith("BOOT-INF/lib/spring-core") + .hasEntryWithNameStartingWith("BOOT-INF/lib/spring-jcl") + .hasEntryWithNameStartingWith("BOOT-INF/lib/jakarta.servlet-api-4") + .hasEntryWithName("BOOT-INF/classes/org/test/SampleApplication.class") + .hasEntryWithName("org/springframework/boot/loader/JarLauncher.class"); + assertThat(buildLog(project)).contains("Replacing main artifact with repackaged archive") + .contains("Installing " + repackaged + " to").doesNotContain("Installing " + original + " to"); + }); + } + + @TestTemplate + void whenAttachIsDisabledOnlyTheOriginalJarIsInstalled(MavenBuild mavenBuild) { + mavenBuild.project("jar-attach-disabled").goals("install").execute((project) -> { + File original = new File(project, "target/jar-attach-disabled-0.0.1.BUILD-SNAPSHOT.jar.original"); + assertThat(original).isFile(); + File main = new File(project, "target/jar-attach-disabled-0.0.1.BUILD-SNAPSHOT.jar"); + assertThat(main).isFile(); + assertThat(buildLog(project)).contains("Updating main artifact " + main + " to " + original) + .contains("Installing " + original + " to").doesNotContain("Installing " + main + " to"); + }); + } + + @TestTemplate + void whenAClassifierIsConfiguredTheRepackagedJarHasAClassifierAndBothItAndTheOriginalAreInstalled( + MavenBuild mavenBuild) { + mavenBuild.project("jar-classifier-main").goals("install").execute((project) -> { + assertThat(new File(project, "target/jar-classifier-main-0.0.1.BUILD-SNAPSHOT.jar.original")) + .doesNotExist(); + File main = new File(project, "target/jar-classifier-main-0.0.1.BUILD-SNAPSHOT.jar"); + assertThat(main).isFile(); + File repackaged = new File(project, "target/jar-classifier-main-0.0.1.BUILD-SNAPSHOT-test.jar"); + assertThat(jar(repackaged)).hasEntryWithNameStartingWith("BOOT-INF/classes/"); + assertThat(buildLog(project)) + .contains("Attaching repackaged archive " + repackaged + " with classifier test") + .doesNotContain("Creating repackaged archive " + repackaged + " with classifier test") + .contains("Installing " + main + " to").contains("Installing " + repackaged + " to"); + }); + } + + @TestTemplate + void whenBothJarsHaveTheSameClassifierRepackagingIsDoneInPlaceAndOnlyRepackagedJarIsInstalled( + MavenBuild mavenBuild) { + mavenBuild.project("jar-classifier-source").goals("install").execute((project) -> { + File original = new File(project, "target/jar-classifier-source-0.0.1.BUILD-SNAPSHOT-test.jar.original"); + assertThat(original).isFile(); + File repackaged = new File(project, "target/jar-classifier-source-0.0.1.BUILD-SNAPSHOT-test.jar"); + assertThat(jar(repackaged)).hasEntryWithNameStartingWith("BOOT-INF/classes/"); + assertThat(buildLog(project)).contains("Replacing artifact with classifier test with repackaged archive") + .doesNotContain("Installing " + original + " to").contains("Installing " + repackaged + " to"); + }); + } + + @TestTemplate + void whenBothJarsHaveTheSameClassifierAndAttachIsDisabledOnlyTheOriginalJarIsInstalled(MavenBuild mavenBuild) { + mavenBuild.project("jar-classifier-source-attach-disabled").goals("install").execute((project) -> { + File original = new File(project, + "target/jar-classifier-source-attach-disabled-0.0.1.BUILD-SNAPSHOT-test.jar.original"); + assertThat(original).isFile(); + File repackaged = new File(project, + "target/jar-classifier-source-attach-disabled-0.0.1.BUILD-SNAPSHOT-test.jar"); + assertThat(jar(repackaged)).hasEntryWithNameStartingWith("BOOT-INF/classes/"); + assertThat(buildLog(project)) + .doesNotContain("Attaching repackaged archive " + repackaged + " with classifier test") + .contains("Updating artifact with classifier test " + repackaged + " to " + original) + .contains("Installing " + original + " to").doesNotContain("Installing " + repackaged + " to"); + }); + } + + @TestTemplate + void whenAClassifierAndAnOutputDirectoryAreConfiguredTheRepackagedJarHasAClassifierAndIsWrittenToTheOutputDirectory( + MavenBuild mavenBuild) { + mavenBuild.project("jar-create-dir").goals("install").execute((project) -> { + File repackaged = new File(project, "target/foo/jar-create-dir-0.0.1.BUILD-SNAPSHOT-foo.jar"); + assertThat(jar(repackaged)).hasEntryWithNameStartingWith("BOOT-INF/classes/"); + assertThat(buildLog(project)).contains("Installing " + repackaged + " to"); + }); + } + + @TestTemplate + void whenAnOutputDirectoryIsConfiguredTheRepackagedJarIsWrittenToIt(MavenBuild mavenBuild) { + mavenBuild.project("jar-custom-dir").goals("install").execute((project) -> { + File repackaged = new File(project, "target/foo/jar-custom-dir-0.0.1.BUILD-SNAPSHOT.jar"); + assertThat(jar(repackaged)).hasEntryWithNameStartingWith("BOOT-INF/classes/"); + assertThat(buildLog(project)).contains("Installing " + repackaged + " to"); + }); + } + + @TestTemplate + void whenACustomLaunchScriptIsConfiguredItAppearsInTheRepackagedJar(MavenBuild mavenBuild) { + mavenBuild.project("jar-custom-launcher").goals("install").execute((project) -> { + File repackaged = new File(project, "target/jar-0.0.1.BUILD-SNAPSHOT.jar"); + assertThat(jar(repackaged)).hasEntryWithNameStartingWith("BOOT-INF/classes/"); + assertThat(launchScript(repackaged)).contains("Hello world"); + }); + } + + @TestTemplate + void whenAnEntryIsExcludedItDoesNotAppearInTheRepackagedJar(MavenBuild mavenBuild) { + mavenBuild.project("jar-exclude-entry").goals("install").execute((project) -> { + File repackaged = new File(project, "target/jar-exclude-entry-0.0.1.BUILD-SNAPSHOT.jar"); + assertThat(jar(repackaged)).hasEntryWithNameStartingWith("BOOT-INF/classes/") + .hasEntryWithNameStartingWith("BOOT-INF/lib/spring-context") + .hasEntryWithNameStartingWith("BOOT-INF/lib/spring-core") + .hasEntryWithNameStartingWith("BOOT-INF/lib/spring-jcl") + .doesNotHaveEntryWithName("BOOT-INF/lib/servlet-api-2.5.jar"); + }); + } + + @TestTemplate + void whenAGroupIsExcludedNoEntriesInThatGroupAppearInTheRepackagedJar(MavenBuild mavenBuild) { + mavenBuild.project("jar-exclude-group").goals("install").execute((project) -> { + File repackaged = new File(project, "target/jar-exclude-group-0.0.1.BUILD-SNAPSHOT.jar"); + assertThat(jar(repackaged)).hasEntryWithNameStartingWith("BOOT-INF/classes/") + .hasEntryWithNameStartingWith("BOOT-INF/lib/spring-context") + .hasEntryWithNameStartingWith("BOOT-INF/lib/spring-core") + .hasEntryWithNameStartingWith("BOOT-INF/lib/spring-jcl") + .doesNotHaveEntryWithName("BOOT-INF/lib/log4j-api-2.4.1.jar"); + }); + } + + @TestTemplate + void whenAJarIsExecutableItBeginsWithTheDefaultLaunchScript(MavenBuild mavenBuild) { + mavenBuild.project("jar-executable").execute((project) -> { + File repackaged = new File(project, "target/jar-executable-0.0.1.BUILD-SNAPSHOT.jar"); + assertThat(jar(repackaged)).hasEntryWithNameStartingWith("BOOT-INF/classes/"); + assertThat(launchScript(repackaged)).contains("Spring Boot Startup Script") + .contains("MyFullyExecutableJarName").contains("MyFullyExecutableJarDesc"); + }); + } + + @TestTemplate + void whenAJarIsBuiltWithLibrariesWithConflictingNamesTheyAreMadeUniqueUsingTheirGroupIds(MavenBuild mavenBuild) { + mavenBuild.project("jar-lib-name-conflict").execute((project) -> { + File repackaged = new File(project, "test-project/target/test-project-0.0.1.BUILD-SNAPSHOT.jar"); + assertThat(jar(repackaged)).hasEntryWithNameStartingWith("BOOT-INF/classes/") + .hasEntryWithName( + "BOOT-INF/lib/org.springframework.boot.maven.it-acme-lib-0.0.1.BUILD-SNAPSHOT.jar") + .hasEntryWithName( + "BOOT-INF/lib/org.springframework.boot.maven.it.another-acme-lib-0.0.1.BUILD-SNAPSHOT.jar"); + }); + } + + @TestTemplate + void whenAProjectUsesPomPackagingRepackagingIsSkipped(MavenBuild mavenBuild) { + mavenBuild.project("jar-pom").execute((project) -> { + File target = new File(project, "target"); + assertThat(target.listFiles()).containsExactly(new File(target, "build.log")); + }); + } + + @TestTemplate + void whenRepackagingIsSkippedTheJarIsNotRepackaged(MavenBuild mavenBuild) { + mavenBuild.project("jar-skip").execute((project) -> { + File main = new File(project, "target/jar-skip-0.0.1.BUILD-SNAPSHOT.jar"); + assertThat(jar(main)).doesNotHaveEntryWithNameStartingWith("org/springframework/boot"); + assertThat(new File(project, "target/jar-skip-0.0.1.BUILD-SNAPSHOT.jar.original")).doesNotExist(); + + }); + } + + @TestTemplate + void whenADependencyHasSystemScopeAndInclusionOfSystemScopeDependenciesIsEnabledItIsIncludedInTheRepackagedJar( + MavenBuild mavenBuild) { + mavenBuild.project("jar-system-scope").execute((project) -> { + File main = new File(project, "target/jar-system-scope-0.0.1.BUILD-SNAPSHOT.jar"); + assertThat(jar(main)).hasEntryWithName("BOOT-INF/lib/sample-1.0.0.jar"); + + }); + } + + @TestTemplate + void whenADependencyHasSystemScopeItIsNotIncludedInTheRepackagedJar(MavenBuild mavenBuild) { + mavenBuild.project("jar-system-scope-default").execute((project) -> { + File main = new File(project, "target/jar-system-scope-default-0.0.1.BUILD-SNAPSHOT.jar"); + assertThat(jar(main)).doesNotHaveEntryWithName("BOOT-INF/lib/sample-1.0.0.jar"); + + }); + } + + @TestTemplate + void whenADependendencyHasTestScopeItIsNotIncludedInTheRepackagedJar(MavenBuild mavenBuild) { + mavenBuild.project("jar-test-scope").execute((project) -> { + File main = new File(project, "target/jar-test-scope-0.0.1.BUILD-SNAPSHOT.jar"); + assertThat(jar(main)).doesNotHaveEntryWithNameStartingWith("BOOT-INF/lib/log4j") + .hasEntryWithNameStartingWith("BOOT-INF/lib/spring-"); + }); + } + + @TestTemplate + void whenAProjectUsesKotlinItsModuleMetadataIsRepackagedIntoBootInfClasses(MavenBuild mavenBuild) { + mavenBuild.project("jar-with-kotlin-module").execute((project) -> { + File main = new File(project, "target/jar-with-kotlin-module-0.0.1.BUILD-SNAPSHOT.jar"); + assertThat(jar(main)).hasEntryWithName("BOOT-INF/classes/META-INF/jar-with-kotlin-module.kotlin_module"); + }); + } + + @TestTemplate + void whenAProjectIsBuiltWithALayoutPropertyTheSpecifiedLayoutIsUsed(MavenBuild mavenBuild) { + mavenBuild.project("jar-with-layout-property").goals("package", "-Dspring-boot.repackage.layout=ZIP") + .execute((project) -> { + File main = new File(project, "target/jar-with-layout-property-0.0.1.BUILD-SNAPSHOT.jar"); + assertThat(jar(main)).manifest( + (manifest) -> manifest.hasMainClass("org.springframework.boot.loader.PropertiesLauncher") + .hasStartClass("org.test.SampleApplication")); + assertThat(buildLog(project)).contains("Layout: ZIP"); + }); + } + + @TestTemplate + void whenALayoutIsConfiguredTheSpecifiedLayoutIsUsed(MavenBuild mavenBuild) { + mavenBuild.project("jar-with-zip-layout").execute((project) -> { + File main = new File(project, "target/jar-with-zip-layout-0.0.1.BUILD-SNAPSHOT.jar"); + assertThat(jar(main)) + .manifest((manifest) -> manifest.hasMainClass("org.springframework.boot.loader.PropertiesLauncher") + .hasStartClass("org.test.SampleApplication")); + assertThat(buildLog(project)).contains("Layout: ZIP"); + }); + } + + @TestTemplate + void whenRequiresUnpackConfigurationIsProvidedItIsReflectedInTheRepackagedJar(MavenBuild mavenBuild) { + mavenBuild.project("jar-with-unpack").execute((project) -> { + File main = new File(project, "target/jar-with-unpack-0.0.1.BUILD-SNAPSHOT.jar"); + assertThat(jar(main)).hasUnpackEntryWithNameStartingWith("BOOT-INF/lib/spring-core-") + .hasEntryWithNameStartingWith("BOOT-INF/lib/spring-context-"); + }); + } + + @TestTemplate + void whenJarIsRepackagedWithACustomLayoutTheJarUsesTheLayout(MavenBuild mavenBuild) { + mavenBuild.project("jar-custom-layout").execute((project) -> { + assertThat(jar(new File(project, "custom/target/custom-0.0.1.BUILD-SNAPSHOT.jar"))) + .hasEntryWithName("custom"); + assertThat(jar(new File(project, "default/target/default-0.0.1.BUILD-SNAPSHOT.jar"))) + .hasEntryWithName("sample"); + }); + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/MavenBuild.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/MavenBuild.java new file mode 100644 index 0000000000..7c1609b34e --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/MavenBuild.java @@ -0,0 +1,202 @@ +/* + * Copyright 2012-2020 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.boot.maven; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.Reader; +import java.nio.charset.StandardCharsets; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.StandardCopyOption; +import java.nio.file.StandardOpenOption; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Properties; +import java.util.function.Consumer; + +import org.apache.maven.shared.invoker.DefaultInvocationRequest; +import org.apache.maven.shared.invoker.DefaultInvoker; +import org.apache.maven.shared.invoker.InvocationOutputHandler; +import org.apache.maven.shared.invoker.InvocationRequest; +import org.apache.maven.shared.invoker.InvocationResult; +import org.apache.maven.shared.invoker.Invoker; +import org.apache.maven.shared.invoker.MavenInvocationException; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.contentOf; + +/** + * Helper class for executing a Maven build. + * + * @author Andy Wilkinson + * + */ +class MavenBuild { + + private final File home; + + private final File temp; + + private final Map pomReplacements = new HashMap<>(); + + private final List goals = new ArrayList<>(); + + private final Properties properties = new Properties(); + + private File projectDir; + + MavenBuild(File home) { + this.home = home; + try { + this.temp = Files.createTempDirectory("maven-build").toFile().getCanonicalFile(); + } + catch (IOException ex) { + throw new RuntimeException(ex); + } + this.pomReplacements.put("java.version", "1.8"); + this.pomReplacements.put("project.groupId", "org.springframework.boot"); + this.pomReplacements.put("project.artifactId", "spring-boot-maven-plugin"); + this.pomReplacements.put("project.version", determineVersion()); + this.pomReplacements.put("log4j2.version", "2.12.1"); + this.pomReplacements.put("maven-jar-plugin.version", "3.2.0"); + this.pomReplacements.put("maven-toolchains-plugin.version", "3.0.0"); + this.pomReplacements.put("maven-war-plugin.version", "3.2.3"); + this.pomReplacements.put("build-helper-maven-plugin.version", "3.0.0"); + this.pomReplacements.put("spring-framework.version", "5.2.1.RELEASE"); + this.pomReplacements.put("jakarta-servlet.version", "4.0.2"); + this.pomReplacements.put("kotlin.version", "1.3.60"); + } + + MavenBuild project(String project) { + this.projectDir = new File("src/intTest/projects/" + project); + return this; + } + + MavenBuild goals(String... goals) { + this.goals.addAll(Arrays.asList(goals)); + return this; + } + + MavenBuild systemProperty(String name, String value) { + this.properties.setProperty(name, value); + return this; + } + + void execute(Consumer callback) { + Invoker invoker = new DefaultInvoker(); + invoker.setMavenHome(this.home); + InvocationRequest request = new DefaultInvocationRequest(); + try { + Path destination = this.temp.toPath(); + Path source = this.projectDir.toPath(); + Files.walkFileTree(source, new SimpleFileVisitor() { + + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + Files.createDirectories(destination.resolve(source.relativize(dir))); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + if (file.toFile().getName().equals("pom.xml")) { + String pomXml = new String(Files.readAllBytes(file), StandardCharsets.UTF_8); + for (Entry replacement : MavenBuild.this.pomReplacements.entrySet()) { + pomXml = pomXml.replace("@" + replacement.getKey() + "@", replacement.getValue()); + } + Files.write(destination.resolve(source.relativize(file)), + pomXml.getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE_NEW); + } + else { + Files.copy(file, destination.resolve(source.relativize(file)), + StandardCopyOption.REPLACE_EXISTING); + } + return FileVisitResult.CONTINUE; + } + + }); + String settingsXml = new String(Files.readAllBytes(Paths.get("src", "intTest", "projects", "settings.xml")), + StandardCharsets.UTF_8) + .replace("@localCentralUrl@", + new File("build/int-test-maven-repository").toURI().toURL().toString()) + .replace("@localRepositoryPath@", + new File("build/local-maven-repository").getAbsolutePath()); + Files.write(destination.resolve("settings.xml"), settingsXml.getBytes(StandardCharsets.UTF_8), + StandardOpenOption.CREATE_NEW); + request.setBaseDirectory(this.temp); + request.setProperties(this.properties); + request.setGoals(this.goals.isEmpty() ? Collections.singletonList("package") : this.goals); + request.setUserSettingsFile(new File(this.temp, "settings.xml")); + request.setUpdateSnapshots(true); + request.setBatchMode(true); + File target = new File(this.temp, "target"); + target.mkdirs(); + File buildLogFile = new File(target, "build.log"); + try (PrintWriter buildLog = new PrintWriter(new FileWriter(buildLogFile))) { + request.setOutputHandler(new InvocationOutputHandler() { + + @Override + public void consumeLine(String line) { + buildLog.println(line); + buildLog.flush(); + } + + }); + try { + InvocationResult result = invoker.execute(request); + assertThat(result.getExitCode()).as(contentOf(buildLogFile)).isEqualTo(0); + } + catch (MavenInvocationException ex) { + throw new RuntimeException(ex); + } + } + callback.accept(this.temp); + } + catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + private String determineVersion() { + File gradleProperties = new File("gradle.properties").getAbsoluteFile(); + while (!gradleProperties.isFile()) { + gradleProperties = new File(gradleProperties.getParentFile().getParentFile(), "gradle.properties"); + } + Properties properties = new Properties(); + try (Reader reader = new FileReader(gradleProperties)) { + properties.load(reader); + return properties.getProperty("version"); + } + catch (IOException ex) { + throw new RuntimeException(ex); + } + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/MavenBuildExtension.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/MavenBuildExtension.java new file mode 100644 index 0000000000..a9e0f668c5 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/MavenBuildExtension.java @@ -0,0 +1,100 @@ +/* + * Copyright 2012-2020 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.boot.maven; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; + +import org.junit.jupiter.api.extension.Extension; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.ParameterContext; +import org.junit.jupiter.api.extension.ParameterResolutionException; +import org.junit.jupiter.api.extension.ParameterResolver; +import org.junit.jupiter.api.extension.TestTemplateInvocationContext; +import org.junit.jupiter.api.extension.TestTemplateInvocationContextProvider; + +/** + * An {@link Extension} for templated tests that use {@link MavenBuild}. Each templated + * test is run against multiple versions of Maven. + * + * @author Andy Wilkinson + */ +class MavenBuildExtension implements TestTemplateInvocationContextProvider { + + @Override + public boolean supportsTestTemplate(ExtensionContext context) { + return true; + } + + @Override + public Stream provideTestTemplateInvocationContexts(ExtensionContext context) { + try { + return Files.list(Paths.get("build/maven-binaries")).map(MavenVersionTestTemplateInvocationContext::new); + } + catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + private static final class MavenVersionTestTemplateInvocationContext implements TestTemplateInvocationContext { + + private final Path mavenHome; + + private MavenVersionTestTemplateInvocationContext(Path mavenHome) { + this.mavenHome = mavenHome; + } + + @Override + public String getDisplayName(int invocationIndex) { + return this.mavenHome.getFileName().toString(); + } + + @Override + public List getAdditionalExtensions() { + return Arrays.asList(new MavenBuildParameterResolver(this.mavenHome)); + } + + } + + private static final class MavenBuildParameterResolver implements ParameterResolver { + + private final Path mavenHome; + + private MavenBuildParameterResolver(Path mavenHome) { + this.mavenHome = mavenHome; + } + + @Override + public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) + throws ParameterResolutionException { + return parameterContext.getParameter().getType().equals(MavenBuild.class); + } + + @Override + public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) + throws ParameterResolutionException { + return new MavenBuild(this.mavenHome.toFile()); + } + + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/RunIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/RunIntegrationTests.java new file mode 100644 index 0000000000..9c20e96fa6 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/RunIntegrationTests.java @@ -0,0 +1,145 @@ +/* + * Copyright 2012-2020 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.boot.maven; + +import java.io.File; +import java.lang.reflect.Method; + +import org.junit.jupiter.api.TestTemplate; +import org.junit.jupiter.api.condition.DisabledOnOs; +import org.junit.jupiter.api.condition.OS; +import org.junit.jupiter.api.extension.ExtendWith; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.contentOf; + +/** + * Integration tests for the Maven plugin's run goal. + * + * @author Andy Wilkinson + */ +@ExtendWith(MavenBuildExtension.class) +class RunIntegrationTests { + + @TestTemplate + void whenTheRunGoalIsExecutedTheApplicationIsForkedWithOptimizedJvmArguments(MavenBuild mavenBuild) { + mavenBuild.project("run").goals("spring-boot:run", "-X").execute((project) -> { + String jvmArguments = isJava13OrLater() ? "JVM argument(s): -XX:TieredStopAtLevel=1" + : "JVM argument(s): -Xverify:none -XX:TieredStopAtLevel=1"; + assertThat(buildLog(project)).contains("I haz been run").contains(jvmArguments); + }); + } + + @TestTemplate + void whenForkingIsDisabledAndDevToolsIsPresentDevToolsIsDisabled(MavenBuild mavenBuild) { + mavenBuild.project("run-devtools").goals("spring-boot:run").execute((project) -> assertThat(buildLog(project)) + .contains("I haz been run").contains("Fork mode disabled, devtools will be disabled")); + } + + @TestTemplate + void whenForkingIsDisabledJvmArgumentsAndWorkingDirectoryAreIgnored(MavenBuild mavenBuild) { + mavenBuild.project("run-disable-fork").goals("spring-boot:run") + .execute((project) -> assertThat(buildLog(project)).contains("I haz been run").contains( + "Fork mode disabled, ignoring JVM argument(s) [-Dproperty1=value1 -Dproperty2 -Dfoo=bar]") + .contains("Fork mode disabled, ignoring working directory configuration")); + } + + @TestTemplate + void whenEnvironmentVariablesAreConfiguredTheyAreAvailableToTheApplication(MavenBuild mavenBuild) { + mavenBuild.project("run-envargs").goals("spring-boot:run") + .execute((project) -> assertThat(buildLog(project)).contains("I haz been run")); + } + + @TestTemplate + void whenExclusionsAreConfiguredExcludedDependenciesDoNotAppearOnTheClasspath(MavenBuild mavenBuild) { + mavenBuild.project("run-exclude").goals("spring-boot:run") + .execute((project) -> assertThat(buildLog(project)).contains("I haz been run")); + } + + @TestTemplate + void whenSystemPropertiesAreConfiguredTheyAreAvailableToTheApplication(MavenBuild mavenBuild) { + mavenBuild.project("run-jvm-system-props").goals("spring-boot:run") + .execute((project) -> assertThat(buildLog(project)).contains("I haz been run")); + } + + @TestTemplate + void whenJvmArgumentsAreConfiguredTheyAreAvailableToTheApplication(MavenBuild mavenBuild) { + mavenBuild.project("run-jvmargs").goals("spring-boot:run") + .execute((project) -> assertThat(buildLog(project)).contains("I haz been run")); + } + + @TestTemplate + void whenProfilesAreConfiguredTheyArePassedToTheApplication(MavenBuild mavenBuild) { + mavenBuild.project("run-profiles").goals("spring-boot:run", "-X").execute( + (project) -> assertThat(buildLog(project)).contains("I haz been run with profile(s) 'foo,bar'")); + } + + @TestTemplate + void whenProfilesAreConfiguredAndForkingIsDisabledTheyArePassedToTheApplication(MavenBuild mavenBuild) { + mavenBuild.project("run-profiles-fork-disabled").goals("spring-boot:run").execute( + (project) -> assertThat(buildLog(project)).contains("I haz been run with profile(s) 'foo,bar'")); + } + + @TestTemplate + void whenUseTestClasspathIsEnabledTheApplicationHasTestDependenciesOnItsClasspath(MavenBuild mavenBuild) { + mavenBuild.project("run-use-test-classpath").goals("spring-boot:run") + .execute((project) -> assertThat(buildLog(project)).contains("I haz been run")); + } + + @TestTemplate + void whenAWorkingDirectoryIsConfiguredTheApplicationIsRunFromThatDirectory(MavenBuild mavenBuild) { + mavenBuild.project("run-working-directory").goals("spring-boot:run") + .execute((project) -> assertThat(buildLog(project)).contains("I haz been run")); + } + + @TestTemplate + @DisabledOnOs(OS.WINDOWS) + void whenAToolchainIsConfiguredItIsUsedToRunTheApplication(MavenBuild mavenBuild) { + mavenBuild.project("run-toolchains").goals("verify", "-t", "toolchains.xml") + .execute((project) -> assertThat(buildLog(project)).contains("The Maven Toolchains is awesome!")); + } + + @TestTemplate + void whenPomSpecifiesRunArgumentsContainingCommasTheyArePassedToTheApplicationCorrectly(MavenBuild mavenBuild) { + mavenBuild.project("run-arguments").goals("spring-boot:run").execute((project) -> assertThat(buildLog(project)) + .contains("I haz been run with profile(s) 'foo,bar' and endpoint(s) 'prometheus,info'")); + } + + @TestTemplate + void whenCommandLineSpecifiesRunArgumentsContainingCommasTheyArePassedToTheApplicationCorrectly( + MavenBuild mavenBuild) { + mavenBuild.project("run-arguments-commandline").goals("spring-boot:run").systemProperty( + "spring-boot.run.arguments", + "--management.endpoints.web.exposure.include=prometheus,info,health,metrics --spring.profiles.active=foo,bar") + .execute((project) -> assertThat(buildLog(project)).contains( + "I haz been run with profile(s) 'foo,bar' and endpoint(s) 'prometheus,info,health,metrics'")); + } + + private String buildLog(File project) { + return contentOf(new File(project, "target/build.log")); + } + + private boolean isJava13OrLater() { + for (Method method : String.class.getMethods()) { + if (method.getName().equals("stripIndent")) { + return true; + } + } + return false; + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/StartStopIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/StartStopIntegrationTests.java new file mode 100644 index 0000000000..34736018c3 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/StartStopIntegrationTests.java @@ -0,0 +1,57 @@ +/* + * Copyright 2012-2020 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.boot.maven; + +import java.io.File; + +import org.junit.jupiter.api.TestTemplate; +import org.junit.jupiter.api.extension.ExtendWith; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.contentOf; + +/** + * Integration tests for the Maven plugin's war support. + * + * @author Andy Wilkinson + */ +@ExtendWith(MavenBuildExtension.class) +class StartStopIntegrationTests { + + @TestTemplate + void startStopWithForkDisabledWaitsForApplicationToBeReadyAndThenRequestsShutdown(MavenBuild mavenBuild) { + mavenBuild.project("start-stop-fork-disabled").goals("verify").execute( + (project) -> assertThat(buildLog(project)).contains("isReady: true").contains("Shutdown requested")); + } + + @TestTemplate + void startStopWaitsForApplicationToBeReadyAndThenRequestsShutdown(MavenBuild mavenBuild) { + mavenBuild.project("start-stop").goals("verify").execute( + (project) -> assertThat(buildLog(project)).contains("isReady: true").contains("Shutdown requested")); + } + + @TestTemplate + void whenSkipIsTrueStartAndStopAreSkipped(MavenBuild mavenBuild) { + mavenBuild.project("start-stop-skip").goals("verify").execute((project) -> assertThat(buildLog(project)) + .doesNotContain("Ooops, I haz been run").doesNotContain("Stopping application")); + } + + private String buildLog(File project) { + return contentOf(new File(project, "target/build.log")); + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/WarIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/WarIntegrationTests.java new file mode 100644 index 0000000000..63c89ac538 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/WarIntegrationTests.java @@ -0,0 +1,66 @@ +/* + * Copyright 2012-2020 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.boot.maven; + +import java.io.File; + +import org.junit.jupiter.api.TestTemplate; +import org.junit.jupiter.api.extension.ExtendWith; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Integration tests for the Maven plugin's war support. + * + * @author Andy Wilkinson + */ +@ExtendWith(MavenBuildExtension.class) +class WarIntegrationTests extends AbstractArchiveIntegrationTests { + + @TestTemplate + void warRepackaging(MavenBuild mavenBuild) { + mavenBuild.project("war") + .execute((project) -> assertThat(jar(new File(project, "target/war-0.0.1.BUILD-SNAPSHOT.war"))) + .hasEntryWithNameStartingWith("WEB-INF/lib/spring-context") + .hasEntryWithNameStartingWith("WEB-INF/lib/spring-core") + .hasEntryWithNameStartingWith("WEB-INF/lib/spring-jcl") + .hasEntryWithNameStartingWith("WEB-INF/lib-provided/jakarta.servlet-api-4") + .hasEntryWithName("org/springframework/boot/loader/WarLauncher.class") + .hasEntryWithName("WEB-INF/classes/org/test/SampleApplication.class") + .hasEntryWithName("index.html") + .manifest((manifest) -> manifest.hasMainClass("org.springframework.boot.loader.WarLauncher") + .hasStartClass("org.test.SampleApplication").hasAttribute("Not-Used", "Foo"))); + } + + @TestTemplate + void jarDependencyWithCustomFinalNameBuiltInSameReactorIsPackagedUsingArtifactIdAndVersion(MavenBuild mavenBuild) { + mavenBuild.project("war-reactor") + .execute(((project) -> assertThat(jar(new File(project, "war/target/war-0.0.1.BUILD-SNAPSHOT.war"))) + .hasEntryWithName("WEB-INF/lib/jar-0.0.1.BUILD-SNAPSHOT.jar") + .doesNotHaveEntryWithName("WEB-INF/lib/jar.jar"))); + } + + @TestTemplate + void whenRequiresUnpackConfigurationIsProvidedItIsReflectedInTheRepackagedWar(MavenBuild mavenBuild) { + mavenBuild.project("war-with-unpack").execute( + (project) -> assertThat(jar(new File(project, "target/war-with-unpack-0.0.1.BUILD-SNAPSHOT.war"))) + .hasUnpackEntryWithNameStartingWith("WEB-INF/lib/spring-core-") + .hasEntryWithNameStartingWith("WEB-INF/lib/spring-context-") + .hasEntryWithNameStartingWith("WEB-INF/lib/spring-jcl-")); + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-additional-properties/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-additional-properties/pom.xml new file mode 100644 index 0000000000..e6ba60b03a --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-additional-properties/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + org.springframework.boot.maven.it + build-info-additional-properties + 0.0.1.BUILD-SNAPSHOT + Generate build info with additional properties + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + build-info + + + + bar + ${project.build.sourceEncoding} + 1.8 + + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-additional-properties/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-additional-properties/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-additional-properties/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-additional-properties/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-custom-build-time/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-custom-build-time/pom.xml new file mode 100644 index 0000000000..c5668a93c9 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-custom-build-time/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + org.springframework.boot.maven.it + build-info-custom-build-time + 0.0.1.BUILD-SNAPSHOT + Generate build info with custom build time + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + + + + build-info + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-custom-build-time/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-custom-build-time/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-custom-build-time/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-custom-build-time/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-custom-file/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-custom-file/pom.xml new file mode 100644 index 0000000000..3e20c5c9c1 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-custom-file/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + org.springframework.boot.maven.it + build-info-custom-file + 0.0.1.BUILD-SNAPSHOT + Generate custom build info + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + build-info + + + ${project.build.directory}/build.info + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-custom-file/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-custom-file/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-custom-file/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-custom-file/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-disable-build-time/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-disable-build-time/pom.xml similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-disable-build-time/pom.xml rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-disable-build-time/pom.xml diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-disable-build-time/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-disable-build-time/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-disable-build-time/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info-disable-build-time/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info/pom.xml new file mode 100644 index 0000000000..9f0e5a1503 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + org.springframework.boot.maven.it + build-info + 0.0.1.BUILD-SNAPSHOT + Generate build info + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + build-info + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-info/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-attach-disabled/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-attach-disabled/pom.xml new file mode 100644 index 0000000000..d6fa5cf6af --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-attach-disabled/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + org.springframework.boot.maven.it + jar-attach-disabled + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + repackage + + + false + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-attach-disabled/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-attach-disabled/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-attach-disabled/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-attach-disabled/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-main-attach-disabled/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-main-attach-disabled/pom.xml new file mode 100644 index 0000000000..3fd4d7b8df --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-main-attach-disabled/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + org.springframework.boot.maven.it + jar-classifier-main-attach-disabled + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + repackage + + + test + false + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main-attach-disabled/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-main-attach-disabled/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main-attach-disabled/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-main-attach-disabled/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-main/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-main/pom.xml new file mode 100644 index 0000000000..d05d5c4488 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-main/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + org.springframework.boot.maven.it + jar-classifier-main + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + repackage + + + test + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-main/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-main/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-source-attach-disabled/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-source-attach-disabled/pom.xml new file mode 100644 index 0000000000..357399d589 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-source-attach-disabled/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + org.springframework.boot.maven.it + jar-classifier-source-attach-disabled + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + org.apache.maven.plugins + maven-jar-plugin + @maven-jar-plugin.version@ + + + + jar + + package + + test + + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + repackage + + + test + false + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source-attach-disabled/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-source-attach-disabled/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source-attach-disabled/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-source-attach-disabled/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-source/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-source/pom.xml new file mode 100644 index 0000000000..98d744d151 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-source/pom.xml @@ -0,0 +1,48 @@ + + + 4.0.0 + org.springframework.boot.maven.it + jar-classifier-source + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + org.apache.maven.plugins + maven-jar-plugin + @maven-jar-plugin.version@ + + + + jar + + package + + test + + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + repackage + + + test + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-source/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-classifier-source/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-create-dir/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-create-dir/pom.xml new file mode 100644 index 0000000000..0920206fd4 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-create-dir/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + org.springframework.boot.maven.it + jar-create-dir + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + repackage + + + ${project.build.directory}/foo + foo + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-create-dir/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-create-dir/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-create-dir/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-create-dir/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-dir/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-dir/pom.xml new file mode 100644 index 0000000000..f6a0ab30db --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-dir/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + org.springframework.boot.maven.it + jar-custom-dir + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + repackage + + + ${project.build.directory}/foo + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-dir/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-dir/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-dir/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-dir/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-launcher/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-launcher/pom.xml new file mode 100644 index 0000000000..6e78c3ea63 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-launcher/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + org.springframework.boot.maven.it + jar + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + repackage + + + ${basedir}/src/launcher/custom.script + + world + + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-launcher/src/launcher/custom.script b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-launcher/src/launcher/custom.script similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-launcher/src/launcher/custom.script rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-launcher/src/launcher/custom.script diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-launcher/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-launcher/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-launcher/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-launcher/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/custom/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/custom/pom.xml new file mode 100644 index 0000000000..e64b294529 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/custom/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + org.springframework.boot.maven.it + custom + 0.0.1.BUILD-SNAPSHOT + + 1.8 + 1.8 + UTF-8 + + + + + org.springframework.boot + spring-boot-maven-plugin + @project.version@ + + + + repackage + + + + custom + + + + + + + org.springframework.boot.maven.it + layout + 0.0.1.BUILD-SNAPSHOT + + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-exclude-entry/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/custom/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-exclude-entry/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/custom/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/default/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/default/pom.xml new file mode 100644 index 0000000000..f568c759e3 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/default/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + org.springframework.boot.maven.it + default + 0.0.1.BUILD-SNAPSHOT + + 1.8 + 1.8 + UTF-8 + + + + + org.springframework.boot + spring-boot-maven-plugin + @project.version@ + + + + repackage + + + + + + org.springframework.boot.maven.it + layout + 0.0.1.BUILD-SNAPSHOT + + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-exclude-group/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/default/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-exclude-group/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/default/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/layout/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/layout/pom.xml new file mode 100644 index 0000000000..965a8b8d9d --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/layout/pom.xml @@ -0,0 +1,19 @@ + + + 4.0.0 + + org.springframework.boot.maven.it + jar-custom-layout + 0.0.1.BUILD-SNAPSHOT + + jar + layout + + + org.springframework.boot + spring-boot-loader-tools + @project.version@ + + + diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/main/java/smoketest/layout/SampleLayout.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/layout/src/main/java/smoketest/layout/SampleLayout.java similarity index 100% rename from spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/main/java/smoketest/layout/SampleLayout.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/layout/src/main/java/smoketest/layout/SampleLayout.java diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/main/java/smoketest/layout/SampleLayoutFactory.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/layout/src/main/java/smoketest/layout/SampleLayoutFactory.java similarity index 100% rename from spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/main/java/smoketest/layout/SampleLayoutFactory.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/layout/src/main/java/smoketest/layout/SampleLayoutFactory.java diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/main/resources/META-INF/spring.factories b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/layout/src/main/resources/META-INF/spring.factories similarity index 100% rename from spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/main/resources/META-INF/spring.factories rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/layout/src/main/resources/META-INF/spring.factories diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/pom.xml new file mode 100644 index 0000000000..7022544d57 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-custom-layout/pom.xml @@ -0,0 +1,19 @@ + + + 4.0.0 + org.springframework.boot.maven.it + jar-custom-layout + 0.0.1.BUILD-SNAPSHOT + pom + + UTF-8 + @java.version@ + @java.version@ + + + layout + custom + default + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-exclude-entry/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-exclude-entry/pom.xml new file mode 100644 index 0000000000..d37e11e152 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-exclude-entry/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + org.springframework.boot.maven.it + jar-exclude-entry + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + repackage + + + + + javax.servlet + servlet-api + + + + + + + + + + + org.springframework + spring-context + @spring-framework.version@ + + + javax.servlet + servlet-api + 2.5 + provided + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-executable/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-exclude-entry/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-executable/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-exclude-entry/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-exclude-group/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-exclude-group/pom.xml new file mode 100644 index 0000000000..4da81b2f08 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-exclude-group/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + org.springframework.boot.maven.it + jar-exclude-group + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + repackage + + + org.apache.logging.log4j + + + + + + org.apache.maven.plugins + maven-jar-plugin + @maven-jar-plugin.version@ + + + + Foo + + + + + + + + + org.springframework + spring-context + @spring-framework.version@ + + + org.apache.logging.log4j + log4j-api + @log4j2.version@ + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-lib-name-conflict/test-project/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-exclude-group/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-lib-name-conflict/test-project/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-exclude-group/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-executable/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-executable/pom.xml new file mode 100644 index 0000000000..802d166a27 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-executable/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + org.springframework.boot.maven.it + jar-executable + MyFullyExecutableJarName + MyFullyExecutableJarDesc + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + repackage + + + true + + + + + + org.apache.maven.plugins + maven-jar-plugin + @maven-jar-plugin.version@ + + + + some.random.Main + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-non-executable/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-executable/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-non-executable/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-executable/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-lib-name-conflict/acme-lib/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-lib-name-conflict/acme-lib/pom.xml new file mode 100644 index 0000000000..f0c7626623 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-lib-name-conflict/acme-lib/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + acme-lib + + + org.springframework.boot.maven.it + jar-lib-name-conflict + 0.0.1.BUILD-SNAPSHOT + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-lib-name-conflict/another-acme-lib/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-lib-name-conflict/another-acme-lib/pom.xml similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-lib-name-conflict/another-acme-lib/pom.xml rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-lib-name-conflict/another-acme-lib/pom.xml diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-lib-name-conflict/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-lib-name-conflict/pom.xml similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-lib-name-conflict/pom.xml rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-lib-name-conflict/pom.xml diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-lib-name-conflict/test-project/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-lib-name-conflict/test-project/pom.xml new file mode 100644 index 0000000000..535fedc387 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-lib-name-conflict/test-project/pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + org.springframework.boot.maven.it + test-project + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + repackage + + + + + + + + + + org.springframework.boot.maven.it + acme-lib + 0.0.1.BUILD-SNAPSHOT + + + org.springframework.boot.maven.it.another + acme-lib + 0.0.1.BUILD-SNAPSHOT + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope-default/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-lib-name-conflict/test-project/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope-default/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-lib-name-conflict/test-project/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-pom/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-pom/pom.xml new file mode 100644 index 0000000000..f8eb3dae58 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-pom/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + org.springframework.boot.maven.it + jar-pom + pom + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + repackage + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-skip/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-skip/pom.xml new file mode 100644 index 0000000000..15eea089cb --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-skip/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + org.springframework.boot.maven.it + jar-skip + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + repackage + + + true + + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-system-scope-default/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-system-scope-default/pom.xml new file mode 100644 index 0000000000..f455d43879 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-system-scope-default/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + org.springframework.boot.maven.it + jar-system-scope-default + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + repackage + + + + + + + + + com.example + sample + 1.0.0 + system + ${project.basedir}/sample-1.0.0.jar + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope-default/sample-1.0.0.jar b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-system-scope-default/sample-1.0.0.jar similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope-default/sample-1.0.0.jar rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-system-scope-default/sample-1.0.0.jar diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-system-scope-default/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-system-scope-default/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-system-scope/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-system-scope/pom.xml new file mode 100644 index 0000000000..2a5de56091 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-system-scope/pom.xml @@ -0,0 +1,41 @@ + + + 4.0.0 + org.springframework.boot.maven.it + jar-system-scope + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + repackage + + + true + + + + + + + + + com.example + sample + 1.0.0 + system + ${project.basedir}/sample-1.0.0.jar + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope/sample-1.0.0.jar b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-system-scope/sample-1.0.0.jar similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope/sample-1.0.0.jar rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-system-scope/sample-1.0.0.jar diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-test-scope/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-system-scope/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-test-scope/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-system-scope/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-test-scope/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-test-scope/pom.xml new file mode 100644 index 0000000000..5ea032cdd7 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-test-scope/pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + org.springframework.boot.maven.it + jar-test-scope + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + repackage + + + + + + + + + org.springframework + spring-context + @spring-framework.version@ + + + org.apache.logging.log4j + log4j-api + @log4j2.version@ + test + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-unpack/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-test-scope/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-unpack/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-test-scope/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-with-kotlin-module/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-with-kotlin-module/pom.xml new file mode 100644 index 0000000000..eea70adbfd --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-with-kotlin-module/pom.xml @@ -0,0 +1,69 @@ + + + 4.0.0 + org.springframework.boot.maven.it + jar-with-kotlin-module + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + repackage + + + + + + org.jetbrains.kotlin + kotlin-maven-plugin + @kotlin.version@ + + + compile + process-resources + + compile + + + + test-compile + process-test-resources + + compile + + + + + + + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + @kotlin.version@ + + + org.jetbrains.kotlin + kotlin-reflect + @kotlin.version@ + + + org.jetbrains.kotlin + kotlin-compiler + @kotlin.version@ + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-kotlin-module/src/main/kotlin/org/test/SampleApplication.kt b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-with-kotlin-module/src/main/kotlin/org/test/SampleApplication.kt similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-kotlin-module/src/main/kotlin/org/test/SampleApplication.kt rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-with-kotlin-module/src/main/kotlin/org/test/SampleApplication.kt diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-layout-property/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-with-layout-property/pom.xml similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-layout-property/pom.xml rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-with-layout-property/pom.xml diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-layout-property/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-with-layout-property/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-layout-property/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-with-layout-property/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-unpack/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-with-unpack/pom.xml similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-unpack/pom.xml rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-with-unpack/pom.xml diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-with-unpack/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-with-unpack/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-with-zip-layout/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-with-zip-layout/pom.xml new file mode 100644 index 0000000000..e4171d27cb --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-with-zip-layout/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + org.springframework.boot.maven.it + jar-with-zip-layout + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + repackage + + + ZIP + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/prop/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-with-zip-layout/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/prop/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar-with-zip-layout/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar/pom.xml similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar/pom.xml rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar/pom.xml diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-reactor/war/src/main/java/com/example/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-reactor/war/src/main/java/com/example/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/jar/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-arguments-commandline/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-arguments-commandline/pom.xml new file mode 100644 index 0000000000..041d9b2ff7 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-arguments-commandline/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + org.springframework.boot.maven.it + run-arguments-commandline + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments-commandline/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-arguments-commandline/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments-commandline/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-arguments-commandline/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-arguments/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-arguments/pom.xml new file mode 100644 index 0000000000..84563c8b97 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-arguments/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + org.springframework.boot.maven.it + run-arguments + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + --management.endpoints.web.exposure.include=prometheus,info + --spring.profiles.active=foo,bar + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-arguments/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-arguments/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-devtools/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-devtools/pom.xml new file mode 100644 index 0000000000..4f6bcd76fa --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-devtools/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + org.springframework.boot.maven.it + run-devtools + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + false + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-devtools/src/main/java/org/springframework/boot/devtools/restart/Restarter.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-devtools/src/main/java/org/springframework/boot/devtools/restart/Restarter.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-devtools/src/main/java/org/springframework/boot/devtools/restart/Restarter.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-devtools/src/main/java/org/springframework/boot/devtools/restart/Restarter.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-devtools/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-devtools/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-devtools/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-devtools/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-disable-fork/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-disable-fork/pom.xml new file mode 100644 index 0000000000..fa5832c24e --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-disable-fork/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + org.springframework.boot.maven.it + run-disable-fork + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + false + -Dfoo=bar + ${project.build.sourceDirectory} + + value1 + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-disable-fork/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-disable-fork/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-disable-fork/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-disable-fork/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-envargs/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-envargs/pom.xml new file mode 100644 index 0000000000..8360378517 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-envargs/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + org.springframework.boot.maven.it + run-envargs + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + 5000 + Some Text + + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-envargs/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-envargs/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-envargs/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-envargs/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-exclude/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-exclude/pom.xml new file mode 100644 index 0000000000..f92c952115 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-exclude/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + org.springframework.boot.maven.it + run-exclude + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + org.apache.logging.log4j + log4j-api + + + jakarta.servlet,javax.servlet + + + + + + + org.apache.logging.log4j + log4j-api + @log4j2.version@ + + + jakarta.servlet + jakarta.servlet-api + @jakarta-servlet.version@ + provided + + + javax.servlet + servlet-api + 2.5 + provided + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-exclude/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-exclude/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-exclude/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-exclude/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-fork/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-fork/pom.xml similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-fork/pom.xml rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-fork/pom.xml diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-fork/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-fork/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-fork/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-fork/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-jvm-system-props/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-jvm-system-props/pom.xml new file mode 100644 index 0000000000..6e76f7526b --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-jvm-system-props/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + org.springframework.boot.maven.it + run-jvmargs + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + -Dfoo="value 1" -Dbar=value2 + + value1 + + ${project.artifactId} + should-be-ignored + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-jvm-system-props/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-jvm-system-props/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-jvm-system-props/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-jvm-system-props/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-jvmargs/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-jvmargs/pom.xml new file mode 100644 index 0000000000..849ed35c67 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-jvmargs/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + org.springframework.boot.maven.it + run-jvmargs + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + -Dfoo="value 1" -Dbar=value2 + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-jvmargs/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-jvmargs/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-jvmargs/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-jvmargs/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-profiles-fork-disabled/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-profiles-fork-disabled/pom.xml new file mode 100644 index 0000000000..1a222c8897 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-profiles-fork-disabled/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + org.springframework.boot.maven.it + run-profiles + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + false + + foo + bar + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-profiles-fork/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-profiles-fork-disabled/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-profiles-fork/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-profiles-fork-disabled/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-profiles/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-profiles/pom.xml new file mode 100644 index 0000000000..b46f899608 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-profiles/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + org.springframework.boot.maven.it + run-profiles + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + foo + bar + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-profiles/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-profiles/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-profiles/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-profiles/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-toolchains/jdkHome/bin/java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-toolchains/jdkHome/bin/java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-toolchains/jdkHome/bin/java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-toolchains/jdkHome/bin/java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-toolchains/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-toolchains/pom.xml similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-toolchains/pom.xml rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-toolchains/pom.xml diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-toolchains/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-toolchains/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-toolchains/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-toolchains/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-toolchains/toolchains.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-toolchains/toolchains.xml similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-toolchains/toolchains.xml rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-toolchains/toolchains.xml diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-use-test-classpath/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-use-test-classpath/pom.xml new file mode 100644 index 0000000000..a652f2ca53 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-use-test-classpath/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + org.springframework.boot.maven.it + run-use-test-classpath + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + true + + + + + + + org.springframework + spring-context + @spring-framework.version@ + test + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-use-test-classpath/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-use-test-classpath/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-use-test-classpath/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-use-test-classpath/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-working-directory/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-working-directory/pom.xml new file mode 100644 index 0000000000..1dd1d52817 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-working-directory/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + org.springframework.boot.maven.it + run-working-directory + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + ${project.build.sourceDirectory} + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-working-directory/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-working-directory/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-working-directory/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run-working-directory/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run/pom.xml new file mode 100644 index 0000000000..5202b61be3 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + org.springframework.boot.maven.it + run + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/run/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/settings.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/settings.xml new file mode 100644 index 0000000000..73ac7d2841 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/settings.xml @@ -0,0 +1,76 @@ + + + @localRepositoryPath@ + + + it-repo + + true + + + + local.central + @localCentralUrl@ + + true + + + true + + + + spring-snapshot + https://repo.spring.io/snapshot + + false + + + true + + + + spring-milestone + https://repo.spring.io/milestone + + true + + + false + + + + + + local.central + @localCentralUrl@ + + true + + + true + + + + spring-snapshot + https://repo.spring.io/snapshot + + false + + + true + + + + spring-milestone + https://repo.spring.io/milestone + + true + + + false + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/start-stop-fork-disabled/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/start-stop-fork-disabled/pom.xml new file mode 100644 index 0000000000..8a1a8ad671 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/start-stop-fork-disabled/pom.xml @@ -0,0 +1,36 @@ + + + 4.0.0 + org.springframework.boot.maven.it + start-stop + 0.0.1.BUILD-SNAPSHOT + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + pre-integration-test + + start + + + + post-integration-test + + stop + + + + + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/start-stop-fork-disabled/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/start-stop-fork-disabled/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-skip/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/start-stop-skip/pom.xml similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-skip/pom.xml rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/start-stop-skip/pom.xml diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-skip/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/start-stop-skip/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-skip/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/start-stop-skip/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-fork/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/start-stop/pom.xml similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-fork/pom.xml rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/start-stop/pom.xml diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-fork/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/start-stop/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-fork/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/start-stop/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-reactor/jar/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war-reactor/jar/pom.xml similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-reactor/jar/pom.xml rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war-reactor/jar/pom.xml diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-reactor/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war-reactor/pom.xml similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-reactor/pom.xml rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war-reactor/pom.xml diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-reactor/war/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war-reactor/war/pom.xml similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-reactor/war/pom.xml rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war-reactor/war/pom.xml diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-with-unpack/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war-reactor/war/src/main/java/com/example/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-with-unpack/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war-reactor/war/src/main/java/com/example/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-reactor/war/src/main/webapp/index.html b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war-reactor/war/src/main/webapp/index.html similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-reactor/war/src/main/webapp/index.html rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war-reactor/war/src/main/webapp/index.html diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war-with-unpack/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war-with-unpack/pom.xml new file mode 100644 index 0000000000..bb13ba1acd --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war-with-unpack/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + org.springframework.boot.maven.it + war-with-unpack + 0.0.1.BUILD-SNAPSHOT + war + + UTF-8 + @java.version@ + @java.version@ + + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + repackage + + + + + org.springframework + spring-core + + + + + + + + org.apache.maven.plugins + maven-war-plugin + @maven-war-plugin.version@ + + + + Foo + + + + + + + + + org.springframework + spring-context + @spring-framework.version@ + + + jakarta.servlet + jakarta.servlet-api + @jakarta-servlet.version@ + provided + + + diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war-with-unpack/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war-with-unpack/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-with-unpack/src/main/webapp/index.html b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war-with-unpack/src/main/webapp/index.html similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-with-unpack/src/main/webapp/index.html rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war-with-unpack/src/main/webapp/index.html diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war/pom.xml similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war/pom.xml rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war/pom.xml diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/custom/src/main/java/org/test/SampleApplication.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war/src/main/java/org/test/SampleApplication.java similarity index 100% rename from spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/custom/src/main/java/org/test/SampleApplication.java rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war/src/main/java/org/test/SampleApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war/src/main/webapp/index.html b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war/src/main/webapp/index.html similarity index 100% rename from spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war/src/main/webapp/index.html rename to spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/war/src/main/webapp/index.html diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-additional-properties/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-additional-properties/pom.xml deleted file mode 100644 index 1b5cd9fcb9..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-additional-properties/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - build-info-additional-properties - 0.0.1.BUILD-SNAPSHOT - Generate build info - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - build-info - - - - bar - ${project.build.sourceEncoding} - 1.8 - - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-additional-properties/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-additional-properties/verify.groovy deleted file mode 100644 index 10f6bfa4f7..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-additional-properties/verify.groovy +++ /dev/null @@ -1,13 +0,0 @@ -import org.springframework.boot.maven.Verify - -import static org.junit.Assert.assertEquals -import static org.junit.Assert.assertTrue - -def file = new File(basedir, "target/classes/META-INF/build-info.properties") -Properties properties = Verify.verifyBuildInfo(file, - 'org.springframework.boot.maven.it', 'build-info-additional-properties', - 'Generate build info', '0.0.1.BUILD-SNAPSHOT') -assertTrue properties.containsKey('build.time') -assertEquals 'bar', properties.get('build.foo') -assertEquals 'UTF-8', properties.get('build.encoding') -assertEquals '1.8', properties.get('build.java.source') \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-custom-build-time/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-custom-build-time/pom.xml deleted file mode 100644 index bfa9a51de3..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-custom-build-time/pom.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - build-info-custom-build-time - 0.0.1.BUILD-SNAPSHOT - Generate build info with custom build time - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - - - - build-info - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-custom-build-time/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-custom-build-time/verify.groovy deleted file mode 100644 index e6ec4d3e1d..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-custom-build-time/verify.groovy +++ /dev/null @@ -1,9 +0,0 @@ -import org.springframework.boot.maven.Verify - -import static org.junit.Assert.assertEquals - -def file = new File(basedir, "target/classes/META-INF/build-info.properties") -Properties properties = Verify.verifyBuildInfo(file, - 'org.springframework.boot.maven.it', 'build-info-custom-build-time', - 'Generate build info with custom build time', '0.0.1.BUILD-SNAPSHOT') -assertEquals(properties.get('build.time'), '2019-07-08T08:00:00Z') diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-custom-file/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-custom-file/pom.xml deleted file mode 100644 index 65bf4155f3..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-custom-file/pom.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - build-info-custom-file - 0.0.1.BUILD-SNAPSHOT - Generate custom build info - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - build-info - - - ${project.build.directory}/build.info - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-custom-file/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-custom-file/verify.groovy deleted file mode 100644 index eecd9e10d8..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-custom-file/verify.groovy +++ /dev/null @@ -1,9 +0,0 @@ -import org.springframework.boot.maven.Verify - -import static org.junit.Assert.assertTrue - -def file = new File(basedir, "target/build.info") -Properties properties = Verify.verifyBuildInfo(file, - 'org.springframework.boot.maven.it', 'build-info-custom-file', - 'Generate custom build info', '0.0.1.BUILD-SNAPSHOT') -assertTrue properties.containsKey('build.time') \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-disable-build-time/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-disable-build-time/verify.groovy deleted file mode 100644 index 7b5971224b..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info-disable-build-time/verify.groovy +++ /dev/null @@ -1,9 +0,0 @@ -import org.springframework.boot.maven.Verify - -import static org.junit.Assert.assertFalse - -def file = new File(basedir, "target/classes/META-INF/build-info.properties") -Properties properties = Verify.verifyBuildInfo(file, - 'org.springframework.boot.maven.it', 'build-info-disable-build-time', - 'Generate build info with disabled build time', '0.0.1.BUILD-SNAPSHOT') -assertFalse 'build time must not be present', properties.containsKey('build.time') diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info/pom.xml deleted file mode 100644 index 1f83522c8f..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info/pom.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - build-info - 0.0.1.BUILD-SNAPSHOT - Generate build info - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - build-info - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info/verify.groovy deleted file mode 100644 index e266446a8a..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/build-info/verify.groovy +++ /dev/null @@ -1,9 +0,0 @@ -import org.springframework.boot.maven.Verify - -import static org.junit.Assert.assertTrue - -def file = new File(basedir, "target/classes/META-INF/build-info.properties") -Properties properties = Verify.verifyBuildInfo(file, - 'org.springframework.boot.maven.it', 'build-info', - 'Generate build info', '0.0.1.BUILD-SNAPSHOT') -assertTrue properties.containsKey('build.time') \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-attach-disabled/invoker.properties b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-attach-disabled/invoker.properties deleted file mode 100644 index c0c3f7cc07..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-attach-disabled/invoker.properties +++ /dev/null @@ -1 +0,0 @@ -invoker.goals=clean install \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-attach-disabled/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-attach-disabled/pom.xml deleted file mode 100644 index 5c8f7f2ef1..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-attach-disabled/pom.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - jar-attach-disabled - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - false - - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - - some.random.Main - - - Foo - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-attach-disabled/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-attach-disabled/verify.groovy deleted file mode 100644 index 7cfb591705..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-attach-disabled/verify.groovy +++ /dev/null @@ -1,18 +0,0 @@ -import org.springframework.boot.maven.* - -import static org.junit.Assert.assertTrue -import static org.junit.Assert.assertFalse - -File main = new File(basedir, "target/jar-attach-disabled-0.0.1.BUILD-SNAPSHOT.jar") -File backup = new File(basedir, "target/jar-attach-disabled-0.0.1.BUILD-SNAPSHOT.jar.original") -Verify.verifyJar(main, "some.random.Main") -assertTrue 'backup file should exist', backup.exists() - -def file = new File(basedir, "build.log") -assertTrue 'main artifact should have been updated', - file.text.contains("Updating main artifact " + main + " to " + backup) -assertTrue 'main artifact should have been installed', - file.text.contains ("Installing " + backup + " to") -assertFalse 'repackaged artifact should not have been installed', - file.text.contains ("Installing " + main + "to") - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main-attach-disabled/invoker.properties b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main-attach-disabled/invoker.properties deleted file mode 100644 index c0c3f7cc07..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main-attach-disabled/invoker.properties +++ /dev/null @@ -1 +0,0 @@ -invoker.goals=clean install \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main-attach-disabled/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main-attach-disabled/pom.xml deleted file mode 100644 index ba65f7d5ec..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main-attach-disabled/pom.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - jar-classifier-main-attach-disabled - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - test - false - - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - - Foo - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main-attach-disabled/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main-attach-disabled/verify.groovy deleted file mode 100644 index 8a40399d7e..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main-attach-disabled/verify.groovy +++ /dev/null @@ -1,24 +0,0 @@ -import org.springframework.boot.maven.* - -import static org.junit.Assert.assertTrue -import static org.junit.Assert.assertFalse - -File repackaged = new File(basedir, "target/jar-classifier-main-attach-disabled-0.0.1.BUILD-SNAPSHOT-test.jar") -File main = new File(basedir, "target/jar-classifier-main-attach-disabled-0.0.1.BUILD-SNAPSHOT.jar") -File backup = new File(basedir, "target/jar-classifier-main-attach-disabled-0.0.1.BUILD-SNAPSHOT.jar.original") - -new Verify.JarArchiveVerification(repackaged, Verify.SAMPLE_APP).verify(); -assertTrue 'main artifact should exist', main.exists() -assertFalse 'backup artifact should not exist', backup.exists() - -def file = new File(basedir, "build.log") -assertFalse 'repackaged artifact should not have been attached', - file.text.contains("Attaching repackaged archive " + repackaged + " with classifier test") -assertTrue 'repackaged artifact should have been created', - file.text.contains("Creating repackaged archive " + repackaged + " with classifier test") -assertTrue 'main artifact should have been installed', - file.text.contains ("Installing " + main + " to") -assertFalse 'repackaged artifact should not have been installed', - file.text.contains ("Installing " + repackaged + " to") -assertFalse 'backup artifact should not have been installed', - file.text.contains ("Installing " + backup + "to") diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main/invoker.properties b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main/invoker.properties deleted file mode 100644 index c0c3f7cc07..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main/invoker.properties +++ /dev/null @@ -1 +0,0 @@ -invoker.goals=clean install \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main/pom.xml deleted file mode 100644 index b754ff6d29..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main/pom.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - jar-classifier-main - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - test - - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - - Foo - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main/verify.groovy deleted file mode 100644 index a575beda0a..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-main/verify.groovy +++ /dev/null @@ -1,22 +0,0 @@ -import org.springframework.boot.maven.* - -import static org.junit.Assert.assertTrue -import static org.junit.Assert.assertFalse - -File repackaged = new File(basedir, "target/jar-classifier-main-0.0.1.BUILD-SNAPSHOT-test.jar") -File main = new File(basedir, "target/jar-classifier-main-0.0.1.BUILD-SNAPSHOT.jar") -File backup = new File(basedir, "target/jar-classifier-main-0.0.1.BUILD-SNAPSHOT.jar.original") - -new Verify.JarArchiveVerification(repackaged, Verify.SAMPLE_APP).verify(); -assertTrue 'main artifact should exist', main.exists() -assertFalse 'backup artifact should not exist', backup.exists() - -def file = new File(basedir, "build.log") -assertTrue 'repackaged artifact should have been attached', - file.text.contains("Attaching repackaged archive " + repackaged + " with classifier test") -assertFalse 'repackaged artifact should have been created', - file.text.contains("Creating repackaged archive " + repackaged + " with classifier test") -assertTrue 'main artifact should have been installed', - file.text.contains ("Installing " + main + " to") -assertTrue 'repackaged artifact should have been installed', - file.text.contains ("Installing " + repackaged + " to") diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source-attach-disabled/invoker.properties b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source-attach-disabled/invoker.properties deleted file mode 100644 index c0c3f7cc07..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source-attach-disabled/invoker.properties +++ /dev/null @@ -1 +0,0 @@ -invoker.goals=clean install \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source-attach-disabled/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source-attach-disabled/pom.xml deleted file mode 100644 index 33b21884ec..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source-attach-disabled/pom.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - jar-classifier-source-attach-disabled - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - - jar - - package - - test - - - Foo - - - - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - test - false - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source-attach-disabled/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source-attach-disabled/verify.groovy deleted file mode 100644 index dae20efad3..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source-attach-disabled/verify.groovy +++ /dev/null @@ -1,20 +0,0 @@ -import org.springframework.boot.maven.* - -import static org.junit.Assert.assertTrue -import static org.junit.Assert.assertFalse - -File main = new File(basedir, "target/jar-classifier-source-attach-disabled-0.0.1.BUILD-SNAPSHOT-test.jar") -File backup = new File(basedir, "target/jar-classifier-source-attach-disabled-0.0.1.BUILD-SNAPSHOT-test.jar.original") - -new Verify.JarArchiveVerification(main, Verify.SAMPLE_APP).verify(); -assertTrue 'backup artifact should exist', backup.exists() - -def file = new File(basedir, "build.log") -assertFalse 'repackaged artifact should not have been attached', - file.text.contains("Attaching repackaged archive " + main + " with classifier test") -assertTrue 'test artifact should have been updated', - file.text.contains("Updating artifact with classifier test " + main + " to " + backup) -assertTrue 'backup artifact should have been installed', - file.text.contains ("Installing " + backup + " to") -assertFalse 'repackaged artifact should not have been installed', - file.text.contains ("Installing " + main + " to") diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source/invoker.properties b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source/invoker.properties deleted file mode 100644 index c0c3f7cc07..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source/invoker.properties +++ /dev/null @@ -1 +0,0 @@ -invoker.goals=clean install \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source/pom.xml deleted file mode 100644 index a7b24d9cda..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source/pom.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - jar-classifier-source - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - - jar - - package - - test - - - Foo - - - - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - test - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source/verify.groovy deleted file mode 100644 index d85fe41262..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-classifier-source/verify.groovy +++ /dev/null @@ -1,16 +0,0 @@ -import org.springframework.boot.maven.* - -import static org.junit.Assert.assertFalse -import static org.junit.Assert.assertTrue - -File repackaged = new File(basedir, "target/jar-classifier-source-0.0.1.BUILD-SNAPSHOT-test.jar") -File backup = new File(basedir, "target/jar-classifier-source-0.0.1.BUILD-SNAPSHOT-test.jar.original") - -new Verify.JarArchiveVerification(repackaged, Verify.SAMPLE_APP).verify(); -assertTrue 'backup artifact should exist', backup.exists() - -def file = new File(basedir, "build.log") -assertTrue 'repackaged artifact should have been replaced', - file.text.contains("Replacing artifact with classifier test with repackaged archive") -assertFalse 'backup artifact should not have been installed', file.text.contains ("Installing "+backup) -assertTrue 'repackaged artifact should have been installed', file.text.contains ("Installing "+repackaged) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-create-dir/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-create-dir/pom.xml deleted file mode 100644 index 33e076fcfb..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-create-dir/pom.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - jar-create-dir - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - ${project.build.directory}/foo - foo - - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - - some.random.Main - - - Foo - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-create-dir/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-create-dir/verify.groovy deleted file mode 100644 index 9a3e445474..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-create-dir/verify.groovy +++ /dev/null @@ -1,6 +0,0 @@ -import java.io.*; -import org.springframework.boot.maven.*; - -Verify.verifyJar( - new File(basedir, "target/foo/jar-create-dir-0.0.1.BUILD-SNAPSHOT-foo.jar"), "some.random.Main" -) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-dir/invoker.properties b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-dir/invoker.properties deleted file mode 100644 index c0c3f7cc07..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-dir/invoker.properties +++ /dev/null @@ -1 +0,0 @@ -invoker.goals=clean install \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-dir/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-dir/pom.xml deleted file mode 100644 index fa75c04236..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-dir/pom.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - jar-custom-dir - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - ${project.build.directory}/foo - - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - - some.random.Main - - - Foo - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-dir/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-dir/verify.groovy deleted file mode 100644 index 0960d4ee3e..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-dir/verify.groovy +++ /dev/null @@ -1,10 +0,0 @@ -import java.io.*; -import org.springframework.boot.maven.*; - -Verify.verifyJar( - new File(basedir, "target/foo/jar-custom-dir-0.0.1.BUILD-SNAPSHOT.jar"), "some.random.Main" -) - -Verify.verifyJar( - new File(localRepositoryPath, "org/springframework/boot/maven/it/jar-custom-dir/0.0.1.BUILD-SNAPSHOT/jar-custom-dir-0.0.1.BUILD-SNAPSHOT.jar"), "some.random.Main" -) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-launcher/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-launcher/pom.xml deleted file mode 100644 index f91261e245..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-launcher/pom.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - jar - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - ${basedir}/src/launcher/custom.script - - world - - - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - - some.random.Main - - - Foo - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-launcher/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-launcher/verify.groovy deleted file mode 100644 index 738a8ad142..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-custom-launcher/verify.groovy +++ /dev/null @@ -1,6 +0,0 @@ -import java.io.*; -import org.springframework.boot.maven.*; - -Verify.verifyJar( - new File(basedir, "target/jar-0.0.1.BUILD-SNAPSHOT.jar"), "some.random.Main", "Hello world" -) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-exclude-entry/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-exclude-entry/pom.xml deleted file mode 100644 index ba0c43d463..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-exclude-entry/pom.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - jar-exclude-entry - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - - - javax.servlet - servlet-api - - - - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - - Foo - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - javax.servlet - servlet-api - 2.5 - provided - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-exclude-entry/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-exclude-entry/verify.groovy deleted file mode 100644 index 61011b7aa5..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-exclude-entry/verify.groovy +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2012-2019 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. - */ - -import java.io.*; -import org.springframework.boot.maven.*; - -File f = new File(basedir, "target/jar-exclude-entry-0.0.1.BUILD-SNAPSHOT.jar") -new Verify.JarArchiveVerification(f, Verify.SAMPLE_APP) { - @Override - protected void verifyZipEntries(Verify.ArchiveVerifier verifier) throws Exception { - super.verifyZipEntries(verifier) - verifier.assertHasNoEntryNameStartingWith("BOOT-INF/lib/servlet-api-2.5.jar") - } -}.verify() diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-exclude-group/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-exclude-group/pom.xml deleted file mode 100644 index 19ae153fdf..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-exclude-group/pom.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - jar-exclude-group - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - org.apache.logging.log4j - - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - - Foo - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - org.apache.logging.log4j - log4j-api - @log4j2.version@ - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-exclude-group/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-exclude-group/verify.groovy deleted file mode 100644 index bf712e6801..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-exclude-group/verify.groovy +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2012-2019 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. - */ - -import java.io.*; -import org.springframework.boot.maven.*; - -File f = new File(basedir, "target/jar-exclude-group-0.0.1.BUILD-SNAPSHOT.jar") -new Verify.JarArchiveVerification(f, Verify.SAMPLE_APP) { - @Override - protected void verifyZipEntries(Verify.ArchiveVerifier verifier) throws Exception { - super.verifyZipEntries(verifier) - verifier.assertHasNoEntryNameStartingWith("BOOT-INF/lib/log4j-api-2.4.1.jar") - } -}.verify() diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-executable/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-executable/pom.xml deleted file mode 100644 index f014731810..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-executable/pom.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - jar-executable - MyFullyExecutableJarName - MyFullyExecutableJarDesc - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - true - - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - - some.random.Main - - - Foo - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-executable/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-executable/verify.groovy deleted file mode 100644 index 8c2522ba68..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-executable/verify.groovy +++ /dev/null @@ -1,7 +0,0 @@ -import java.io.*; -import org.springframework.boot.maven.*; - -Verify.verifyJar( - new File(basedir, "target/jar-executable-0.0.1.BUILD-SNAPSHOT.jar"), - "some.random.Main", "Spring Boot Startup Script", "MyFullyExecutableJarName", - "MyFullyExecutableJarDesc") diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-lib-name-conflict/acme-lib/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-lib-name-conflict/acme-lib/pom.xml deleted file mode 100644 index 25d2c815b5..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-lib-name-conflict/acme-lib/pom.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - 4.0.0 - acme-lib - - - org.springframework.boot.maven.it - jar-lib-name-conflict - 0.0.1.BUILD-SNAPSHOT - - - - - org.springframework - spring-context - @spring-framework.version@ - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-lib-name-conflict/test-project/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-lib-name-conflict/test-project/pom.xml deleted file mode 100644 index 65d9663c24..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-lib-name-conflict/test-project/pom.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - test-project - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - - Foo - - - - - - - - - - org.springframework.boot.maven.it - acme-lib - 0.0.1.BUILD-SNAPSHOT - - - org.springframework.boot.maven.it.another - acme-lib - 0.0.1.BUILD-SNAPSHOT - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-lib-name-conflict/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-lib-name-conflict/verify.groovy deleted file mode 100644 index 1294e4aeb7..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-lib-name-conflict/verify.groovy +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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 - * - * 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. - */ - -import java.io.*; -import org.springframework.boot.maven.*; - -File f = new File(basedir, "test-project/target/test-project-0.0.1.BUILD-SNAPSHOT.jar") -new Verify.JarArchiveVerification(f, Verify.SAMPLE_APP) { - @Override - protected void verifyZipEntries(Verify.ArchiveVerifier verifier) throws Exception { - super.verifyZipEntries(verifier) - verifier.assertHasEntryNameStartingWith("BOOT-INF/lib/org.springframework.boot.maven.it-acme-lib-0.0.1.BUILD-SNAPSHOT.jar") - verifier.assertHasEntryNameStartingWith("BOOT-INF/lib/org.springframework.boot.maven.it.another-acme-lib-0.0.1.BUILD-SNAPSHOT.jar") - } -}.verify(); - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-non-executable/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-non-executable/pom.xml deleted file mode 100644 index 587f8a8695..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-non-executable/pom.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - jar - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - false - - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - - some.random.Main - - - Foo - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-non-executable/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-non-executable/verify.groovy deleted file mode 100644 index 5d0f840e17..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-non-executable/verify.groovy +++ /dev/null @@ -1,6 +0,0 @@ -import java.io.*; -import org.springframework.boot.maven.*; - -Verify.verifyJar( - new File(basedir, "target/jar-0.0.1.BUILD-SNAPSHOT.jar"), "some.random.Main", false -) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-pom/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-pom/pom.xml deleted file mode 100644 index bbf54cebee..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-pom/pom.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - jar-pom - pom - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-skip/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-skip/pom.xml deleted file mode 100644 index 23021a8af8..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-skip/pom.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - jar-skip - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - true - - - - - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-skip/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-skip/verify.groovy deleted file mode 100644 index cff568c8cb..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-skip/verify.groovy +++ /dev/null @@ -1,7 +0,0 @@ -import static org.junit.Assert.assertTrue -import static org.junit.Assert.assertFalse - -File f = new File(basedir, "target/jar-skip-0.0.1.BUILD-SNAPSHOT.jar") -assertTrue 'output file should have been generated', f.exists() -File shouldNotExist = new File(basedir, "target/jar-skip-0.0.1.BUILD-SNAPSHOT.jar.original") -assertFalse 'repackage goal should not have run. .original should not exist', shouldNotExist.exists() diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope-default/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope-default/pom.xml deleted file mode 100644 index 15c4b16a57..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope-default/pom.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - jar-system-scope-default - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - - Foo - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - com.example - sample - 1.0.0 - system - ${project.basedir}/sample-1.0.0.jar - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope-default/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope-default/verify.groovy deleted file mode 100644 index 0a1ef4fc8f..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope-default/verify.groovy +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2012-2014 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. - */ - -import java.io.*; -import org.springframework.boot.maven.*; - -File f = new File(basedir, "target/jar-system-scope-default-0.0.1.BUILD-SNAPSHOT.jar") -new Verify.JarArchiveVerification(f, Verify.SAMPLE_APP) { - @Override - protected void verifyZipEntries(Verify.ArchiveVerifier verifier) throws Exception { - super.verifyZipEntries(verifier) - verifier.assertHasNoEntryNameStartingWith("BOOT-INF/lib/sample-1.0.0.jar") - } -}.verify() diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope/pom.xml deleted file mode 100644 index 22c2be9387..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - jar-system-scope - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - true - - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - - Foo - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - com.example - sample - 1.0.0 - system - ${project.basedir}/sample-1.0.0.jar - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope/verify.groovy deleted file mode 100644 index 20097b2b78..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-system-scope/verify.groovy +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2012-2014 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. - */ - -import java.io.*; -import org.springframework.boot.maven.*; - -File f = new File(basedir, "target/jar-system-scope-0.0.1.BUILD-SNAPSHOT.jar") -new Verify.JarArchiveVerification(f, Verify.SAMPLE_APP) { - @Override - protected void verifyZipEntries(Verify.ArchiveVerifier verifier) throws Exception { - super.verifyZipEntries(verifier) - verifier.assertHasEntryNameStartingWith("BOOT-INF/lib/sample-1.0.0.jar") - } -}.verify() diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-test-scope/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-test-scope/pom.xml deleted file mode 100644 index 11985a8b8a..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-test-scope/pom.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - jar-test-scope - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - servlet-api - - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - - Foo - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - org.apache.logging.log4j - log4j-api - @log4j2.version@ - test - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-test-scope/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-test-scope/verify.groovy deleted file mode 100644 index 24a032bfc2..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-test-scope/verify.groovy +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2012-2019 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. - */ - -import java.io.*; -import org.springframework.boot.maven.*; - -File f = new File(basedir, "target/jar-test-scope-0.0.1.BUILD-SNAPSHOT.jar") -new Verify.JarArchiveVerification(f, Verify.SAMPLE_APP) { - @Override - protected void verifyZipEntries(Verify.ArchiveVerifier verifier) throws Exception { - super.verifyZipEntries(verifier) - verifier.assertHasNoEntryNameStartingWith("BOOT-INF/lib/log4j-api-2.4.1.jar") - } -}.verify() diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-kotlin-module/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-kotlin-module/pom.xml deleted file mode 100644 index 770402c9d6..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-kotlin-module/pom.xml +++ /dev/null @@ -1,106 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - jar-with-kotlin-module - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - ${project.basedir}/src/main/kotlin - ${project.basedir}/src/test/kotlin - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - - - org.jetbrains.kotlin - kotlin-compiler - - - - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - - Foo - - - - - - org.jetbrains.kotlin - kotlin-maven-plugin - @kotlin.version@ - - - compile - process-resources - - compile - - - - test-compile - process-test-resources - - compile - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - org.apache.logging.log4j - log4j-api - @log4j2.version@ - - - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - @kotlin.version@ - - - org.jetbrains.kotlin - kotlin-reflect - @kotlin.version@ - - - org.jetbrains.kotlin - kotlin-compiler - @kotlin.version@ - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-kotlin-module/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-kotlin-module/verify.groovy deleted file mode 100644 index 6000b59e5c..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-kotlin-module/verify.groovy +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2012-2019 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. - */ - -import java.io.*; -import org.springframework.boot.maven.*; - -File f = new File(basedir, "target/jar-with-kotlin-module-0.0.1.BUILD-SNAPSHOT.jar") -new Verify.JarArchiveVerification(f, Verify.SAMPLE_APP) { - @Override - protected void verifyZipEntries(Verify.ArchiveVerifier verifier) throws Exception { - super.verifyZipEntries(verifier) - verifier.assertHasEntryNameStartingWith("BOOT-INF/classes/META-INF/jar-with-kotlin-module.kotlin_module") - verifier.assertHasUnpackEntry("BOOT-INF/lib/kotlin-compiler-") - verifier.assertHasNonUnpackEntry("BOOT-INF/lib/kotlin-stdlib-") - verifier.assertHasNonUnpackEntry("BOOT-INF/lib/kotlin-reflect-") - } -}.verify() diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-layout-property/invoker.properties b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-layout-property/invoker.properties deleted file mode 100644 index 034be12754..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-layout-property/invoker.properties +++ /dev/null @@ -1 +0,0 @@ -invoker.goals=package -Dspring-boot.repackage.layout=ZIP \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-layout-property/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-layout-property/verify.groovy deleted file mode 100644 index 74a5ff22db..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-layout-property/verify.groovy +++ /dev/null @@ -1,4 +0,0 @@ -import static org.junit.Assert.assertTrue - -def file = new File(basedir, "build.log") -assertTrue file.text.contains("Layout: ZIP") diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-unpack/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-unpack/verify.groovy deleted file mode 100644 index ea7eee6d12..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-with-unpack/verify.groovy +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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 - * - * 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. - */ - -import java.io.*; -import org.springframework.boot.maven.*; - -File f = new File(basedir, "target/jar-with-unpack-0.0.1.BUILD-SNAPSHOT.jar") -new Verify.JarArchiveVerification(f, Verify.SAMPLE_APP) { - @Override - protected void verifyZipEntries(Verify.ArchiveVerifier verifier) throws Exception { - super.verifyZipEntries(verifier) - verifier.assertHasUnpackEntry("BOOT-INF/lib/spring-core-") - verifier.assertHasNonUnpackEntry("BOOT-INF/lib/spring-context-") - } -}.verify() diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar/invoker.properties b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar/invoker.properties deleted file mode 100644 index c0c3f7cc07..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar/invoker.properties +++ /dev/null @@ -1 +0,0 @@ -invoker.goals=clean install \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar/verify.groovy deleted file mode 100644 index 248bf1acf3..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/jar/verify.groovy +++ /dev/null @@ -1,19 +0,0 @@ -import org.springframework.boot.maven.* - -import static org.junit.Assert.assertTrue -import static org.junit.Assert.assertFalse - -File main = new File(basedir, "target/jar-0.0.1.BUILD-SNAPSHOT.jar") -File backup = new File(basedir, "target/jar-0.0.1.BUILD-SNAPSHOT.jar.original") -Verify.verifyJar(main, "some.random.Main") -assertTrue 'backup file should exist', backup.exists() - -def file = new File(basedir, "build.log") -assertTrue 'main artifact should have been replaced by repackaged archive', - file.text.contains("Replacing main artifact with repackaged archive") -assertTrue 'main artifact should have been installed', - file.text.contains ("Installing " + main + " to") -assertFalse 'backup artifact should not have been installed', - file.text.contains ("Installing " + backup + "to") -assertFalse file.text.contains("Layout:") - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/prop/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/prop/pom.xml deleted file mode 100644 index 572465bd44..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/prop/pom.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - jar - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - ZIP - - - - - - org.apache.maven.plugins - maven-jar-plugin - @maven-jar-plugin.version@ - - - - Foo - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/prop/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/prop/verify.groovy deleted file mode 100644 index 39e9cd8496..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/prop/verify.groovy +++ /dev/null @@ -1,6 +0,0 @@ -import java.io.*; -import org.springframework.boot.maven.*; - -Verify.verifyZip( - new File(basedir, "target/jar-0.0.1.BUILD-SNAPSHOT.jar") -) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments-commandline/invoker.properties b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments-commandline/invoker.properties deleted file mode 100644 index 9225c36f9e..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments-commandline/invoker.properties +++ /dev/null @@ -1 +0,0 @@ -invoker.systemPropertiesFile=test.properties diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments-commandline/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments-commandline/pom.xml deleted file mode 100644 index af5471f4de..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments-commandline/pom.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - run-arguments-commandline - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - package - - run - - - - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments-commandline/test.properties b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments-commandline/test.properties deleted file mode 100644 index 4de2d29f21..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments-commandline/test.properties +++ /dev/null @@ -1 +0,0 @@ -spring-boot.run.arguments=--management.endpoints.web.exposure.include=prometheus,info,health,metrics --spring.profiles.active=foo,bar diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments-commandline/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments-commandline/verify.groovy deleted file mode 100644 index 9963e64c2e..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments-commandline/verify.groovy +++ /dev/null @@ -1,2 +0,0 @@ -def file = new File(basedir, "build.log") -return file.text.contains("I haz been run with profile(s) 'foo,bar' and endpoint(s) 'prometheus,info,health,metrics'") diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments/pom.xml deleted file mode 100644 index 34ca2c0386..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments/pom.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - run-arguments - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - package - - run - - - - --management.endpoints.web.exposure.include=prometheus,info - --spring.profiles.active=foo,bar - - - - - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments/verify.groovy deleted file mode 100644 index 2a7cc17ab5..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-arguments/verify.groovy +++ /dev/null @@ -1,2 +0,0 @@ -def file = new File(basedir, "build.log") -return file.text.contains("I haz been run with profile(s) 'foo,bar' and endpoint(s) 'prometheus,info'") diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-devtools/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-devtools/pom.xml deleted file mode 100644 index eeac82763d..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-devtools/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - run-devtools - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - package - - run - - - false - - - - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-devtools/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-devtools/verify.groovy deleted file mode 100644 index ac9957acf2..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-devtools/verify.groovy +++ /dev/null @@ -1,6 +0,0 @@ -import static org.junit.Assert.assertTrue - -def file = new File(basedir, "build.log") -assertTrue 'Devtools should have been detected', file.text.contains('Fork mode disabled, devtools will be disabled') -assertTrue 'Application should have run', file.text.contains("I haz been run") - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-disable-fork/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-disable-fork/pom.xml deleted file mode 100644 index 4d7d9a226d..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-disable-fork/pom.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - run-disable-fork - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - package - - run - - - false - -Dfoo=bar - ${project.build.sourceDirectory} - - value1 - - - - - - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-disable-fork/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-disable-fork/verify.groovy deleted file mode 100644 index 752e0988f0..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-disable-fork/verify.groovy +++ /dev/null @@ -1,7 +0,0 @@ -import static org.junit.Assert.assertTrue - -def file = new File(basedir, "build.log") -assertTrue file.text.contains("I haz been run") -assertTrue file.text.contains("Fork mode disabled, ignoring JVM argument(s) [-Dproperty1=value1 -Dproperty2 -Dfoo=bar]") -assertTrue file.text.contains("Fork mode disabled, ignoring working directory configuration") - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-envargs/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-envargs/pom.xml deleted file mode 100644 index 5d40d970c3..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-envargs/pom.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - run-envargs - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - package - - run - - - - 5000 - Some Text - - - - - - - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-envargs/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-envargs/verify.groovy deleted file mode 100644 index 841c4a97de..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-envargs/verify.groovy +++ /dev/null @@ -1,3 +0,0 @@ -def file = new File(basedir, "build.log") -return file.text.contains("I haz been run") - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-exclude/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-exclude/pom.xml deleted file mode 100644 index 2f02afbabd..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-exclude/pom.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - run-exclude - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - package - - run - - - - - org.apache.logging.log4j - log4j-api - - - jakarta.servlet,javax.servlet - - - - - - - - - org.apache.logging.log4j - log4j-api - @log4j2.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - javax.servlet - servlet-api - 2.5 - provided - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-exclude/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-exclude/verify.groovy deleted file mode 100644 index 841c4a97de..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-exclude/verify.groovy +++ /dev/null @@ -1,3 +0,0 @@ -def file = new File(basedir, "build.log") -return file.text.contains("I haz been run") - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-fork/invoker.properties b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-fork/invoker.properties deleted file mode 100644 index 8056f772da..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-fork/invoker.properties +++ /dev/null @@ -1 +0,0 @@ -invoker.goals=clean verify -X \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-fork/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-fork/verify.groovy deleted file mode 100644 index f675a4fa61..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-fork/verify.groovy +++ /dev/null @@ -1,21 +0,0 @@ -import java.lang.reflect.Method; - -import static org.junit.Assert.assertTrue - -def boolean isJava13OrLater() { - for (Method method : String.class.getMethods()) { - if (method.getName().equals("stripIndent")) { - return true; - } - } - return false; -} - -def file = new File(basedir, "build.log") -assertTrue file.text.contains("I haz been run from '$basedir'") -if (isJava13OrLater()) { - assertTrue file.text.contains("JVM argument(s): -XX:TieredStopAtLevel=1") -} -else { - assertTrue file.text.contains("JVM argument(s): -Xverify:none -XX:TieredStopAtLevel=1") -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-jvm-system-props/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-jvm-system-props/pom.xml deleted file mode 100644 index 4828ceec96..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-jvm-system-props/pom.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - run-jvmargs - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - package - - run - - - -Dfoo="value 1" -Dbar=value2 - - value1 - - ${project.artifactId} - should-be-ignored - - - - - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-jvm-system-props/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-jvm-system-props/verify.groovy deleted file mode 100644 index 841c4a97de..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-jvm-system-props/verify.groovy +++ /dev/null @@ -1,3 +0,0 @@ -def file = new File(basedir, "build.log") -return file.text.contains("I haz been run") - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-jvmargs/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-jvmargs/pom.xml deleted file mode 100644 index d7f82c8cd4..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-jvmargs/pom.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - run-jvmargs - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - package - - run - - - -Dfoo="value 1" -Dbar=value2 - - - - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-jvmargs/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-jvmargs/verify.groovy deleted file mode 100644 index 841c4a97de..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-jvmargs/verify.groovy +++ /dev/null @@ -1,3 +0,0 @@ -def file = new File(basedir, "build.log") -return file.text.contains("I haz been run") - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-profiles-fork/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-profiles-fork/pom.xml deleted file mode 100644 index 0504978714..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-profiles-fork/pom.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - run-profiles - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - package - - run - - - - foo - bar - - - - - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-profiles-fork/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-profiles-fork/verify.groovy deleted file mode 100644 index c9cb44bb05..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-profiles-fork/verify.groovy +++ /dev/null @@ -1,2 +0,0 @@ -def file = new File(basedir, "build.log") -return file.text.contains("I haz been run with profile(s) 'foo,bar'") \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-profiles/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-profiles/pom.xml deleted file mode 100644 index 0504978714..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-profiles/pom.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - run-profiles - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - package - - run - - - - foo - bar - - - - - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-profiles/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-profiles/verify.groovy deleted file mode 100644 index c9cb44bb05..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-profiles/verify.groovy +++ /dev/null @@ -1,2 +0,0 @@ -def file = new File(basedir, "build.log") -return file.text.contains("I haz been run with profile(s) 'foo,bar'") \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-toolchains/invoker.properties b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-toolchains/invoker.properties deleted file mode 100644 index 12b66a0fa5..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-toolchains/invoker.properties +++ /dev/null @@ -1,2 +0,0 @@ -invoker.goals=clean verify -t toolchains.xml -invoker.os.family=!windows diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-toolchains/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-toolchains/verify.groovy deleted file mode 100644 index 7140f782d8..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-toolchains/verify.groovy +++ /dev/null @@ -1,2 +0,0 @@ -def file = new File(basedir, "build.log") -return file.text.contains("The Maven Toolchains is awesome!") diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-use-test-classpath/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-use-test-classpath/pom.xml deleted file mode 100644 index 419080b62d..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-use-test-classpath/pom.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - run-use-test-classpath - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - package - - run - - - true - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - test - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-use-test-classpath/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-use-test-classpath/verify.groovy deleted file mode 100644 index 841c4a97de..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-use-test-classpath/verify.groovy +++ /dev/null @@ -1,3 +0,0 @@ -def file = new File(basedir, "build.log") -return file.text.contains("I haz been run") - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-working-directory/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-working-directory/pom.xml deleted file mode 100644 index c82a150c74..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-working-directory/pom.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - run-working-directory - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - package - - run - - - ${project.build.sourceDirectory} - - - - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-working-directory/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-working-directory/verify.groovy deleted file mode 100644 index 4f1b8234fc..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run-working-directory/verify.groovy +++ /dev/null @@ -1,6 +0,0 @@ -import static org.junit.Assert.assertTrue - -def file = new File(basedir, "build.log") -def workDir = new File(basedir, "src/main/java").getAbsolutePath() -assertTrue file.text.contains("I haz been run from ${workDir}") - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run/pom.xml deleted file mode 100644 index 19743c2c37..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run/pom.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - run - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - package - - run - - - false - - - - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run/verify.groovy deleted file mode 100644 index 841c4a97de..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/run/verify.groovy +++ /dev/null @@ -1,3 +0,0 @@ -def file = new File(basedir, "build.log") -return file.text.contains("I haz been run") - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/settings.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/settings.xml deleted file mode 100644 index e1e0ace341..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/settings.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - it-repo - - true - - - - local.central - @localRepositoryUrl@ - - true - - - true - - - - - - local.central - @localRepositoryUrl@ - - true - - - true - - - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-fork/invoker.properties b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-fork/invoker.properties deleted file mode 100644 index 793d89fcd3..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-fork/invoker.properties +++ /dev/null @@ -1 +0,0 @@ -invoker.goals=clean verify \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-fork/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-fork/verify.groovy deleted file mode 100644 index 5aa87af683..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-fork/verify.groovy +++ /dev/null @@ -1,5 +0,0 @@ -import static org.junit.Assert.assertTrue - -def file = new File(basedir, "build.log") -assertTrue 'Start should have waited for application to be ready', file.text.contains("isReady: true") -assertTrue 'Shutdown should have been invoked', file.text.contains("Shutdown requested") diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-skip/invoker.properties b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-skip/invoker.properties deleted file mode 100644 index 793d89fcd3..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-skip/invoker.properties +++ /dev/null @@ -1 +0,0 @@ -invoker.goals=clean verify \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-skip/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-skip/verify.groovy deleted file mode 100644 index 0d3ec538c9..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop-skip/verify.groovy +++ /dev/null @@ -1,5 +0,0 @@ -import static org.junit.Assert.assertFalse - -def file = new File(basedir, "build.log") -assertFalse 'Application should not have run', file.text.contains("Ooops, I haz been run") -assertFalse 'Should not attempt to stop the app', file.text.contains('Stopping application') diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop/invoker.properties b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop/invoker.properties deleted file mode 100644 index 793d89fcd3..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop/invoker.properties +++ /dev/null @@ -1 +0,0 @@ -invoker.goals=clean verify \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop/pom.xml deleted file mode 100644 index c079184547..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop/pom.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - start-stop - 0.0.1.BUILD-SNAPSHOT - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - pre-integration-test - - start - - - - post-integration-test - - stop - - - - - false - - - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop/verify.groovy deleted file mode 100644 index 5aa87af683..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/start-stop/verify.groovy +++ /dev/null @@ -1,5 +0,0 @@ -import static org.junit.Assert.assertTrue - -def file = new File(basedir, "build.log") -assertTrue 'Start should have waited for application to be ready', file.text.contains("isReady: true") -assertTrue 'Shutdown should have been invoked', file.text.contains("Shutdown requested") diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-reactor/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-reactor/verify.groovy deleted file mode 100644 index 48d805aaac..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-reactor/verify.groovy +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2012-2015 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. - */ - -import java.io.*; -import org.springframework.boot.maven.*; - -File f = new File(basedir, "war/target/war-0.0.1.BUILD-SNAPSHOT.war") -new Verify.WarArchiveVerification(f) { - @Override - protected void verifyZipEntries(Verify.ArchiveVerifier verifier) throws Exception { - super.verifyZipEntries(verifier) - verifier.assertHasEntryNameStartingWith("WEB-INF/lib/jar-0.0.1.BUILD-SNAPSHOT.jar") - verifier.assertHasNoEntryNameStartingWith("WEB-INF/lib/jar.jar") - } -}.verify() - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-with-unpack/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-with-unpack/pom.xml deleted file mode 100644 index 9238324238..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-with-unpack/pom.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - war - 0.0.1.BUILD-SNAPSHOT - war - - UTF-8 - @java.version@ - @java.version@ - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - repackage - - - - - org.springframework - spring-core - - - - - - - - org.apache.maven.plugins - maven-war-plugin - @maven-war-plugin.version@ - - - - Foo - - - - - - - - - org.springframework - spring-context - @spring-framework.version@ - - - jakarta.servlet - jakarta.servlet-api - @jakarta-servlet.version@ - provided - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-with-unpack/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-with-unpack/verify.groovy deleted file mode 100644 index d1c8e547fb..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war-with-unpack/verify.groovy +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2012-2015 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. - */ - -import java.io.*; -import org.springframework.boot.maven.*; - -File f = new File(basedir, "target/war-0.0.1.BUILD-SNAPSHOT.war") -new Verify.WarArchiveVerification(f) { - @Override - protected void verifyZipEntries(Verify.ArchiveVerifier verifier) throws Exception { - super.verifyZipEntries(verifier) - verifier.assertHasUnpackEntry("WEB-INF/lib/spring-core-") - verifier.assertHasNonUnpackEntry("WEB-INF/lib/spring-context-") - } -}.verify() - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war/verify.groovy b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war/verify.groovy deleted file mode 100644 index e0c145c834..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/it/war/verify.groovy +++ /dev/null @@ -1,7 +0,0 @@ -import java.io.*; -import org.springframework.boot.maven.*; - -Verify.verifyWar( - new File(basedir, "target/war-0.0.1.BUILD-SNAPSHOT.war") -) - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/build-info.adoc b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/build-info.adoc deleted file mode 100644 index 487b24d61c..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/build-info.adoc +++ /dev/null @@ -1,41 +0,0 @@ -[[build-info]] -== Integrating with Actuator -Spring Boot Actuator displays build-related information if a `META-INF/build-info.properties` file is present. -The `build-info` goal generates such file with the coordinates of the project and the build time. -It also allows you to add an arbitrary number of additional properties, as shown in the following example: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - - - org.springframework.boot - spring-boot-maven-plugin - {version} - - - - build-info - - - - UTF-8 - UTF-8 - ${maven.compiler.source} - ${maven.compiler.target} - - - - - - - - ----- - -This configuration will generate a `build-info.properties` at the expected location with four additional keys. -Note that `maven.compiler.source` and `maven.compiler.target` are expected to be regular properties available in the project. -They will be interpolated as you would expect. - -include::{generated-resources-root}/goals/build-info.adoc[leveloffset=+1] diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/getting-started.adoc b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/getting-started.adoc deleted file mode 100644 index 6501051115..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/getting-started.adoc +++ /dev/null @@ -1,7 +0,0 @@ -[[getting-started]] -== Getting started - -The Spring Boot Plugin has the following goals: - -include::{generated-resources-root}/goals/overview.adoc[] - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/help.adoc b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/help.adoc deleted file mode 100644 index 49d5452ea4..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/help.adoc +++ /dev/null @@ -1,5 +0,0 @@ -[[help]] -== Help information -The `help` goal is a standard goal that displays information on the capabilities of the plugin. - -include::{generated-resources-root}/goals/help.adoc[leveloffset=+1] diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/integration-tests.adoc b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/integration-tests.adoc deleted file mode 100644 index 31317f4298..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/integration-tests.adoc +++ /dev/null @@ -1,179 +0,0 @@ -[[integration-tests]] -== Running Integration tests - -While you may start your Spring Boot application very easily from your test (or test suite) itself, it may be desirable to handle that in the build itself. -To make sure that the lifecycle of your Spring Boot application is properly managed around your integration tests, you can use the `start` and `stop` goals, as shown in the following example: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - - org.springframework.boot - spring-boot-maven-plugin - {version} - - - pre-integration-test - - start - - - - post-integration-test - - stop - - - - - - ----- - -Such setup can now use the https://maven.apache.org/surefire/maven-failsafe-plugin[failsafe-plugin] to run your integration tests as you would expect. - -You could also configure a more advanced setup to skip the integration tests when a specific property has been set, see <>. - -include::{generated-resources-root}/goals/start.adoc[leveloffset=+1] - -include::{generated-resources-root}/goals/stop.adoc[leveloffset=+1] - - -[[integration-tests-example]] -=== Examples - - - -[[integration-tests-example-random-port]] -==== Random Port for Integration Tests -One nice feature of the Spring Boot test integration is that it can allocate a free port for the web application. -When the `start` goal of the plugin is used, the Spring Boot application is started separately, making it difficult to pass the actual port to the integration test itself. - -The example below showcases how you could achieve the same feature using the https://www.mojohaus.org/build-helper-maven-plugin[Build Helper Maven Plugin]: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - - - org.codehaus.mojo - build-helper-maven-plugin - {build-helper-maven-plugin-version} - - - reserve-tomcat-port - - reserve-network-port - - process-resources - - - tomcat.http.port - - - - - - - org.springframework.boot - spring-boot-maven-plugin - {version} - - - pre-integration-test - - start - - - - --server.port=${tomcat.http.port} - - - - - post-integration-test - - stop - - - - - - org.apache.maven.plugins - maven-failsafe-plugin - {maven-failsafe-plugin-version} - - - ${tomcat.http.port} - - - - - - ----- - -You can now retrieve the `test.server.port` system property in any of your integration test to create a proper `URL` to the server. - - - -[[integration-tests-example-skip]] -==== Skip Integration Tests -The `skip` property allows to skip the execution of the Spring Boot maven plugin altogether. - -This example shows how you can skip integration tests with a command-line property and still make sure that the `repackage` goal runs: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - false - - - - - org.springframework.boot - spring-boot-maven-plugin - {version} - - - pre-integration-test - - start - - - ${skip.it} - - - - post-integration-test - - stop - - - ${skip.it} - - - - - - org.apache.maven.plugins - maven-failsafe-plugin - {maven-failsafe-plugin-version} - - ${skip.it} - - - - - ----- - -By default, the integration tests will run but this setup allows you to easily disable them on the command-line as follows: - -[indent=0] ----- - $ mvn verify -Dskip.it=true ----- diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/packaging.adoc b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/packaging.adoc deleted file mode 100644 index 495dca330f..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/packaging.adoc +++ /dev/null @@ -1,395 +0,0 @@ -[[repackage]] -== Packaging executable archives - -The plugin can create executable archives (jar files and war files) that contain all of an application's dependencies and can then be run with `java -jar`. - -Packaging an executable archive is performed by the `repackage` goal, as shown in the following example: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - - org.springframework.boot - spring-boot-maven-plugin - {version} - - - - repackage - - - - - - ----- - -TIP: If you are using `spring-boot-starter-parent`, such execution is already pre-configured with a `repackage` execution id so that only the plugin definition should be added. - -The example above repackages a jar or war that is built during the package phase of the Maven lifecycle, including any `provided` dependencies that are defined in the project. -If some of these dependencies need to be excluded, you can use one of the exclude options, see the <> for more details. - -NOTE: The `outputFileNameMapping` feature of the `maven-war-plugin` is currently not supported. - -Devtools is automatically excluded by default (you can control that using the `excludeDevtools` property). -In order to make that work with `war` packaging, the `spring-boot-devtools` dependency must be set as `optional` or with the `provided` scope. - -The original (i.e. non executable) artifact is renamed to `.original` by default but it is also possible to keep the original artifact using a custom classifier. - -The plugin rewrites your manifest, and in particular it manages the "Main-Class" and "Start-Class" entries, so if the defaults don't work you have to configure those there (not in the jar plugin). -The "Main-Class" in the manifest is actually controlled by the "layout" property of the Spring Boot plugin, as shown in the following example: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - - org.springframework.boot - spring-boot-maven-plugin - {version} - - ${start.class} - ZIP - - - - - repackage - - - - - - ----- - -The `layout` property defaults to a guess based on the archive type (`jar` or `war`). The following layouts are available: - -* `JAR`: regular executable JAR layout. -* `WAR`: executable WAR layout. `provided` dependencies are placed in `WEB-INF/lib-provided` to avoid any clash when the `war` is deployed in a servlet container. -* `ZIP` (alias to `DIR`): similar to the `JAR` layout using `PropertiesLauncher`. -* `NONE`: Bundle all dependencies and project resources. Does not bundle a bootstrap loader. - -include::{generated-resources-root}/goals/repackage.adoc[leveloffset=+1] - -[[repackage-examples]] -=== Examples - -[[repackage-example-custom-classifier]] -==== Custom Classifier -By default, the `repackage` goal replaces the original artifact with the repackaged one. -That is a sane behavior for modules that represent an application but if your module is used as a dependency of another module, you need to provide a classifier for the repackaged one. -The reason for that is that application classes are packaged in `BOOT-INF/classes` so that the dependent module cannot load a repackaged jar's classes. - -If that is the case or if you prefer to keep the original artifact and attach the repackaged one with a different classifier, configure the plugin as shown in the following example: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - - - org.springframework.boot - spring-boot-maven-plugin - {version} - - - repackage - - repackage - - - exec - - - - - - - ----- - -If you are using `spring-boot-starter-parent`, the `repackage` goal is executed automatically in an execution with id `repackage`. -In that setup, only the configuration should be specified, as shown in the following example: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - - - org.springframework.boot - spring-boot-maven-plugin - - - repackage - - exec - - - - - - - ----- - -This configuration will generate two artifacts: the original one and the repackaged counter part produced by the repackage goal. -Both will be installed/deployed transparently. - -You can also use the same configuration if you want to repackage a secondary artifact the same way the main artifact is replaced. -The following configuration installs/deploys a single `task` classified artifact with the repackaged application: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - - - org.apache.maven.plugins - maven-jar-plugin - {maven-jar-plugin-version} - - - - jar - - package - - task - - - - - - org.springframework.boot - spring-boot-maven-plugin - {version} - - - repackage - - repackage - - - task - - - - - - - ----- - -As both the `maven-jar-plugin` and the `spring-boot-maven-plugin` runs at the same phase, it is important that the jar plugin is defined first (so that it runs before the repackage goal). -Again, if you are using `spring-boot-starter-parent`, this can be simplified as follows: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - - - org.apache.maven.plugins - maven-jar-plugin - - - default-jar - - task - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - repackage - - task - - - - - - - ----- - - - -[[repackage-example-custom-name]] -==== Custom Name -If you need the repackaged jar to have a different local name than the one defined by the `artifactId` attribute of the project, simply use the standard `finalName`, as shown in the following example: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - my-app - - - org.springframework.boot - spring-boot-maven-plugin - {version} - - - repackage - - repackage - - - - - - - ----- - -This configuration will generate the repackaged artifact in `target/my-app.jar`. - - - -[[repackage-example-local-artifact]] -==== Local Repackaged Artifact -By default, the `repackage` goal replaces the original artifact with the executable one. -If you need to only deploy the original jar and yet be able to run your app with the regular file name, configure the plugin as follows: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - - - org.springframework.boot - spring-boot-maven-plugin - {version} - - - repackage - - repackage - - - false - - - - - - - ----- - -This configuration generates two artifacts: the original one and the executable counter part produced by the `repackage` goal. -Only the original one will be installed/deployed. - - - -[[repackage-example-custom-layout]] -==== Custom Layout -Spring Boot repackages the jar file for this project using a custom layout factory defined in the additional jar file, provided as a dependency to the build plugin: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - - - org.springframework.boot - spring-boot-maven-plugin - {version} - - - repackage - - repackage - - - - value - - - - - - - com.example - custom-layout - 0.0.1.BUILD-SNAPSHOT - - - - - - ----- - -The layout factory is provided as an implementation of `LayoutFactory` (from `spring-boot-loader-tools`) explicitly specified in the pom. -If there is only one custom `LayoutFactory` on the plugin classpath and it is listed in `META-INF/spring.factories` then it is unnecessary to explicitly set it in the plugin configuration. - -Layout factories are always ignored if an explicit <> is set. - - - -[[repackage-example-exclude-dependency]] -==== Dependency Exclusion -By default, both the `repackage` and the `run` goals will include any `provided` dependencies that are defined in the project. -A Spring Boot project should consider `provided` dependencies as "container" dependencies that are required to run the application. - -Some of these dependencies may not be required at all and should be excluded from the executable jar. -For consistency, they should not be present either when running the application. - -There are two ways one can exclude a dependency from being packaged/used at runtime: - -* Exclude a specific artifact identified by `groupId` and `artifactId`, optionally with a `classifier` if needed. -* Exclude any artifact belonging to a given `groupId`. - -The following example excludes `com.foo:bar`, and only that artifact: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - - - org.springframework.boot - spring-boot-maven-plugin - {version} - - - - com.foo - bar - - - - - - - ----- - -This example excludes any artifact belonging to the `com.foo` group: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - - - org.springframework.boot - spring-boot-maven-plugin - {version} - - com.foo - - - - - ----- diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/running.adoc b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/running.adoc deleted file mode 100644 index 59f5918eed..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/asciidoc/running.adoc +++ /dev/null @@ -1,241 +0,0 @@ -[[run]] -== Running your application with Maven - -The plugin includes a run goal which can be used to launch your application from the command line, as shown in the following example: - -[indent=0] ----- - $ mvn spring-boot:run ----- - -By default the application is executed in a forked process and setting properties on the command-line will not affect the application. -If you need to specify some JVM arguments (i.e. for debugging purposes), you can use the `jvmArguments` parameter, see <> for more details. -There is also explicit support for <> and <>. - -As enabling a profile is quite common, there is dedicated `profiles` property that offers a shortcut for `-Dspring-boot.run.jvmArguments="-Dspring.profiles.active=dev"`, see <>. - -Although this is not recommended, it is possible to execute the application directly from the Maven JVM by disabling the `fork` property. -Doing so means that the `jvmArguments`, `systemPropertyVariables`, `environmentVariables` and `agents` options are ignored. - -Spring Boot `devtools` is a module to improve the development-time experience when working on Spring Boot applications. -To enable it, just add the following dependency to your project: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - org.springframework.boot - spring-boot-devtools - {version} - true - - ----- - -When `devtools` is running, it detects change when you recompile your application and automatically refreshes it. -This works for not only resources but code as well. -It also provides a LiveReload server so that it can automatically trigger a browser refresh whenever things change. - -Devtools can also be configured to only refresh the browser whenever a static resource has changed (and ignore any change in the code). -Just include the following property in your project: - -[source,properties,indent=0] ----- - spring.devtools.remote.restart.enabled=false ----- - -Prior to `devtools`, the plugin supported hot refreshing of resources by default which has now be disabled in favour of the solution described above. -You can restore it at any time by configuring your project: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - - org.springframework.boot - spring-boot-maven-plugin - {version} - - true - - - - ----- - -When `addResources` is enabled, any `src/main/resources` folder will be added to the application classpath when you run the application and any duplicate found in `target/classes` will be removed. -This allows hot refreshing of resources which can be very useful when developing web applications. -For example, you can work on HTML, CSS or JavaScript files and see your changes immediately without recompiling your application. -It is also a helpful way of allowing your front end developers to work without needing to download and install a Java IDE. - -NOTE: A side effect of using this feature is that filtering of resources at build time will not work. - -In order to be consistent with the `repackage` goal, the `run` goal builds the classpath in such a way that any dependency that is excluded in the plugin's configuration gets excluded from the classpath as well. -For more details, see <>. - -Sometimes it is useful to include test dependencies when running the application. -For example, if you want to run your application in a test mode that uses stub classes. -If you wish to do this, you can set the `useTestClasspath` parameter to true. -Note that this is only applied when you run an application: the `repackage` goal will not add test dependencies to the resulting JAR/WAR. - -include::{generated-resources-root}/goals/run.adoc[leveloffset=+1] - -[[run-examples]] -=== Examples - - - -[[run-example-debug]] -==== Debug the Application -By default, the `run` goal runs your application in a forked process. -If you need to debug it, you should add the necessary JVM arguments to enable remote debugging. -The following configuration suspend the process until a debugger has joined on port 5005: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - - - org.springframework.boot - spring-boot-maven-plugin - {version} - - - -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 - - - - - - ----- - -These arguments can be specified on the command line as well, make sure to wrap that properly, that is: - -[indent=0] ----- - $ mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005" ----- - - - -[[run-example-system-properties]] -==== Using System Properties -System properties can be specified using the `systemPropertyVariables` attribute. -The following example sets `property1` to `test` and `property2` to 42: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - - 42 - - - - org.springframework.boot - spring-boot-maven-plugin - {version} - - - test - ${my.value} - - - - - - ----- - -If the value is empty or not defined (i.e. `), the system property is set with an empty String as the value. -Maven trims values specified in the pom so it is not possible to specify a System property which needs to start or end with a space via this mechanism: consider using `jvmArguments` instead. - -Any String typed Maven variable can be passed as system properties. -Any attempt to pass any other Maven variable type (e.g. a `List` or a `URL` variable) will cause the variable expression to be passed literally (unevaluated). - -The `jvmArguments` parameter takes precedence over system properties defined with the mechanism above. -In the following example, the value for `property1` is `overridden`: - -[indent=0] ----- - $ mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Dproperty1=overridden" ----- - - - -[[run-example-environment-variables]] -==== Using Environment Variables -Environment variables can be specified using the `environmentVariables` attribute. -The following example sets the 'ENV1', 'ENV2', 'ENV3', 'ENV4' env variables: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - - - org.springframework.boot - spring-boot-maven-plugin - {version} - - - 5000 - Some Text - - - - - - - - ----- - -If the value is empty or not defined (i.e. `), the env variable is set with an empty String as the value. -Maven trims values specified in the pom so it is not possible to specify an env variable which needs to start or end with a space. - -Any String typed Maven variable can be passed as system properties. -Any attempt to pass any other Maven variable type (e.g. a `List` or a `URL` variable) will cause the variable expression to be passed literally (unevaluated). - -Environment variables defined this way take precedence over existing values. - - - -[[run-example-active-profiles]] -==== Specify Active Profiles -The active profiles to use for a particular application can be specified using the `profiles` argument. - -The following configuration enables the `foo` and `bar` profiles: - -[source,xml,indent=0,subs="verbatim,attributes"] ----- - - - - - org.springframework.boot - spring-boot-maven-plugin - {version} - - - foo - bar - - - - - - ----- - -The profiles to enable can be specified on the command line as well, make sure to separate them with a comma, as shown in the following example: - -[indent=0] ----- - $ mvn spring-boot:run -Dspring-boot.run.profiles=foo,bar ----- - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/maven/resources/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/maven/resources/pom.xml new file mode 100644 index 0000000000..9a7c8e0cde --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/maven/resources/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + org.springframework.boot + spring-boot-maven-plugin + {{version}} + maven-plugin + Spring Boot Maven Plugin + https://projects.spring.io/spring-boot/# + + UTF-8 + + + + Apache License, Version 2.0 + https://www.apache.org/licenses/LICENSE-2.0 + + + + https://github.com/spring-projects/spring-boot + scm:git:git://github.com/spring-projects/spring-boot.git + scm:git:ssh://git@github.com/spring-projects/spring-boot.git + + + GitHub + https://github.com/spring-projects/spring-boot/issues + + + Pivotal Software, Inc. + https://spring.io + + + + + org.apache.maven.plugins + maven-plugin-plugin + 3.6.0 + + org.springframework.boot.maven + + + + + \ No newline at end of file diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/Verify.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/Verify.java deleted file mode 100644 index c69a060bb4..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/Verify.java +++ /dev/null @@ -1,308 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.maven; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; -import java.util.jar.Manifest; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; - -import org.springframework.core.io.FileSystemResource; -import org.springframework.core.io.support.PropertiesLoaderUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.contentOf; - -/** - * Verification utility for use with maven-invoker-plugin verification scripts. - * - * @author Phillip Webb - * @author Andy Wilkinson - * @author Stephane Nicoll - */ -public final class Verify { - - public static final String SAMPLE_APP = "org.test.SampleApplication"; - - private Verify() { - } - - public static void verifyJar(File file) throws Exception { - new JarArchiveVerification(file, SAMPLE_APP).verify(); - } - - public static void verifyJar(File file, String main, String... scriptContents) throws Exception { - verifyJar(file, main, true, scriptContents); - } - - public static void verifyJar(File file, String main, boolean executable, String... scriptContents) - throws Exception { - new JarArchiveVerification(file, main).verify(executable, scriptContents); - } - - public static void verifyWar(File file) throws Exception { - new WarArchiveVerification(file).verify(); - } - - public static void verifyZip(File file) throws Exception { - new ZipArchiveVerification(file).verify(); - } - - public static void verifyModule(File file) throws Exception { - new ModuleArchiveVerification(file).verify(); - } - - public static Properties verifyBuildInfo(File file, String group, String artifact, String name, String version) - throws IOException { - FileSystemResource resource = new FileSystemResource(file); - Properties properties = PropertiesLoaderUtils.loadProperties(resource); - assertThat(properties.get("build.group")).isEqualTo(group); - assertThat(properties.get("build.artifact")).isEqualTo(artifact); - assertThat(properties.get("build.name")).isEqualTo(name); - assertThat(properties.get("build.version")).isEqualTo(version); - return properties; - } - - public static class ArchiveVerifier { - - private final ZipFile zipFile; - - private final Map content; - - public ArchiveVerifier(ZipFile zipFile) { - this.zipFile = zipFile; - Enumeration entries = zipFile.entries(); - this.content = new HashMap<>(); - while (entries.hasMoreElements()) { - ZipEntry zipEntry = entries.nextElement(); - this.content.put(zipEntry.getName(), zipEntry); - } - } - - public void assertHasEntryNameStartingWith(String entry) { - for (String name : this.content.keySet()) { - if (name.startsWith(entry)) { - return; - } - } - throw new IllegalStateException("Expected entry starting with " + entry); - } - - public void assertHasNoEntryNameStartingWith(String entry) { - for (String name : this.content.keySet()) { - if (name.startsWith(entry)) { - throw new IllegalStateException("Entry starting with " + entry + " should not have been found"); - } - } - } - - public void assertHasNonUnpackEntry(String entryName) { - assertThat(hasNonUnpackEntry(entryName)).as("Entry starting with " + entryName + " was an UNPACK entry") - .isTrue(); - } - - public void assertHasUnpackEntry(String entryName) { - assertThat(hasUnpackEntry(entryName)).as("Entry starting with " + entryName + " was not an UNPACK entry") - .isTrue(); - } - - private boolean hasNonUnpackEntry(String entryName) { - return !hasUnpackEntry(entryName); - } - - private boolean hasUnpackEntry(String entryName) { - String comment = getEntryStartingWith(entryName).getComment(); - return comment != null && comment.startsWith("UNPACK:"); - } - - private ZipEntry getEntryStartingWith(String entryName) { - return this.content.entrySet().stream().filter((entry) -> entry.getKey().startsWith(entryName)) - .map(Map.Entry::getValue).findFirst() - .orElseThrow(() -> new IllegalStateException("Unable to find entry starting with " + entryName)); - } - - public boolean hasEntry(String entry) { - return this.content.containsKey(entry); - } - - public ZipEntry getEntry(String entry) { - return this.content.get(entry); - } - - public InputStream getEntryContent(String entry) throws IOException { - ZipEntry zipEntry = getEntry(entry); - if (zipEntry == null) { - throw new IllegalArgumentException("No entry with name [" + entry + "]"); - } - return this.zipFile.getInputStream(zipEntry); - } - - } - - public abstract static class AbstractArchiveVerification { - - private final File file; - - AbstractArchiveVerification(File file) { - this.file = file; - } - - public void verify() throws Exception { - verify(true); - } - - public void verify(boolean executable, String... scriptContents) throws Exception { - assertThat(this.file).exists().isFile(); - - if (scriptContents.length > 0 && executable) { - String contents = contentOf(this.file); - contents = contents.substring(0, contents.indexOf(new String(new byte[] { 0x50, 0x4b, 0x03, 0x04 }))); - for (String content : scriptContents) { - assertThat(contents).contains(content); - } - } - - if (!executable) { - String contents = contentOf(this.file); - assertThat(contents).as("Is executable").startsWith(new String(new byte[] { 0x50, 0x4b, 0x03, 0x04 })); - } - - try (ZipFile zipFile = new ZipFile(this.file)) { - ArchiveVerifier verifier = new ArchiveVerifier(zipFile); - verifyZipEntries(verifier); - } - } - - protected void verifyZipEntries(ArchiveVerifier verifier) throws Exception { - verifyManifest(verifier); - } - - private void verifyManifest(ArchiveVerifier verifier) throws Exception { - Manifest manifest = new Manifest(verifier.getEntryContent("META-INF/MANIFEST.MF")); - verifyManifest(manifest); - } - - protected abstract void verifyManifest(Manifest manifest) throws Exception; - - } - - public static class JarArchiveVerification extends AbstractArchiveVerification { - - private final String main; - - public JarArchiveVerification(File file, String main) { - super(file); - this.main = main; - } - - @Override - protected void verifyZipEntries(ArchiveVerifier verifier) throws Exception { - super.verifyZipEntries(verifier); - verifier.assertHasEntryNameStartingWith("BOOT-INF/lib/spring-context"); - verifier.assertHasEntryNameStartingWith("BOOT-INF/lib/spring-core"); - verifier.assertHasEntryNameStartingWith("BOOT-INF/lib/jakarta.servlet-api-4"); - assertThat(verifier.hasEntry("org/springframework/boot/loader/JarLauncher.class")) - .as("Unpacked launcher classes").isTrue(); - assertThat(verifier.hasEntry("BOOT-INF/classes/org/test/SampleApplication.class")).as("Own classes") - .isTrue(); - } - - @Override - protected void verifyManifest(Manifest manifest) throws Exception { - assertThat(manifest.getMainAttributes().getValue("Main-Class")) - .isEqualTo("org.springframework.boot.loader.JarLauncher"); - assertThat(manifest.getMainAttributes().getValue("Start-Class")).isEqualTo(this.main); - assertThat(manifest.getMainAttributes().getValue("Not-Used")).isEqualTo("Foo"); - } - - } - - public static class WarArchiveVerification extends AbstractArchiveVerification { - - public WarArchiveVerification(File file) { - super(file); - } - - @Override - protected void verifyZipEntries(ArchiveVerifier verifier) throws Exception { - super.verifyZipEntries(verifier); - verifier.assertHasEntryNameStartingWith("WEB-INF/lib/spring-context"); - verifier.assertHasEntryNameStartingWith("WEB-INF/lib/spring-core"); - verifier.assertHasEntryNameStartingWith("WEB-INF/lib-provided/jakarta.servlet-api-4"); - assertThat(verifier.hasEntry("org/springframework/boot/loader/JarLauncher.class")) - .as("Unpacked launcher classes").isTrue(); - assertThat(verifier.hasEntry("WEB-INF/classes/org/test/SampleApplication.class")).as("Own classes") - .isTrue(); - assertThat(verifier.hasEntry("index.html")).as("Web content").isTrue(); - } - - @Override - protected void verifyManifest(Manifest manifest) throws Exception { - assertThat(manifest.getMainAttributes().getValue("Main-Class")) - .isEqualTo("org.springframework.boot.loader.WarLauncher"); - assertThat(manifest.getMainAttributes().getValue("Start-Class")).isEqualTo("org.test.SampleApplication"); - assertThat(manifest.getMainAttributes().getValue("Not-Used")).isEqualTo("Foo"); - } - - } - - private static class ZipArchiveVerification extends AbstractArchiveVerification { - - ZipArchiveVerification(File file) { - super(file); - } - - @Override - protected void verifyManifest(Manifest manifest) throws Exception { - assertThat(manifest.getMainAttributes().getValue("Main-Class")) - .isEqualTo("org.springframework.boot.loader.PropertiesLauncher"); - assertThat(manifest.getMainAttributes().getValue("Start-Class")).isEqualTo("org.test.SampleApplication"); - assertThat(manifest.getMainAttributes().getValue("Not-Used")).isEqualTo("Foo"); - } - - } - - private static class ModuleArchiveVerification extends AbstractArchiveVerification { - - ModuleArchiveVerification(File file) { - super(file); - } - - @Override - protected void verifyZipEntries(ArchiveVerifier verifier) throws Exception { - super.verifyZipEntries(verifier); - verifier.assertHasEntryNameStartingWith("lib/spring-context"); - verifier.assertHasEntryNameStartingWith("lib/spring-core"); - verifier.assertHasNoEntryNameStartingWith("lib/jakarta.servlet-api"); - assertThat(verifier.hasEntry("org/springframework/boot/loader/JarLauncher.class")) - .as("Unpacked launcher classes").isFalse(); - assertThat(verifier.hasEntry("org/test/SampleModule.class")).as("Own classes").isTrue(); - } - - @Override - protected void verifyManifest(Manifest manifest) throws Exception { - } - - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/build.gradle b/spring-boot-project/spring-boot-tools/spring-boot-test-support/build.gradle new file mode 100644 index 0000000000..b4b18cc55c --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/build.gradle @@ -0,0 +1,37 @@ +plugins { + id 'java-library' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Testing Support' + +dependencies { + compileOnly "com.datastax.cassandra:cassandra-driver-core" + compileOnly "javax.servlet:javax.servlet-api" + compileOnly "junit:junit" + compileOnly "org.junit.jupiter:junit-jupiter" + compileOnly "org.junit.platform:junit-platform-engine" + compileOnly "org.mockito:mockito-core" + compileOnly "org.neo4j:neo4j-ogm-core" + compileOnly "org.springframework:spring-context" + compileOnly "org.springframework.data:spring-data-redis" + compileOnly "org.testcontainers:testcontainers" + + implementation enforcedPlatform(project(path: ":spring-boot-project:spring-boot-parent")) + implementation "org.apache.maven.resolver:maven-resolver-connector-basic" + implementation "org.apache.maven.resolver:maven-resolver-impl" + implementation "org.apache.maven:maven-resolver-provider" + implementation("org.apache.maven.resolver:maven-resolver-transport-http") { + exclude group: 'org.slf4j', module: 'jcl-over-slf4j' + } + implementation "org.assertj:assertj-core" + implementation "org.hamcrest:hamcrest-core" + implementation "org.hamcrest:hamcrest-library" + implementation "org.springframework:spring-core" + + testImplementation "org.junit.jupiter:junit-jupiter" + testImplementation "org.springframework:spring-context" + + testRuntimeOnly 'org.hibernate.validator:hibernate-validator' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/pom.xml b/spring-boot-project/spring-boot-tools/spring-boot-test-support/pom.xml deleted file mode 100644 index 580c05156d..0000000000 --- a/spring-boot-project/spring-boot-tools/spring-boot-test-support/pom.xml +++ /dev/null @@ -1,149 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-tools - ${revision} - - spring-boot-test-support - Spring Boot Testing Support - Spring Boot Testing Support - - ${basedir}/../../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - - org.apache.maven.resolver - maven-resolver-connector-basic - - - org.apache.maven.resolver - maven-resolver-impl - - - org.apache.maven - maven-resolver-provider - - - com.google.guava - guava - - - - - org.apache.maven.resolver - maven-resolver-transport-http - - - jcl-over-slf4j - org.slf4j - - - - - org.springframework - spring-core - - - org.assertj - assertj-core - - - - com.datastax.cassandra - cassandra-driver-core - true - - - jakarta.servlet - jakarta.servlet-api - true - - - org.mockito - mockito-core - true - - - org.neo4j - neo4j-ogm-core - true - - - org.springframework.data - spring-data-redis - true - - - org.springframework - spring-context - true - - - org.testcontainers - testcontainers - true - - - javax.activation - javax.activation-api - - - javax.annotation - javax.annotation-api - - - javax.xml.bind - jaxb-api - - - - - org.testcontainers - junit-jupiter - true - - - - junit - junit - provided - - - org.hamcrest - hamcrest-core - - - - - org.junit.jupiter - junit-jupiter - provided - - - - org.hibernate.validator - hibernate-validator - test - - - javax.validation - validation-api - - - - - jakarta.validation - jakarta.validation-api - test - - - diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/BuildOutput.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/BuildOutput.java index a0e1c3bd5b..41d055f396 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/BuildOutput.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/BuildOutput.java @@ -40,7 +40,9 @@ public class BuildOutput { public File getTestClassesLocation() { try { File location = new File(this.testClass.getProtectionDomain().getCodeSource().getLocation().toURI()); - if (location.getPath().endsWith(path("target", "test-classes"))) { + if (location.getPath().endsWith(path("bin", "test")) || location.getPath().endsWith(path("bin", "intTest")) + || location.getPath().endsWith(path("build", "classes", "java", "test")) + || location.getPath().endsWith(path("build", "classes", "java", "intTest"))) { return location; } throw new IllegalStateException("Unexpected test classes location '" + location + "'"); @@ -56,9 +58,16 @@ public class BuildOutput { */ public File getTestResourcesLocation() { File testClassesLocation = getTestClassesLocation(); - if (testClassesLocation.getPath().endsWith(path("target", "test-classes"))) { + if (testClassesLocation.getPath().endsWith(path("bin", "test")) + || testClassesLocation.getPath().endsWith(path("bin", "intTest"))) { return testClassesLocation; } + if (testClassesLocation.getPath().endsWith(path("build", "classes", "java", "test"))) { + return new File(testClassesLocation.getParentFile().getParentFile().getParentFile(), "resources/test"); + } + if (testClassesLocation.getPath().endsWith(path("build", "classes", "java", "intTest"))) { + return new File(testClassesLocation.getParentFile().getParentFile().getParentFile(), "resources/intTest"); + } throw new IllegalStateException( "Cannot determine test resources location from classes location '" + testClassesLocation + "'"); } @@ -68,7 +77,7 @@ public class BuildOutput { * @return root location */ public File getRootLocation() { - return getTestClassesLocation().getParentFile(); + return new File("build"); } private String path(String... components) { diff --git a/spring-boot-project/spring-boot/build.gradle b/spring-boot-project/spring-boot/build.gradle new file mode 100644 index 0000000000..60a897770f --- /dev/null +++ b/spring-boot-project/spring-boot/build.gradle @@ -0,0 +1,127 @@ +plugins { + id 'java-library' + id 'org.jetbrains.kotlin.jvm' + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.configuration-properties' + id 'org.springframework.boot.deployed' + id 'org.springframework.boot.optional-dependencies' +} + +description = 'Spring Boot' + +dependencies { + annotationProcessor enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + annotationProcessor 'org.apache.logging.log4j:log4j-core' + + api 'org.springframework:spring-core' + api 'org.springframework:spring-context' + + implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + + optional enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + optional 'ch.qos.logback:logback-classic' + optional 'com.atomikos:transactions-jdbc' + optional 'com.atomikos:transactions-jms' + optional 'com.atomikos:transactions-jta' + optional 'com.fasterxml.jackson.core:jackson-databind' + optional 'com.google.code.gson:gson' + optional 'com.samskivert:jmustache' + optional 'com.sendgrid:sendgrid-java' + optional 'com.zaxxer:HikariCP' + optional 'io.netty:netty-tcnative-boringssl-static' + optional 'io.projectreactor:reactor-tools' + optional 'io.projectreactor.netty:reactor-netty' + optional 'io.rsocket:rsocket-core' + optional 'io.rsocket:rsocket-transport-netty' + optional ('io.undertow:undertow-servlet') { + exclude group: 'org.jboss.spec.javax.annotation', module: 'jboss-annotations-api_1.2_spec' + exclude group: 'org.jboss.spec.javax.servlet', module: 'jboss-servlet-api_4.0_spec' + } + optional 'javax.jms:javax.jms-api' + optional 'javax.servlet:javax.servlet-api' + optional 'junit:junit' + optional 'org.apache.commons:commons-dbcp2' + optional 'org.apache.httpcomponents:httpclient' + optional 'org.apache.logging.log4j:log4j-api' + optional 'org.apache.logging.log4j:log4j-core' + optional 'org.apache.tomcat.embed:tomcat-embed-core' + optional 'org.apache.tomcat.embed:tomcat-embed-jasper' + optional 'org.apache.tomcat:tomcat-jdbc' + optional 'org.assertj:assertj-core' + optional 'org.codehaus.btm:btm' + optional 'org.codehaus.groovy:groovy' + optional 'org.codehaus.groovy:groovy-xml' + optional 'org.eclipse.jetty:jetty-servlets' + optional 'org.eclipse.jetty:jetty-util' + optional 'org.eclipse.jetty:jetty-webapp' + optional 'org.eclipse.jetty:jetty-alpn-conscrypt-server' + optional 'org.eclipse.jetty.http2:http2-server' + optional 'org.hamcrest:hamcrest-library' + optional 'org.hibernate:hibernate-core' + optional 'org.hibernate.validator:hibernate-validator' + optional 'org.jboss:jboss-transaction-spi' + optional 'org.liquibase:liquibase-core' + optional 'org.neo4j:neo4j-ogm-core' + optional 'org.slf4j:jul-to-slf4j' + optional 'org.slf4j:slf4j-api' + optional 'org.springframework:spring-messaging' + optional 'org.springframework:spring-orm' + optional 'org.springframework:spring-oxm' + optional 'org.springframework:spring-test' + optional 'org.springframework:spring-web' + optional 'org.springframework:spring-webflux' + optional 'org.springframework:spring-webmvc' + optional 'org.springframework.security:spring-security-web' + optional 'org.springframework.ws:spring-ws-core' + optional 'org.yaml:snakeyaml' + optional 'org.jetbrains.kotlin:kotlin-reflect' + optional 'org.jetbrains.kotlin:kotlin-stdlib' + + testImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-test-support') + testImplementation 'com.google.appengine:appengine-api-1.0-sdk' + testImplementation 'com.h2database:h2' + testImplementation 'com.ibm.db2:jcc' + testImplementation 'com.jayway.jsonpath:json-path' + testImplementation 'com.microsoft.sqlserver:mssql-jdbc' + testImplementation 'com.oracle.ojdbc:ojdbc8' + testImplementation 'com.squareup.okhttp3:okhttp' + testImplementation 'com.sun.xml.messaging.saaj:saaj-impl' + testImplementation 'io.projectreactor:reactor-test' + testImplementation 'javax.xml.ws:jaxws-api' + testImplementation 'mysql:mysql-connector-java' + testImplementation 'net.sourceforge.jtds:jtds' + testImplementation 'org.apache.derby:derby' + testImplementation 'org.apache.httpcomponents:httpasyncclient' + testImplementation 'org.awaitility:awaitility' + testImplementation 'org.firebirdsql.jdbc:jaybird-jdk18' + testImplementation 'org.hsqldb:hsqldb' + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.mariadb.jdbc:mariadb-java-client' + testImplementation 'org.mockito:mockito-core' + testImplementation 'org.postgresql:postgresql' + testImplementation 'org.springframework:spring-context-support' + testImplementation 'org.springframework.data:spring-data-redis' + testImplementation 'org.xerial:sqlite-jdbc' + + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + testRuntimeOnly('org.testcontainers:jdbc') { + exclude group: 'javax.annotation', module: 'javax.annotation-api' + exclude group: 'javax.xml.bind', module: 'jaxb-api' + } +} + +compileKotlin { + kotlinOptions { + jvmTarget = 1.8 + } +} + +compileTestKotlin { + kotlinOptions { + jvmTarget = 1.8 + } +} + +compileJava { + doLast new org.springframework.boot.build.log4j2.ReproducibleLog4j2PluginsDatAction() +} diff --git a/spring-boot-project/spring-boot/pom.xml b/spring-boot-project/spring-boot/pom.xml deleted file mode 100644 index e42cf62672..0000000000 --- a/spring-boot-project/spring-boot/pom.xml +++ /dev/null @@ -1,560 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-parent - ${revision} - ../spring-boot-parent - - spring-boot - Spring Boot - Spring Boot - - ${basedir}/../.. - - - ${git.url} - ${git.connection} - ${git.developerConnection} - - - - - org.springframework - spring-core - - - org.springframework - spring-context - - - - ch.qos.logback - logback-classic - true - - - com.atomikos - transactions-jdbc - true - - - com.atomikos - transactions-jms - true - - - com.atomikos - transactions-jta - true - - - com.fasterxml.jackson.core - jackson-databind - true - - - com.google.code.gson - gson - true - - - com.oracle.ojdbc - ojdbc8 - true - - - com.samskivert - jmustache - true - - - com.sendgrid - sendgrid-java - true - - - com.zaxxer - HikariCP - true - - - io.projectreactor.netty - reactor-netty - true - - - io.netty - netty-tcnative-boringssl-static - true - - - io.rsocket - rsocket-core - true - - - io.rsocket - rsocket-transport-netty - true - - - io.undertow - undertow-servlet - true - - - jakarta.jms - jakarta.jms-api - true - - - jakarta.servlet - jakarta.servlet-api - true - - - jakarta.validation - jakarta.validation-api - true - - - junit - junit - true - - - org.hamcrest - hamcrest-core - - - - - org.apache.commons - commons-dbcp2 - true - - - org.apache.httpcomponents - httpclient - true - - - org.apache.logging.log4j - log4j-api - true - - - org.apache.logging.log4j - log4j-core - true - - - org.apache.tomcat.embed - tomcat-embed-core - true - - - org.apache.tomcat.embed - tomcat-embed-jasper - true - - - org.apache.tomcat - tomcat-jdbc - true - - - org.assertj - assertj-core - true - - - org.codehaus.btm - btm - true - - - javax.transaction - jta - - - - - org.codehaus.groovy - groovy - true - - - org.codehaus.groovy - groovy-xml - true - - - org.eclipse.jetty - jetty-servlets - true - - - org.eclipse.jetty - jetty-util - true - - - org.eclipse.jetty - jetty-webapp - true - - - org.eclipse.jetty - jetty-alpn-conscrypt-server - true - - - org.eclipse.jetty.http2 - http2-server - true - - - javax.servlet - javax.servlet-api - - - - - org.hamcrest - hamcrest - true - - - org.hibernate - hibernate-core - true - - - javax.activation - javax.activation-api - - - javax.persistence - javax.persistence-api - - - javax.xml.bind - jaxb-api - - - - - org.hibernate.validator - hibernate-validator - true - - - javax.validation - validation-api - - - - - org.jboss - jboss-transaction-spi - true - - - org.liquibase - liquibase-core - true - - - org.neo4j - neo4j-ogm-core - true - - - org.slf4j - jul-to-slf4j - true - - - org.slf4j - slf4j-api - true - - - org.springframework - spring-messaging - true - - - org.springframework - spring-orm - true - - - org.springframework - spring-oxm - true - - - org.springframework - spring-test - true - - - org.springframework - spring-web - true - - - org.springframework - spring-webflux - true - - - org.springframework - spring-webmvc - true - - - org.springframework.security - spring-security-web - true - - - org.springframework.ws - spring-ws-core - true - - - org.yaml - snakeyaml - true - - - org.jetbrains.kotlin - kotlin-reflect - true - - - org.jetbrains.kotlin - kotlin-stdlib - true - - - - org.springframework.boot - spring-boot-configuration-processor - true - - - - org.springframework.boot - spring-boot-test-support - test - - - com.google.appengine - appengine-api-1.0-sdk - test - - - com.h2database - h2 - test - - - com.ibm.db2 - jcc - test - - - com.jayway.jsonpath - json-path - test - - - com.microsoft.sqlserver - mssql-jdbc - test - - - com.squareup.okhttp3 - okhttp - test - - - com.sun.xml.messaging.saaj - saaj-impl - test - - - io.projectreactor - reactor-test - test - - - jakarta.persistence - jakarta.persistence-api - test - - - jakarta.xml.ws - jakarta.xml.ws-api - test - - - mysql - mysql-connector-java - test - - - net.sourceforge.jtds - jtds - test - - - org.apache.derby - derby - test - - - org.apache.httpcomponents - httpasyncclient - test - - - org.awaitility - awaitility - test - - - org.firebirdsql.jdbc - jaybird-jdk18 - test - - - javax.resource - connector-api - - - - - org.hsqldb - hsqldb - test - - - org.mariadb.jdbc - mariadb-java-client - test - - - org.mockito - mockito-core - test - - - org.postgresql - postgresql - test - - - org.springframework - spring-context-support - test - - - org.springframework.data - spring-data-redis - test - - - org.testcontainers - jdbc - test - - - javax.annotation - javax.annotation-api - - - javax.xml.bind - jaxb-api - - - - - org.xerial - sqlite-jdbc - test - - - - - - org.jetbrains.kotlin - kotlin-maven-plugin - - - compile - compile - - compile - - - - ${project.basedir}/src/main/kotlin - ${project.basedir}/src/main/java - - - - - test-compile - test-compile - - test-compile - - - - ${project.basedir}/src/test/kotlin - ${project.basedir}/src/test/java - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - default-compile - none - - - default-testCompile - none - - - java-compile - compile - - compile - - - - java-test-compile - test-compile - - testCompile - - - - - - - diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java index a90c97f64f..fdde9a62d6 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java @@ -747,7 +747,7 @@ class SpringApplicationTests { @Test void wildcardSources() { TestSpringApplication application = new TestSpringApplication(); - application.getSources().add("classpath:org/springframework/boot/sample-${sample.app.test.prop}.xml"); + application.getSources().add("classpath*:org/springframework/boot/sample-${sample.app.test.prop}.xml"); application.setWebApplicationType(WebApplicationType.NONE); this.context = application.run(); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java index e5a957e554..2a92a97bfc 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.EnumSet; import java.util.List; +import java.util.logging.Level; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.logging.log4j.LogManager; @@ -32,6 +33,7 @@ import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.Reconfigurable; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -187,10 +189,12 @@ class Log4J2LoggingSystemTests extends AbstractLoggingSystemTests { } @Test + @Disabled("Uses Logback unintentionally") void loggingThatUsesJulIsCaptured(CapturedOutput output) { this.loggingSystem.beforeInitialize(); this.loggingSystem.initialize(null, null, null); java.util.logging.Logger julLogger = java.util.logging.Logger.getLogger(getClass().getName()); + julLogger.setLevel(Level.INFO); julLogger.severe("Hello world"); assertThat(output).contains("Hello world"); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java index 7b69ffb6b7..dbf98c89b0 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java @@ -47,6 +47,7 @@ import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; import java.util.zip.GZIPInputStream; import javax.net.ssl.SSLContext; @@ -73,8 +74,10 @@ import org.apache.http.client.entity.InputStreamFactory; import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.client.StandardHttpRequestRetryHandler; import org.apache.http.protocol.HttpContext; import org.apache.http.ssl.SSLContextBuilder; import org.apache.http.ssl.TrustStrategy; @@ -149,6 +152,25 @@ public abstract class AbstractServletWebServerFactoryTests { private final HttpClientContext httpClientContext = HttpClientContext.create(); + private final Supplier httpClientBuilder = () -> HttpClients.custom() + .setRetryHandler(new StandardHttpRequestRetryHandler(10, false) { + + @Override + public boolean retryRequest(IOException exception, int executionCount, HttpContext context) { + boolean retry = super.retryRequest(exception, executionCount, context); + if (retry) { + try { + Thread.sleep(200); + } + catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + } + } + return retry; + } + + }); + @AfterEach void tearDown() { if (this.webServer != null) { @@ -159,6 +181,11 @@ public abstract class AbstractServletWebServerFactoryTests { // Ignore } } + if (ClassUtils.isPresent("org.apache.catalina.webresources.TomcatURLStreamHandlerFactory", + getClass().getClassLoader())) { + ReflectionTestUtils.setField(TomcatURLStreamHandlerFactory.class, "instance", null); + } + ReflectionTestUtils.setField(URL.class, "factory", null); } @AfterEach @@ -429,7 +456,7 @@ public abstract class AbstractServletWebServerFactoryTests { this.webServer.start(); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build()); - HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build(); + HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory).build(); ClientHttpResponse response = getClientResponse(getLocalUrl("https", "/hello"), HttpMethod.GET, new HttpComponentsClientHttpRequestFactory(httpClient)); assertThat(response.getHeaders().get("Server")).isNullOrEmpty(); @@ -444,7 +471,8 @@ public abstract class AbstractServletWebServerFactoryTests { this.webServer.start(); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build()); - HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build(); + HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory) + .setRetryHandler(new DefaultHttpRequestRetryHandler(10, false)).build(); ClientHttpResponse response = getClientResponse(getLocalUrl("https", "/hello"), HttpMethod.GET, new HttpComponentsClientHttpRequestFactory(httpClient)); assertThat(response.getHeaders().get("Server")).containsExactly("MyServer"); @@ -458,7 +486,7 @@ public abstract class AbstractServletWebServerFactoryTests { this.webServer.start(); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build()); - HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build(); + HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory).build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); assertThat(getResponse(getLocalUrl("https", "/test.txt"), requestFactory)).isEqualTo("test"); } @@ -475,7 +503,7 @@ public abstract class AbstractServletWebServerFactoryTests { SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()) .loadKeyMaterial(keyStore, "secret".toCharArray()).build()); - HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build(); + HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory).build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); assertThat(getResponse(getLocalUrl("https", "/test.txt"), requestFactory)).isEqualTo("test"); } @@ -492,7 +520,7 @@ public abstract class AbstractServletWebServerFactoryTests { SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()) .loadKeyMaterial(keyStore, "password".toCharArray()).build()); - HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build(); + HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory).build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); assertThat(getResponse(getLocalUrl("https", "/test.txt"), requestFactory)).isEqualTo("test"); } @@ -506,7 +534,7 @@ public abstract class AbstractServletWebServerFactoryTests { this.webServer.start(); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build()); - HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build(); + HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory).build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); String localUrl = getLocalUrl("https", "/test.txt"); assertThatIOException().isThrownBy(() -> getResponse(localUrl, requestFactory)); @@ -525,7 +553,7 @@ public abstract class AbstractServletWebServerFactoryTests { SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()) .loadKeyMaterial(keyStore, "password".toCharArray()).build()); - HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build(); + HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory).build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); assertThat(getResponse(getLocalUrl("https", "/test.txt"), requestFactory)).isEqualTo("test"); } @@ -539,7 +567,7 @@ public abstract class AbstractServletWebServerFactoryTests { this.webServer.start(); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build()); - HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build(); + HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory).build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); assertThat(getResponse(getLocalUrl("https", "/test.txt"), requestFactory)).isEqualTo("test"); } @@ -563,7 +591,7 @@ public abstract class AbstractServletWebServerFactoryTests { SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()) .loadKeyMaterial(keyStore, "password".toCharArray()).build()); - HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build(); + HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory).build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); assertThat(getResponse(getLocalUrl("https", "/test.txt"), requestFactory)).isEqualTo("test"); verify(sslStoreProvider, atLeastOnce()).getKeyStore(); @@ -637,7 +665,7 @@ public abstract class AbstractServletWebServerFactoryTests { this.webServer.start(); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build()); - HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build(); + HttpClient httpClient = this.httpClientBuilder.get().setSSLSocketFactory(socketFactory).build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); assertThat(getResponse(getLocalUrl("https", "/hello"), requestFactory)).contains("scheme=https"); } @@ -784,7 +812,7 @@ public abstract class AbstractServletWebServerFactoryTests { TestGzipInputStreamFactory inputStreamFactory = new TestGzipInputStreamFactory(); Map contentDecoderMap = Collections.singletonMap("gzip", inputStreamFactory); getResponse(getLocalUrl("/hello"), new HttpComponentsClientHttpRequestFactory( - HttpClientBuilder.create().setContentDecoderRegistry(contentDecoderMap).build())); + this.httpClientBuilder.get().setContentDecoderRegistry(contentDecoderMap).build())); assertThat(inputStreamFactory.wasCompressionUsed()).isTrue(); } @@ -1078,14 +1106,15 @@ public abstract class AbstractServletWebServerFactoryTests { protected ClientHttpResponse getClientResponse(String url, HttpMethod method, String... headers) throws IOException, URISyntaxException { - return getClientResponse(url, method, new HttpComponentsClientHttpRequestFactory() { + return getClientResponse(url, method, + new HttpComponentsClientHttpRequestFactory(this.httpClientBuilder.get().build()) { - @Override - protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) { - return AbstractServletWebServerFactoryTests.this.httpClientContext; - } + @Override + protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) { + return AbstractServletWebServerFactoryTests.this.httpClientContext; + } - }, headers); + }, headers); } protected ClientHttpResponse getClientResponse(String url, HttpMethod method, diff --git a/spring-boot-tests/pom.xml b/spring-boot-tests/pom.xml deleted file mode 100644 index fc79c4ae82..0000000000 --- a/spring-boot-tests/pom.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-parent - ${revision} - ../spring-boot-project/spring-boot-parent - - spring-boot-tests - pom - Spring Boot Tests - Spring Boot Test - - ${basedir}/.. - - - - spring-boot-smoke-tests-invoker - spring-boot-integration-tests - - - - - m2e - - - m2e.version - - - - spring-boot-smoke-tests - spring-boot-smoke-tests-invoker - spring-boot-integration-tests - spring-boot-deployment-tests - - - - - - - org.apache.maven.plugins - maven-install-plugin - - true - - - - org.apache.maven.plugins - maven-javadoc-plugin - - true - - true - - - - diff --git a/spring-boot-tests/spring-boot-deployment-tests/build.gradle b/spring-boot-tests/spring-boot-deployment-tests/build.gradle new file mode 100644 index 0000000000..942627d5fa --- /dev/null +++ b/spring-boot-tests/spring-boot-deployment-tests/build.gradle @@ -0,0 +1,28 @@ +plugins { + id 'war' + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.integration-test' +} + +description = "Spring Boot Deployment Tests" + +dependencies { + implementation(project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web')) { + exclude group: 'org.hibernate.validator' + } + + intTestImplementation enforcedPlatform(project(path: ":spring-boot-project:spring-boot-parent")) + intTestImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + intTestImplementation 'org.apache.httpcomponents:httpasyncclient' + intTestImplementation 'org.awaitility:awaitility' + intTestImplementation 'org.testcontainers:testcontainers' + intTestImplementation 'org.springframework:spring-web' + + providedRuntime project(':spring-boot-project:spring-boot-starters:spring-boot-starter-tomcat') + + runtimeOnly project(':spring-boot-project:spring-boot-starters:spring-boot-starter-actuator') +} + +intTest { + dependsOn war +} \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-deployment-tests/pom.xml b/spring-boot-tests/spring-boot-deployment-tests/pom.xml deleted file mode 100644 index 75d26a05f2..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/pom.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-tests - ${revision} - - spring-boot-deployment-tests - pom - Spring Boot Deployment Tests - Spring Boot Deployment Tests - - ${basedir}/../.. - 1.8 - 1200000 - ${settings.localRepository}/.cache/cargo/installs - - - spring-boot-deployment-test-glassfish - spring-boot-deployment-test-tomee - spring-boot-deployment-test-tomcat - spring-boot-deployment-test-wildfly - spring-boot-deployment-test-wlp - - - - - - org.codehaus.cargo - cargo-maven2-plugin - - - ${cargo.container.id} - ${cargo.timeout} - - ${cargo.container.url} - ${cargo.container.download-dir} - - - true - true - - - - - - /bootapp - - http://localhost:${appserver.port}/bootapp - 60000 - - - - - - start-cargo - pre-integration-test - - start - - - - stop-cargo - post-integration-test - - stop - - - - - - - - - org.apache.maven.plugins - maven-install-plugin - - true - - - - - diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-glassfish/pom.xml b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-glassfish/pom.xml deleted file mode 100644 index 3d2fad57a2..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-glassfish/pom.xml +++ /dev/null @@ -1,117 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-deployment-tests - ${revision} - - spring-boot-deployment-test-glassfish - war - Spring Boot Glassfish Deployment Test - Spring Boot Glassfish Deployment Test - - ${basedir}/../../.. - 4.1.1 - glassfish4x - https://download.oracle.com/glassfish/${glassfish.version}/release/glassfish-${glassfish.version}.zip - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - org.hibernate.validator - hibernate-validator - - - - - org.springframework.boot - spring-boot-starter-actuator - - - jakarta.servlet - jakarta.servlet-api - provided - - - org.springframework.boot - spring-boot-starter-test - test - - - - - jdk8 - - 1.8 - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - reserve-network-port - - reserve-network-port - - process-resources - - - appserver.port - appserver.admin.port - appserver.jms.port - appserver.iiop.port - appserver.https.port - appserver.iiops.port - appserver.iiopmutualauth.port - appserver.jmx.port - appserver.osgishell.port - appserver.debugger.port - - - - - - - org.codehaus.cargo - cargo-maven2-plugin - - - - ${appserver.port} - ${appserver.admin.port} - ${appserver.jmx.port} - ${appserver.https.port} - ${appserver.debugger.port} - ${appserver.jms.port} - ${appserver.iiop.port} - ${appserver.iiopmutualauth.port} - ${appserver.iiops.port} - ${appserver.osgishell.port} - - - - - - org.apache.maven.plugins - maven-failsafe-plugin - - - ${appserver.port} - - - - - - - - diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-glassfish/src/main/java/sample/SampleGlassfishDeployApplication.java b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-glassfish/src/main/java/sample/SampleGlassfishDeployApplication.java deleted file mode 100644 index b37ed0d48e..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-glassfish/src/main/java/sample/SampleGlassfishDeployApplication.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2012-2019 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 sample; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; - -@SpringBootApplication -public class SampleGlassfishDeployApplication extends SpringBootServletInitializer { - -} diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-glassfish/src/main/webapp/WEB-INF/glassfish-web.xml b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-glassfish/src/main/webapp/WEB-INF/glassfish-web.xml deleted file mode 100644 index 4ff13ba3c2..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-glassfish/src/main/webapp/WEB-INF/glassfish-web.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-glassfish/src/test/java/sample/SampleGlassfishDeployApplicationIT.java b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-glassfish/src/test/java/sample/SampleGlassfishDeployApplicationIT.java deleted file mode 100644 index 491b5d505a..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-glassfish/src/test/java/sample/SampleGlassfishDeployApplicationIT.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2012-2019 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 sample; - -import org.junit.jupiter.api.Test; - -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Integration Tests for {@link SampleGlassfishDeployApplication}. - */ -public class SampleGlassfishDeployApplicationIT { - - private int port = Integer.valueOf(System.getProperty("port")); - - @Test - void testHome() throws Exception { - String url = "http://localhost:" + this.port + "/bootapp/"; - System.out.println(url); - ResponseEntity entity = new TestRestTemplate().getForEntity(url, String.class); - assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(entity.getBody()).isEqualTo("Hello World"); - } - - @Test - void testHealth() throws Exception { - String url = "http://localhost:" + this.port + "/bootapp/actuator/health"; - System.out.println(url); - ResponseEntity entity = new TestRestTemplate().getForEntity(url, String.class); - assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(entity.getBody()).isEqualTo("{\"status\":\"UP\"}"); - } - -} diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/pom.xml b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/pom.xml deleted file mode 100644 index 2039e27f02..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/pom.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-deployment-tests - ${revision} - - spring-boot-deployment-test-tomcat - war - Spring Boot Tomcat Deployment Test - Spring Boot Tomcat Deployment Test - - ${basedir}/../../.. - tomcat9x - - https://repo.maven.apache.org/maven2/org/apache/tomcat/tomcat/${tomcat.version}/tomcat-${tomcat.version}.zip - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - org.springframework.boot - spring-boot-starter-actuator - - - jakarta.servlet - jakarta.servlet-api - provided - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - reserve-network-port - - reserve-network-port - - process-resources - - - appserver.port - appserver.ajp.port - - - - - - - org.codehaus.cargo - cargo-maven2-plugin - - - - ${appserver.port} - ${appserver.ajp.port} - - - - - - org.apache.maven.plugins - maven-failsafe-plugin - - - ${appserver.port} - - - - - - diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/src/main/java/sample/SampleController.java b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/src/main/java/sample/SampleController.java deleted file mode 100644 index 7023f3b990..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/src/main/java/sample/SampleController.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2012-2019 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 sample; - -import java.io.IOException; - -import javax.servlet.http.HttpServletResponse; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class SampleController { - - @RequestMapping("/") - public String hello() { - return "Hello World"; - } - - @RequestMapping("/send-error") - public void sendError(HttpServletResponse response) throws IOException { - response.sendError(500); - } - - @RequestMapping("/exception") - public void exception() { - throw new RuntimeException(); - } - -} diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/src/main/java/sample/SampleTomcatDeployApplication.java b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/src/main/java/sample/SampleTomcatDeployApplication.java deleted file mode 100644 index 42a0fc03b8..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/src/main/java/sample/SampleTomcatDeployApplication.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2012-2019 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 sample; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; - -@SpringBootApplication -public class SampleTomcatDeployApplication extends SpringBootServletInitializer { - -} diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/src/test/java/sample/SampleTomcatDeployApplicationIT.java b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/src/test/java/sample/SampleTomcatDeployApplicationIT.java deleted file mode 100644 index a4c9f14410..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/src/test/java/sample/SampleTomcatDeployApplicationIT.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2012-2019 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 sample; - -import java.net.URI; - -import org.junit.jupiter.api.Test; - -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.RequestEntity; -import org.springframework.http.ResponseEntity; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Integration Tests for {@link SampleTomcatDeployApplication}. - */ -public class SampleTomcatDeployApplicationIT { - - private final TestRestTemplate rest = new TestRestTemplate(); - - private int port = Integer.valueOf(System.getProperty("port")); - - @Test - void testHome() throws Exception { - String url = "http://localhost:" + this.port + "/bootapp/"; - ResponseEntity entity = this.rest.getForEntity(url, String.class); - assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(entity.getBody()).isEqualTo("Hello World"); - } - - @Test - void testHealth() throws Exception { - String url = "http://localhost:" + this.port + "/bootapp/actuator/health"; - System.out.println(url); - ResponseEntity entity = new TestRestTemplate().getForEntity(url, String.class); - assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(entity.getBody()).isEqualTo("{\"status\":\"UP\"}"); - } - - @Test - void errorFromExceptionForRequestAcceptingAnythingProducesAJsonResponse() throws Exception { - assertThatPathProducesExpectedResponse("/bootapp/exception", MediaType.ALL, MediaType.APPLICATION_JSON); - } - - @Test - void errorFromExceptionForRequestAcceptingJsonProducesAJsonResponse() throws Exception { - assertThatPathProducesExpectedResponse("/bootapp/exception", MediaType.APPLICATION_JSON, - MediaType.APPLICATION_JSON); - } - - @Test - void errorFromExceptionForRequestAcceptingHtmlProducesAnHtmlResponse() throws Exception { - assertThatPathProducesExpectedResponse("/bootapp/exception", MediaType.TEXT_HTML, MediaType.TEXT_HTML); - } - - @Test - void sendErrorForRequestAcceptingAnythingProducesAJsonResponse() throws Exception { - assertThatPathProducesExpectedResponse("/bootapp/send-error", MediaType.ALL, MediaType.APPLICATION_JSON); - } - - @Test - void sendErrorForRequestAcceptingJsonProducesAJsonResponse() throws Exception { - assertThatPathProducesExpectedResponse("/bootapp/send-error", MediaType.APPLICATION_JSON, - MediaType.APPLICATION_JSON); - } - - @Test - void sendErrorForRequestAcceptingHtmlProducesAnHtmlResponse() throws Exception { - assertThatPathProducesExpectedResponse("/bootapp/send-error", MediaType.TEXT_HTML, MediaType.TEXT_HTML); - } - - private void assertThatPathProducesExpectedResponse(String path, MediaType accept, MediaType contentType) { - RequestEntity request = RequestEntity.get(URI.create("http://localhost:" + this.port + path)) - .accept(accept).build(); - ResponseEntity response = this.rest.exchange(request, String.class); - assertThat(response.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); - assertThat(contentType.isCompatibleWith(response.getHeaders().getContentType())) - .as("%s is compatible with %s", contentType, response.getHeaders().getContentType()).isTrue(); - } - -} diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomee/pom.xml b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomee/pom.xml deleted file mode 100644 index f06085fd1c..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomee/pom.xml +++ /dev/null @@ -1,103 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-deployment-tests - ${revision} - - spring-boot-deployment-test-tomee - war - Spring Boot TomEE Deployment Test - Spring Boot TomEE Deployment Test - - ${basedir}/../../.. - 8.0.0 - tomee1x - - https://archive.apache.org/dist/tomee/tomee-${tomee.version}/apache-tomee-${tomee.version}-webprofile.zip - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - org.hibernate.validator - hibernate-validator - - - - - org.springframework.boot - spring-boot-starter-actuator - - - jakarta.servlet - jakarta.servlet-api - provided - - - org.springframework.boot - spring-boot-starter-test - test - - - - - jdk8 - - 1.8 - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - reserve-network-port - - reserve-network-port - - process-resources - - - appserver.port - appserver.ajp.port - - - - - - - org.codehaus.cargo - cargo-maven2-plugin - - - - ${appserver.port} - ${appserver.ajp.port} - - - - - - org.apache.maven.plugins - maven-failsafe-plugin - - - ${appserver.port} - - - - - - - - diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomee/src/main/java/sample/SampleController.java b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomee/src/main/java/sample/SampleController.java deleted file mode 100644 index 819f68150b..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomee/src/main/java/sample/SampleController.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2012-2019 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 sample; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class SampleController { - - @GetMapping("/") - public String hello() { - return "Hello World"; - } - -} diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomee/src/main/java/sample/SampleTomEEDeployApplication.java b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomee/src/main/java/sample/SampleTomEEDeployApplication.java deleted file mode 100644 index d9aee11660..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomee/src/main/java/sample/SampleTomEEDeployApplication.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2012-2019 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 sample; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; - -@SpringBootApplication -public class SampleTomEEDeployApplication extends SpringBootServletInitializer { - - @Override - protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { - return application.sources(SampleTomEEDeployApplication.class); - } - -} diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomee/src/test/java/sample/SampleTomEEDeployApplicationIT.java b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomee/src/test/java/sample/SampleTomEEDeployApplicationIT.java deleted file mode 100644 index cb9acd56c6..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-tomee/src/test/java/sample/SampleTomEEDeployApplicationIT.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2012-2019 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 sample; - -import org.junit.jupiter.api.Test; - -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Integration Tests for {@link SampleTomEEDeployApplication}. - */ -public class SampleTomEEDeployApplicationIT { - - private int port = Integer.valueOf(System.getProperty("port")); - - @Test - void testHome() throws Exception { - String url = "http://localhost:" + this.port + "/bootapp/"; - ResponseEntity entity = new TestRestTemplate().getForEntity(url, String.class); - assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(entity.getBody()).isEqualTo("Hello World"); - } - - @Test - void testHealth() throws Exception { - String url = "http://localhost:" + this.port + "/bootapp/actuator/health"; - System.out.println(url); - ResponseEntity entity = new TestRestTemplate().getForEntity(url, String.class); - assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(entity.getBody()).isEqualTo("{\"status\":\"UP\"}"); - } - -} diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wildfly/pom.xml b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wildfly/pom.xml deleted file mode 100644 index cb572e6c5c..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wildfly/pom.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-deployment-tests - ${revision} - - spring-boot-deployment-test-wildfly - war - Spring Boot WildFly Deployment Test - Spring Boot WildFly Deployment Test - - ${basedir}/../../.. - 12.0.0.Final - wildfly12x - https://download.jboss.org/wildfly/${wildfly.version}/wildfly-${wildfly.version}.zip - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - org.springframework.boot - spring-boot-starter-actuator - - - jakarta.servlet - jakarta.servlet-api - provided - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - reserve-network-port - - reserve-network-port - - process-resources - - - appserver.port - appserver.ajp.port - appserver.transaction.port - - - - - - - org.codehaus.cargo - cargo-maven2-plugin - - - - ${appserver.port} - ${appserver.ajp.port} - - ${appserver.transaction.port} - - standalone-full - - - - - - org.apache.maven.plugins - maven-failsafe-plugin - - - ${appserver.port} - - - - - - diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wildfly/src/main/java/sample/SampleController.java b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wildfly/src/main/java/sample/SampleController.java deleted file mode 100644 index 819f68150b..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wildfly/src/main/java/sample/SampleController.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2012-2019 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 sample; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class SampleController { - - @GetMapping("/") - public String hello() { - return "Hello World"; - } - -} diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wildfly/src/main/java/sample/SampleWildFlyDeployApplication.java b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wildfly/src/main/java/sample/SampleWildFlyDeployApplication.java deleted file mode 100644 index 3385e2d348..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wildfly/src/main/java/sample/SampleWildFlyDeployApplication.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2012-2019 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 sample; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; - -@SpringBootApplication -public class SampleWildFlyDeployApplication extends SpringBootServletInitializer { - -} diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wildfly/src/main/webapp/WEB-INF/jboss-deployment-structure.xml b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wildfly/src/main/webapp/WEB-INF/jboss-deployment-structure.xml deleted file mode 100644 index 5e5bd73881..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wildfly/src/main/webapp/WEB-INF/jboss-deployment-structure.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wildfly/src/test/java/sample/SampleWildFlyDeployApplicationIT.java b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wildfly/src/test/java/sample/SampleWildFlyDeployApplicationIT.java deleted file mode 100644 index 001ffe6f5b..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wildfly/src/test/java/sample/SampleWildFlyDeployApplicationIT.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2012-2019 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 sample; - -import org.junit.jupiter.api.Test; - -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Integration Tests for {@link SampleWildFlyDeployApplication}. - */ -public class SampleWildFlyDeployApplicationIT { - - private int port = Integer.valueOf(System.getProperty("port")); - - @Test - void testHome() throws Exception { - String url = "http://localhost:" + this.port + "/bootapp/"; - ResponseEntity entity = new TestRestTemplate().getForEntity(url, String.class); - assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(entity.getBody()).isEqualTo("Hello World"); - } - - @Test - void testHealth() throws Exception { - String url = "http://localhost:" + this.port + "/bootapp/actuator/health"; - System.out.println(url); - ResponseEntity entity = new TestRestTemplate().getForEntity(url, String.class); - assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(entity.getBody()).isEqualTo("{\"status\":\"UP\"}"); - } - -} diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wlp/pom.xml b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wlp/pom.xml deleted file mode 100644 index b8b7ca8706..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wlp/pom.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-deployment-tests - ${revision} - - spring-boot-deployment-test-wlp - war - Spring Boot WebSphere Liberty Profile Deployment Test - Spring Boot WebSphere Liberty Profile Deployment Test - - ${basedir}/../../.. - 18.0.0.1 - liberty - https://repo.maven.apache.org/maven2/com/ibm/websphere/appserver/runtime/wlp-webProfile7/${wlp.version}/wlp-webProfile7-${wlp.version}.zip - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - org.springframework.boot - spring-boot-starter-actuator - - - jakarta.servlet - jakarta.servlet-api - provided - - - org.springframework.boot - spring-boot-starter-test - test - - - - - jdk8 - - 1.8 - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - reserve-network-port - - reserve-network-port - - process-resources - - - appserver.port - - - - - - - org.codehaus.cargo - cargo-maven2-plugin - - - - ${appserver.port} - - - - - - org.apache.maven.plugins - maven-failsafe-plugin - - - ${appserver.port} - - - - - - - - diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wlp/src/main/java/sample/SampleController.java b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wlp/src/main/java/sample/SampleController.java deleted file mode 100644 index 819f68150b..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wlp/src/main/java/sample/SampleController.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2012-2019 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 sample; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class SampleController { - - @GetMapping("/") - public String hello() { - return "Hello World"; - } - -} diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wlp/src/main/java/sample/SampleWlpDeployApplication.java b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wlp/src/main/java/sample/SampleWlpDeployApplication.java deleted file mode 100644 index e1cda220c3..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wlp/src/main/java/sample/SampleWlpDeployApplication.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2012-2019 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 sample; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; - -@SpringBootApplication -public class SampleWlpDeployApplication extends SpringBootServletInitializer { - -} diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wlp/src/test/java/sample/SampleWlpDeployApplicationIT.java b/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wlp/src/test/java/sample/SampleWlpDeployApplicationIT.java deleted file mode 100644 index 64b2ca4847..0000000000 --- a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-wlp/src/test/java/sample/SampleWlpDeployApplicationIT.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2012-2019 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 sample; - -import org.junit.jupiter.api.Test; - -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Integration Tests for {@link SampleWlpDeployApplication}. - */ -public class SampleWlpDeployApplicationIT { - - private int port = Integer.valueOf(System.getProperty("port")); - - @Test - void testHome() throws Exception { - String url = "http://localhost:" + this.port + "/bootapp/"; - ResponseEntity entity = new TestRestTemplate().getForEntity(url, String.class); - assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(entity.getBody()).isEqualTo("Hello World"); - } - - @Test - void testHealth() throws Exception { - String url = "http://localhost:" + this.port + "/bootapp/actuator/health"; - System.out.println(url); - ResponseEntity entity = new TestRestTemplate().getForEntity(url, String.class); - assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(entity.getBody()).isEqualTo("{\"status\":\"UP\"}"); - } - -} diff --git a/spring-boot-tests/spring-boot-deployment-tests/src/intTest/java/sample/DeploymentIntegrationTests.java b/spring-boot-tests/spring-boot-deployment-tests/src/intTest/java/sample/DeploymentIntegrationTests.java new file mode 100644 index 0000000000..3e892569f4 --- /dev/null +++ b/spring-boot-tests/spring-boot-deployment-tests/src/intTest/java/sample/DeploymentIntegrationTests.java @@ -0,0 +1,139 @@ +/* + * Copyright 2012-2019 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 sample; + +import java.io.File; +import java.time.Duration; +import java.util.Arrays; +import java.util.List; +import java.util.function.Consumer; + +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.client.StandardHttpRequestRetryHandler; +import org.awaitility.Awaitility; +import org.awaitility.core.ConditionTimeoutException; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.images.builder.ImageFromDockerfile; + +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Deployment integration tests. + */ +class DeploymentIntegrationTests { + + @ParameterizedTest + @MethodSource("deployedApplications") + void home(DeployedApplication app) throws Exception { + app.test((rest) -> { + ResponseEntity response = rest.getForEntity("/", String.class); + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(response.getBody()).isEqualTo("Hello World"); + }); + } + + @ParameterizedTest + @MethodSource("deployedApplications") + void health(DeployedApplication application) throws Exception { + application.test((rest) -> { + ResponseEntity response = rest.getForEntity("/actuator/health", String.class); + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(response.getBody()).isEqualTo("{\"status\":\"UP\"}"); + }); + } + + static List deployedApplications() { + return Arrays.asList(new DeployedApplication("open-liberty:19.0.0.9-webProfile8", "/config/dropins", 9080), + new DeployedApplication("tomcat:9.0.29-jdk8-openjdk", "/usr/local/tomcat/webapps", 8080), + new DeployedApplication("tomee:11-jre-8.0.0-M3-webprofile", "/usr/local/tomee/webapps", 8080), + new DeployedApplication("jboss/wildfly:18.0.1.Final", "/opt/jboss/wildfly/standalone/deployments/", + 8080)); + } + + public static final class DeployedApplication { + + private final String baseImage; + + private final String deploymentLocation; + + private final int port; + + private DeployedApplication(String baseImage, String deploymentLocation, int port) { + this.baseImage = baseImage; + this.deploymentLocation = deploymentLocation; + this.port = port; + } + + private void test(Consumer consumer) { + try (WarDeploymentContainer container = new WarDeploymentContainer(this.baseImage, this.deploymentLocation, + this.port)) { + container.start(); + TestRestTemplate rest = new TestRestTemplate(new RestTemplateBuilder() + .rootUri("http://" + container.getContainerIpAddress() + ":" + + container.getMappedPort(this.port) + "/spring-boot") + .requestFactory(() -> new HttpComponentsClientHttpRequestFactory(HttpClients.custom() + .setRetryHandler(new StandardHttpRequestRetryHandler(10, false)).build()))); + try { + Awaitility.await().atMost(Duration.ofMinutes(10)).until(() -> { + try { + consumer.accept(rest); + return true; + } + catch (Throwable ex) { + return false; + } + }); + } + catch (ConditionTimeoutException ex) { + System.out.println(container.getLogs()); + throw ex; + } + } + } + + public String toString() { + return this.baseImage; + } + + } + + private static final class WarDeploymentContainer extends GenericContainer { + + private WarDeploymentContainer(String baseImage, String deploymentLocation, int port) { + super(new ImageFromDockerfile().withFileFromFile("spring-boot.war", findWarToDeploy()) + .withDockerfileFromBuilder((builder) -> builder.from(baseImage) + .add("spring-boot.war", deploymentLocation + "/spring-boot.war").build())); + withExposedPorts(port).withStartupTimeout(Duration.ofMinutes(10)); + } + + private static File findWarToDeploy() { + File[] candidates = new File("build/libs").listFiles(); + assertThat(candidates).hasSize(1); + return candidates[0]; + } + + } + +} diff --git a/spring-boot-tests/spring-boot-deployment-tests/src/main/java/sample/DeploymentTestApplication.java b/spring-boot-tests/spring-boot-deployment-tests/src/main/java/sample/DeploymentTestApplication.java new file mode 100644 index 0000000000..38c310428b --- /dev/null +++ b/spring-boot-tests/spring-boot-deployment-tests/src/main/java/sample/DeploymentTestApplication.java @@ -0,0 +1,25 @@ +/* + * Copyright 2012-2019 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 sample; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +@SpringBootApplication +public class DeploymentTestApplication extends SpringBootServletInitializer { + +} diff --git a/spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-glassfish/src/main/java/sample/SampleController.java b/spring-boot-tests/spring-boot-deployment-tests/src/main/java/sample/SampleController.java similarity index 100% rename from spring-boot-tests/spring-boot-deployment-tests/spring-boot-deployment-test-glassfish/src/main/java/sample/SampleController.java rename to spring-boot-tests/spring-boot-deployment-tests/src/main/java/sample/SampleController.java diff --git a/spring-boot-tests/spring-boot-integration-tests/pom.xml b/spring-boot-tests/spring-boot-integration-tests/pom.xml deleted file mode 100644 index 16c814635a..0000000000 --- a/spring-boot-tests/spring-boot-integration-tests/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-tests - ${revision} - - spring-boot-integration-tests - pom - Spring Boot Integration Tests - Spring Boot Integration Tests - - ${basedir}/../.. - 1.8 - - - spring-boot-configuration-processor-tests - spring-boot-devtools-tests - spring-boot-server-tests - spring-boot-launch-script-tests - - - - - org.apache.maven.plugins - maven-install-plugin - - true - - - - - diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-configuration-processor-tests/build.gradle b/spring-boot-tests/spring-boot-integration-tests/spring-boot-configuration-processor-tests/build.gradle new file mode 100644 index 0000000000..92038132c0 --- /dev/null +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-configuration-processor-tests/build.gradle @@ -0,0 +1,17 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = "Spring Boot Configuration Processor Tests" + +dependencies { + annotationProcessor project(':spring-boot-project:spring-boot-tools:spring-boot-configuration-processor') + + implementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + implementation project(':spring-boot-project:spring-boot') + implementation 'jakarta.validation:jakarta.validation-api' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-configuration-metadata') +} \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-configuration-processor-tests/pom.xml b/spring-boot-tests/spring-boot-integration-tests/spring-boot-configuration-processor-tests/pom.xml deleted file mode 100644 index 8b8d7363d2..0000000000 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-configuration-processor-tests/pom.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-integration-tests - ${revision} - - spring-boot-configuration-processor-tests - Spring Boot Configuration Processor Tests - ${project.name} - - ${basedir}/../../.. - - - - org.springframework.boot - spring-boot - - - org.springframework.boot - spring-boot-configuration-metadata - - - jakarta.validation - jakarta.validation-api - - - org.springframework.boot - spring-boot-configuration-processor - true - - - org.springframework.boot - spring-boot-starter-test - test - - - diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/pom.xml b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/pom.xml deleted file mode 100644 index 1eae491ae0..0000000000 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/pom.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-integration-tests - ${revision} - - spring-boot-devtools-tests - Spring Boot DevTools Tests - ${project.name} - - ${basedir}/../../.. - - - - org.springframework.boot - spring-boot-devtools - - - org.springframework.boot - spring-boot-starter-web - - - net.bytebuddy - byte-buddy - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.boot - spring-boot-test-support - test - - - org.awaitility - awaitility - test - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - process-test-resources - - copy-dependencies - - - runtime - ${project.build.directory}/dependencies - true - true - - - - - - - diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/AbstractDevToolsIntegrationTests.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/AbstractDevToolsIntegrationTests.java deleted file mode 100644 index 4c816949a4..0000000000 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/AbstractDevToolsIntegrationTests.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.devtools.tests; - -import java.io.File; -import java.time.Duration; -import java.util.ArrayList; -import java.util.List; - -import net.bytebuddy.ByteBuddy; -import net.bytebuddy.description.annotation.AnnotationDescription; -import net.bytebuddy.description.modifier.Visibility; -import net.bytebuddy.dynamic.DynamicType; -import net.bytebuddy.implementation.FixedValue; -import org.awaitility.Awaitility; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.junit.jupiter.api.io.TempDir; - -import org.springframework.boot.testsupport.BuildOutput; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * Base class for DevTools integration tests. - * - * @author Andy Wilkinson - */ -abstract class AbstractDevToolsIntegrationTests { - - protected static final BuildOutput buildOutput = new BuildOutput(AbstractDevToolsIntegrationTests.class); - - protected final File serverPortFile = new File(buildOutput.getRootLocation(), "server.port"); - - @RegisterExtension - protected final JvmLauncher javaLauncher = new JvmLauncher(); - - @TempDir - protected static File temp; - - protected LaunchedApplication launchedApplication; - - protected void launchApplication(ApplicationLauncher applicationLauncher, String... args) throws Exception { - this.serverPortFile.delete(); - this.launchedApplication = applicationLauncher.launchApplication(this.javaLauncher, this.serverPortFile, args); - } - - @AfterEach - void stopApplication() throws InterruptedException { - this.launchedApplication.stop(); - } - - protected int awaitServerPort() throws Exception { - int port = Awaitility.waitAtMost(Duration.ofSeconds(30)) - .until(() -> new ApplicationState(this.serverPortFile, this.launchedApplication), - ApplicationState::hasServerPort) - .getServerPort(); - this.serverPortFile.delete(); - System.out.println("Got port " + port); - this.launchedApplication.restartRemote(port); - Thread.sleep(1000); - return port; - } - - protected ControllerBuilder controller(String name) { - return new ControllerBuilder(name, this.launchedApplication.getClassesDirectory()); - } - - protected static final class ControllerBuilder { - - private final List mappings = new ArrayList<>(); - - private final String name; - - private final File classesDirectory; - - protected ControllerBuilder(String name, File classesDirectory) { - this.name = name; - this.classesDirectory = classesDirectory; - } - - protected ControllerBuilder withRequestMapping(String mapping) { - this.mappings.add(mapping); - return this; - } - - protected void build() throws Exception { - DynamicType.Builder builder = new ByteBuddy().subclass(Object.class).name(this.name) - .annotateType(AnnotationDescription.Builder.ofType(RestController.class).build()); - for (String mapping : this.mappings) { - builder = builder.defineMethod(mapping, String.class, Visibility.PUBLIC) - .intercept(FixedValue.value(mapping)).annotateMethod(AnnotationDescription.Builder - .ofType(RequestMapping.class).defineArray("value", mapping).build()); - } - builder.make().saveIn(this.classesDirectory); - } - - } - -} diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/DevToolsIntegrationTests.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/DevToolsIntegrationTests.java deleted file mode 100644 index 3bad93d99d..0000000000 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-devtools-tests/src/test/java/org/springframework/boot/devtools/tests/DevToolsIntegrationTests.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.devtools.tests; - -import java.io.File; -import java.io.IOException; - -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; - -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.http.HttpStatus; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Integration tests for DevTools. - * - * @author Andy Wilkinson - */ -class DevToolsIntegrationTests extends AbstractDevToolsIntegrationTests { - - @ParameterizedTest(name = "{0}") - @MethodSource("parameters") - void addARequestMappingToAnExistingController(ApplicationLauncher applicationLauncher) throws Exception { - launchApplication(applicationLauncher); - TestRestTemplate template = new TestRestTemplate(); - String urlBase = "http://localhost:" + awaitServerPort(); - assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); - assertThat(template.getForEntity(urlBase + "/two", String.class).getStatusCode()) - .isEqualTo(HttpStatus.NOT_FOUND); - controller("com.example.ControllerOne").withRequestMapping("one").withRequestMapping("two").build(); - urlBase = "http://localhost:" + awaitServerPort(); - assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); - assertThat(template.getForObject(urlBase + "/two", String.class)).isEqualTo("two"); - } - - @ParameterizedTest(name = "{0}") - @MethodSource("parameters") - void removeARequestMappingFromAnExistingController(ApplicationLauncher applicationLauncher) throws Exception { - launchApplication(applicationLauncher); - TestRestTemplate template = new TestRestTemplate(); - String urlBase = "http://localhost:" + awaitServerPort(); - assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); - controller("com.example.ControllerOne").build(); - urlBase = "http://localhost:" + awaitServerPort(); - assertThat(template.getForEntity(urlBase + "/one", String.class).getStatusCode()) - .isEqualTo(HttpStatus.NOT_FOUND); - } - - @ParameterizedTest(name = "{0}") - @MethodSource("parameters") - void createAController(ApplicationLauncher applicationLauncher) throws Exception { - launchApplication(applicationLauncher); - TestRestTemplate template = new TestRestTemplate(); - String urlBase = "http://localhost:" + awaitServerPort(); - assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); - assertThat(template.getForEntity(urlBase + "/two", String.class).getStatusCode()) - .isEqualTo(HttpStatus.NOT_FOUND); - controller("com.example.ControllerTwo").withRequestMapping("two").build(); - urlBase = "http://localhost:" + awaitServerPort(); - assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); - assertThat(template.getForObject(urlBase + "/two", String.class)).isEqualTo("two"); - - } - - @ParameterizedTest(name = "{0}") - @MethodSource("parameters") - void createAControllerAndThenAddARequestMapping(ApplicationLauncher applicationLauncher) throws Exception { - launchApplication(applicationLauncher); - TestRestTemplate template = new TestRestTemplate(); - String urlBase = "http://localhost:" + awaitServerPort(); - assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); - assertThat(template.getForEntity(urlBase + "/two", String.class).getStatusCode()) - .isEqualTo(HttpStatus.NOT_FOUND); - controller("com.example.ControllerTwo").withRequestMapping("two").build(); - urlBase = "http://localhost:" + awaitServerPort(); - assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); - assertThat(template.getForObject(urlBase + "/two", String.class)).isEqualTo("two"); - controller("com.example.ControllerTwo").withRequestMapping("two").withRequestMapping("three").build(); - urlBase = "http://localhost:" + awaitServerPort(); - assertThat(template.getForObject(urlBase + "/three", String.class)).isEqualTo("three"); - } - - @ParameterizedTest(name = "{0}") - @MethodSource("parameters") - void createAControllerAndThenAddARequestMappingToAnExistingController(ApplicationLauncher applicationLauncher) - throws Exception { - launchApplication(applicationLauncher); - TestRestTemplate template = new TestRestTemplate(); - String urlBase = "http://localhost:" + awaitServerPort(); - assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); - assertThat(template.getForEntity(urlBase + "/two", String.class).getStatusCode()) - .isEqualTo(HttpStatus.NOT_FOUND); - controller("com.example.ControllerTwo").withRequestMapping("two").build(); - urlBase = "http://localhost:" + awaitServerPort(); - assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); - assertThat(template.getForObject(urlBase + "/two", String.class)).isEqualTo("two"); - controller("com.example.ControllerOne").withRequestMapping("one").withRequestMapping("three").build(); - urlBase = "http://localhost:" + awaitServerPort(); - assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); - assertThat(template.getForObject(urlBase + "/two", String.class)).isEqualTo("two"); - assertThat(template.getForObject(urlBase + "/three", String.class)).isEqualTo("three"); - } - - @ParameterizedTest(name = "{0}") - @MethodSource("parameters") - void deleteAController(ApplicationLauncher applicationLauncher) throws Exception { - launchApplication(applicationLauncher); - TestRestTemplate template = new TestRestTemplate(); - String urlBase = "http://localhost:" + awaitServerPort(); - assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); - assertThat(new File(this.launchedApplication.getClassesDirectory(), "com/example/ControllerOne.class").delete()) - .isTrue(); - urlBase = "http://localhost:" + awaitServerPort(); - assertThat(template.getForEntity(urlBase + "/one", String.class).getStatusCode()) - .isEqualTo(HttpStatus.NOT_FOUND); - - } - - @ParameterizedTest(name = "{0}") - @MethodSource("parameters") - void createAControllerAndThenDeleteIt(ApplicationLauncher applicationLauncher) throws Exception { - launchApplication(applicationLauncher); - TestRestTemplate template = new TestRestTemplate(); - String urlBase = "http://localhost:" + awaitServerPort(); - assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); - assertThat(template.getForEntity(urlBase + "/two", String.class).getStatusCode()) - .isEqualTo(HttpStatus.NOT_FOUND); - controller("com.example.ControllerTwo").withRequestMapping("two").build(); - urlBase = "http://localhost:" + awaitServerPort(); - assertThat(template.getForObject(urlBase + "/one", String.class)).isEqualTo("one"); - assertThat(template.getForObject(urlBase + "/two", String.class)).isEqualTo("two"); - assertThat(new File(this.launchedApplication.getClassesDirectory(), "com/example/ControllerTwo.class").delete()) - .isTrue(); - urlBase = "http://localhost:" + awaitServerPort(); - assertThat(template.getForEntity(urlBase + "/two", String.class).getStatusCode()) - .isEqualTo(HttpStatus.NOT_FOUND); - } - - static Object[] parameters() throws IOException { - Directories directories = new Directories(buildOutput, temp); - return new Object[] { new Object[] { new LocalApplicationLauncher(directories) }, - new Object[] { new ExplodedRemoteApplicationLauncher(directories) }, - new Object[] { new JarFileRemoteApplicationLauncher(directories) } }; - } - -} diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/app/build.gradle b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/app/build.gradle new file mode 100644 index 0000000000..4ae4cbceb4 --- /dev/null +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/app/build.gradle @@ -0,0 +1,21 @@ +plugins { + id 'java' + id 'org.springframework.boot' +} + +apply plugin: 'io.spring.dependency-management' + +repositories { + maven { url "file:$rootDir/../int-test-maven-repository"} + mavenCentral() + maven { url 'https://repo.spring.io/snapshot' } + maven { url 'https://repo.spring.io/milestone' } +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-web' +} + +bootJar { + launchScript() +} \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/app/settings.gradle b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/app/settings.gradle new file mode 100644 index 0000000000..85bf6bdb43 --- /dev/null +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/app/settings.gradle @@ -0,0 +1,15 @@ +pluginManagement { + repositories { + maven { url "file:$rootDir/../int-test-maven-repository"} + mavenCentral() + maven { url 'https://repo.spring.io/snapshot' } + maven { url 'https://repo.spring.io/milestone' } + } + resolutionStrategy { + eachPlugin { + if (requested.id.id == 'org.springframework.boot') { + useModule "org.springframework.boot:spring-boot-gradle-plugin:${requested.version}" + } + } + } +} \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/main/java/org/springframework/boot/launchscript/LaunchScriptTestApplication.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/app/src/main/java/org/springframework/boot/launchscript/LaunchScriptTestApplication.java similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/main/java/org/springframework/boot/launchscript/LaunchScriptTestApplication.java rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/app/src/main/java/org/springframework/boot/launchscript/LaunchScriptTestApplication.java diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/main/java/org/springframework/boot/launchscript/LaunchVerificationController.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/app/src/main/java/org/springframework/boot/launchscript/LaunchVerificationController.java similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/main/java/org/springframework/boot/launchscript/LaunchVerificationController.java rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/app/src/main/java/org/springframework/boot/launchscript/LaunchVerificationController.java diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/build.gradle b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/build.gradle new file mode 100644 index 0000000000..5d7f20909b --- /dev/null +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/build.gradle @@ -0,0 +1,45 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' + id 'org.springframework.boot.integration-test' +} + +description = "Spring Boot Launch Script Integration Tests" + +configurations { + app +} + +dependencies { + app project(path: ':spring-boot-project:spring-boot-tools:spring-boot-gradle-plugin', configuration: 'mavenRepository') + app project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter-web', configuration: 'mavenRepository') + + intTestImplementation enforcedPlatform(project(':spring-boot-project:spring-boot-parent')) + intTestImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + intTestImplementation 'org.testcontainers:testcontainers' +} + +task syncMavenRepository(type: Sync) { + from configurations.app + into "$buildDir/int-test-maven-repository" +} + +task syncAppSource(type: Sync) { + from 'app' + into "$buildDir/app" + filter { line -> + line.replace("id 'org.springframework.boot'", "id 'org.springframework.boot' version '${project.version}'") + } +} + +task buildApp(type: GradleBuild) { + dependsOn syncAppSource, syncMavenRepository + dir = "$buildDir/app" + startParameter.buildCacheEnabled = false + tasks = ['build'] +} + +intTest { + dependsOn buildApp + enabled = !JavaVersion.current().java9Compatible +} \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/pom.xml b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/pom.xml deleted file mode 100644 index f74e08f87b..0000000000 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/pom.xml +++ /dev/null @@ -1,110 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-integration-tests - ${revision} - - spring-boot-launch-script-tests - jar - Spring Boot Launch Script Integration Tests - Spring Boot Launch Script Integration Tests - - ${basedir}/../../.. - 2.27 - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - org.springframework.boot - spring-boot-starter-undertow - - - org.springframework.boot - spring-boot-starter-test - test - - - org.slf4j - jcl-over-slf4j - - - javax.ws.rs - javax.ws.rs-api - - - javax.annotation - javax.annotation-api - - - - - jakarta.ws.rs - jakarta.ws.rs-api - - - org.testcontainers - testcontainers - test - - - javax.annotation - javax.annotation-api - - - javax.xml.bind - jaxb-api - - - org.hamcrest - hamcrest-core - - - - - - - docker - - - - org.springframework.boot - spring-boot-maven-plugin - - true - - - - - repackage - - - - - - org.apache.maven.plugins - maven-failsafe-plugin - - - - integration-test - verify - - - - - - - - - diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/java/org/springframework/boot/launchscript/SysVinitLaunchScriptIntegrationTests.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/java/org/springframework/boot/launchscript/SysVinitLaunchScriptIntegrationTests.java new file mode 100644 index 0000000000..2f1f4ea3d0 --- /dev/null +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/java/org/springframework/boot/launchscript/SysVinitLaunchScriptIntegrationTests.java @@ -0,0 +1,356 @@ +/* + * Copyright 2012-2019 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.boot.launchscript; + +import java.io.File; +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +import org.assertj.core.api.Condition; +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.output.ToStringConsumer; +import org.testcontainers.images.builder.ImageFromDockerfile; +import org.testcontainers.utility.MountableFile; + +import org.springframework.boot.ansi.AnsiColor; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.containsString; + +/** + * Integration tests for Spring Boot's launch script on OSs that use SysVinit. + * + * @author Andy Wilkinson + * @author Ali Shahbour + */ +class SysVinitLaunchScriptIntegrationTests { + + private static final char ESC = 27; + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void statusWhenStopped(String os, String version) throws Exception { + String output = doTest(os, version, "status-when-stopped.sh"); + assertThat(output).contains("Status: 3"); + assertThat(output).has(coloredString(AnsiColor.RED, "Not running")); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void statusWhenStarted(String os, String version) throws Exception { + String output = doTest(os, version, "status-when-started.sh"); + assertThat(output).contains("Status: 0"); + assertThat(output).has(coloredString(AnsiColor.GREEN, "Started [" + extractPid(output) + "]")); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void statusWhenKilled(String os, String version) throws Exception { + String output = doTest(os, version, "status-when-killed.sh"); + assertThat(output).contains("Status: 1"); + assertThat(output) + .has(coloredString(AnsiColor.RED, "Not running (process " + extractPid(output) + " not found)")); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void stopWhenStopped(String os, String version) throws Exception { + String output = doTest(os, version, "stop-when-stopped.sh"); + assertThat(output).contains("Status: 0"); + assertThat(output).has(coloredString(AnsiColor.YELLOW, "Not running (pidfile not found)")); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void forceStopWhenStopped(String os, String version) throws Exception { + String output = doTest(os, version, "force-stop-when-stopped.sh"); + assertThat(output).contains("Status: 0"); + assertThat(output).has(coloredString(AnsiColor.YELLOW, "Not running (pidfile not found)")); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void startWhenStarted(String os, String version) throws Exception { + String output = doTest(os, version, "start-when-started.sh"); + assertThat(output).contains("Status: 0"); + assertThat(output).has(coloredString(AnsiColor.YELLOW, "Already running [" + extractPid(output) + "]")); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void restartWhenStopped(String os, String version) throws Exception { + String output = doTest(os, version, "restart-when-stopped.sh"); + assertThat(output).contains("Status: 0"); + assertThat(output).has(coloredString(AnsiColor.YELLOW, "Not running (pidfile not found)")); + assertThat(output).has(coloredString(AnsiColor.GREEN, "Started [" + extractPid(output) + "]")); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void restartWhenStarted(String os, String version) throws Exception { + String output = doTest(os, version, "restart-when-started.sh"); + assertThat(output).contains("Status: 0"); + assertThat(output).has(coloredString(AnsiColor.GREEN, "Started [" + extract("PID1", output) + "]")); + assertThat(output).has(coloredString(AnsiColor.GREEN, "Stopped [" + extract("PID1", output) + "]")); + assertThat(output).has(coloredString(AnsiColor.GREEN, "Started [" + extract("PID2", output) + "]")); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void startWhenStopped(String os, String version) throws Exception { + String output = doTest(os, version, "start-when-stopped.sh"); + assertThat(output).contains("Status: 0"); + assertThat(output).has(coloredString(AnsiColor.GREEN, "Started [" + extractPid(output) + "]")); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void basicLaunch(String os, String version) throws Exception { + String output = doTest(os, version, "basic-launch.sh"); + assertThat(output).doesNotContain("PID_FOLDER"); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void launchWithMissingLogFolderGeneratesAWarning(String os, String version) throws Exception { + String output = doTest(os, version, "launch-with-missing-log-folder.sh"); + assertThat(output).has( + coloredString(AnsiColor.YELLOW, "LOG_FOLDER /does/not/exist does not exist. Falling back to /tmp")); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void launchWithMissingPidFolderGeneratesAWarning(String os, String version) throws Exception { + String output = doTest(os, version, "launch-with-missing-pid-folder.sh"); + assertThat(output).has( + coloredString(AnsiColor.YELLOW, "PID_FOLDER /does/not/exist does not exist. Falling back to /tmp")); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void launchWithSingleCommandLineArgument(String os, String version) throws Exception { + doLaunch(os, version, "launch-with-single-command-line-argument.sh"); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void launchWithMultipleCommandLineArguments(String os, String version) throws Exception { + doLaunch(os, version, "launch-with-multiple-command-line-arguments.sh"); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void launchWithSingleRunArg(String os, String version) throws Exception { + doLaunch(os, version, "launch-with-single-run-arg.sh"); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void launchWithMultipleRunArgs(String os, String version) throws Exception { + doLaunch(os, version, "launch-with-multiple-run-args.sh"); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void launchWithSingleJavaOpt(String os, String version) throws Exception { + doLaunch(os, version, "launch-with-single-java-opt.sh"); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void launchWithDoubleLinkSingleJavaOpt(String os, String version) throws Exception { + doLaunch(os, version, "launch-with-double-link-single-java-opt.sh"); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void launchWithMultipleJavaOpts(String os, String version) throws Exception { + doLaunch(os, version, "launch-with-multiple-java-opts.sh"); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void launchWithUseOfStartStopDaemonDisabled(String os, String version) throws Exception { + // CentOS doesn't have start-stop-daemon + Assumptions.assumeFalse(os.equals("CentOS")); + doLaunch(os, version, "launch-with-use-of-start-stop-daemon-disabled.sh"); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void launchWithRelativePidFolder(String os, String version) throws Exception { + String output = doTest(os, version, "launch-with-relative-pid-folder.sh"); + assertThat(output).has(coloredString(AnsiColor.GREEN, "Started [" + extractPid(output) + "]")); + assertThat(output).has(coloredString(AnsiColor.GREEN, "Running [" + extractPid(output) + "]")); + assertThat(output).has(coloredString(AnsiColor.GREEN, "Stopped [" + extractPid(output) + "]")); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void pidFolderOwnership(String os, String version) throws Exception { + String output = doTest(os, version, "pid-folder-ownership.sh"); + assertThat(output).contains("phil root"); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void pidFileOwnership(String os, String version) throws Exception { + String output = doTest(os, version, "pid-file-ownership.sh"); + assertThat(output).contains("phil root"); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void logFileOwnership(String os, String version) throws Exception { + String output = doTest(os, version, "log-file-ownership.sh"); + assertThat(output).contains("phil root"); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void logFileOwnershipIsChangedWhenCreated(String os, String version) throws Exception { + String output = doTest(os, version, "log-file-ownership-is-changed-when-created.sh"); + assertThat(output).contains("andy root"); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void logFileOwnershipIsUnchangedWhenExists(String os, String version) throws Exception { + String output = doTest(os, version, "log-file-ownership-is-unchanged-when-exists.sh"); + assertThat(output).contains("root root"); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void launchWithRelativeLogFolder(String os, String version) throws Exception { + String output = doTest(os, version, "launch-with-relative-log-folder.sh"); + assertThat(output).contains("Log written"); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void launchWithRunAsUser(String os, String version) throws Exception { + String output = doTest(os, version, "launch-with-run-as-user.sh"); + assertThat(output).contains("wagner root"); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void whenRunAsUserDoesNotExistLaunchFailsWithInvalidArgument(String os, String version) throws Exception { + String output = doTest(os, version, "launch-with-run-as-invalid-user.sh"); + assertThat(output).contains("Status: 2"); + assertThat(output).has(coloredString(AnsiColor.RED, "Cannot run as 'johndoe': no such user")); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void whenJarOwnerAndRunAsUserAreBothSpecifiedRunAsUserTakesPrecedence(String os, String version) throws Exception { + String output = doTest(os, version, "launch-with-run-as-user-preferred-to-jar-owner.sh"); + assertThat(output).contains("wagner root"); + } + + @ParameterizedTest(name = "{0} {1}") + @MethodSource("parameters") + void whenLaunchedUsingNonRootUserWithRunAsUserSpecifiedLaunchFailsWithInsufficientPrivilege(String os, + String version) throws Exception { + String output = doTest(os, version, "launch-with-run-as-user-root-required.sh"); + assertThat(output).contains("Status: 4"); + assertThat(output).has(coloredString(AnsiColor.RED, "Cannot run as 'wagner': current user is not root")); + } + + static List parameters() { + List parameters = new ArrayList<>(); + for (File os : new File("src/intTest/resources/conf").listFiles()) { + for (File version : os.listFiles()) { + parameters.add(new Object[] { os.getName(), version.getName() }); + } + } + return parameters; + } + + private void doLaunch(String os, String version, String script) throws Exception { + assertThat(doTest(os, version, script)).contains("Launched"); + } + + private String doTest(String os, String version, String script) throws Exception { + ToStringConsumer consumer = new ToStringConsumer().withRemoveAnsiCodes(false); + try (LaunchScriptTestContainer container = new LaunchScriptTestContainer(os, version, script)) { + container.withLogConsumer(consumer); + container.start(); + while (container.isRunning()) { + Thread.sleep(100); + } + } + return consumer.toUtf8String(); + } + + private Condition coloredString(AnsiColor color, String string) { + String colorString = ESC + "[0;" + color + "m" + string + ESC + "[0m"; + return new Condition() { + + @Override + public boolean matches(String value) { + return containsString(colorString).matches(value); + } + + }; + } + + private String extractPid(String output) { + return extract("PID", output); + } + + private String extract(String label, String output) { + Pattern pattern = Pattern.compile(".*" + label + ": ([0-9]+).*", Pattern.DOTALL); + java.util.regex.Matcher matcher = pattern.matcher(output); + if (matcher.matches()) { + return matcher.group(1); + } + throw new IllegalArgumentException("Failed to extract " + label + " from output: " + output); + } + + private static final class LaunchScriptTestContainer extends GenericContainer { + + private LaunchScriptTestContainer(String os, String version, String testScript) { + super(new ImageFromDockerfile("spring-boot-launch-script/" + os.toLowerCase() + "-" + version) + .withFileFromFile("Dockerfile", + new File("src/intTest/resources/conf/" + os + "/" + version + "/Dockerfile")) + .withFileFromFile("app.jar", findApplication()).withFileFromFile("test-functions.sh", + new File("src/intTest/resources/scripts/test-functions.sh"))); + withCopyFileToContainer(MountableFile.forHostPath("src/intTest/resources/scripts/" + testScript), + "/" + testScript); + withCommand("/bin/bash", "-c", "chmod +x " + testScript + " && ./" + testScript); + withStartupTimeout(Duration.ofMinutes(10)); + } + + private static File findApplication() { + File appJar = new File("build/app/build/libs/app.jar"); + if (appJar.isFile()) { + return appJar; + } + throw new IllegalStateException( + "Could not find test application in build/app/build/libs directory. Have you built it?"); + } + + } + +} diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/conf/CentOS/6.9-a23bced6/Dockerfile b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/conf/CentOS/6.9-a23bced6/Dockerfile new file mode 100644 index 0000000000..c97b60e602 --- /dev/null +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/conf/CentOS/6.9-a23bced6/Dockerfile @@ -0,0 +1,11 @@ +# CentOS 6.9 from 02/06/2017 +FROM centos@sha256:a23bced61701af9a0a758e94229676d9f09996a3ff0f3d26955b06bac8c282e0 +RUN yum install -y wget && \ + yum install -y system-config-services && \ + yum install -y curl && \ + wget --output-document jdk.rpm \ + https://cdn.azul.com/zulu/bin/zulu8.21.0.1-jdk8.0.131-linux.x86_64.rpm && \ + yum --nogpg localinstall -y jdk.rpm && \ + rm -f jdk.rpm +ADD app.jar /app.jar +ADD test-functions.sh /test-functions.sh \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/conf/Ubuntu/trusty-20160914/Dockerfile b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/conf/Ubuntu/trusty-20160914/Dockerfile new file mode 100644 index 0000000000..7e7a726f49 --- /dev/null +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/conf/Ubuntu/trusty-20160914/Dockerfile @@ -0,0 +1,10 @@ +FROM ubuntu:trusty-20160914 +RUN apt-get update && \ + apt-get install -y software-properties-common curl && \ + mkdir -p /opt/openjdk && \ + cd /opt/openjdk && \ + curl -L https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u202-b08/OpenJDK8U-jdk_x64_linux_hotspot_8u202b08.tar.gz | tar zx --strip-components=1 +ENV JAVA_HOME /opt/openjdk +ENV PATH $JAVA_HOME/bin:$PATH +ADD app.jar /app.jar +ADD test-functions.sh /test-functions.sh \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/conf/Ubuntu/xenial-20160914/Dockerfile b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/conf/Ubuntu/xenial-20160914/Dockerfile new file mode 100644 index 0000000000..8f8cae543f --- /dev/null +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/conf/Ubuntu/xenial-20160914/Dockerfile @@ -0,0 +1,10 @@ +FROM ubuntu:xenial-20160914 +RUN apt-get update && \ + apt-get install -y software-properties-common curl && \ + mkdir -p /opt/openjdk && \ + cd /opt/openjdk && \ + curl -L https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u202-b08/OpenJDK8U-jdk_x64_linux_hotspot_8u202b08.tar.gz | tar zx --strip-components=1 +ENV JAVA_HOME /opt/openjdk +ENV PATH $JAVA_HOME/bin:$PATH +ADD app.jar /app.jar +ADD test-functions.sh /test-functions.sh \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/logback.xml b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/logback.xml similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/logback.xml rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/logback.xml diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/basic-launch.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/basic-launch.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/basic-launch.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/basic-launch.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/force-stop-when-stopped.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/force-stop-when-stopped.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/force-stop-when-stopped.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/force-stop-when-stopped.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-double-link-single-java-opt.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-double-link-single-java-opt.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-double-link-single-java-opt.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-double-link-single-java-opt.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-missing-log-folder.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-missing-log-folder.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-missing-log-folder.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-missing-log-folder.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-missing-pid-folder.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-missing-pid-folder.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-missing-pid-folder.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-missing-pid-folder.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-multiple-command-line-arguments.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-multiple-command-line-arguments.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-multiple-command-line-arguments.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-multiple-command-line-arguments.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-multiple-java-opts.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-multiple-java-opts.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-multiple-java-opts.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-multiple-java-opts.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-multiple-run-args.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-multiple-run-args.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-multiple-run-args.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-multiple-run-args.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-relative-log-folder.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-relative-log-folder.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-relative-log-folder.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-relative-log-folder.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-relative-pid-folder.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-relative-pid-folder.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-relative-pid-folder.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-relative-pid-folder.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-run-as-invalid-user.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-run-as-invalid-user.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-run-as-invalid-user.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-run-as-invalid-user.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-run-as-user-preferred-to-jar-owner.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-run-as-user-preferred-to-jar-owner.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-run-as-user-preferred-to-jar-owner.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-run-as-user-preferred-to-jar-owner.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-run-as-user-root-required.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-run-as-user-root-required.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-run-as-user-root-required.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-run-as-user-root-required.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-run-as-user.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-run-as-user.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-run-as-user.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-run-as-user.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-single-command-line-argument.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-single-command-line-argument.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-single-command-line-argument.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-single-command-line-argument.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-single-java-opt.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-single-java-opt.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-single-java-opt.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-single-java-opt.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-single-run-arg.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-single-run-arg.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-single-run-arg.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-single-run-arg.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-use-of-start-stop-daemon-disabled.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-use-of-start-stop-daemon-disabled.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/launch-with-use-of-start-stop-daemon-disabled.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/launch-with-use-of-start-stop-daemon-disabled.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/log-file-ownership-is-changed-when-created.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/log-file-ownership-is-changed-when-created.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/log-file-ownership-is-changed-when-created.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/log-file-ownership-is-changed-when-created.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/log-file-ownership-is-unchanged-when-exists.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/log-file-ownership-is-unchanged-when-exists.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/log-file-ownership-is-unchanged-when-exists.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/log-file-ownership-is-unchanged-when-exists.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/log-file-ownership.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/log-file-ownership.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/log-file-ownership.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/log-file-ownership.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/pid-file-ownership.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/pid-file-ownership.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/pid-file-ownership.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/pid-file-ownership.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/pid-folder-ownership.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/pid-folder-ownership.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/pid-folder-ownership.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/pid-folder-ownership.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/restart-when-started.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/restart-when-started.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/restart-when-started.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/restart-when-started.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/restart-when-stopped.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/restart-when-stopped.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/restart-when-stopped.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/restart-when-stopped.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/start-when-started.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/start-when-started.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/start-when-started.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/start-when-started.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/start-when-stopped.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/start-when-stopped.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/start-when-stopped.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/start-when-stopped.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/status-when-killed.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/status-when-killed.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/status-when-killed.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/status-when-killed.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/status-when-started.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/status-when-started.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/status-when-started.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/status-when-started.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/status-when-stopped.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/status-when-stopped.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/status-when-stopped.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/status-when-stopped.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/stop-when-stopped.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/stop-when-stopped.sh similarity index 100% rename from spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/stop-when-stopped.sh rename to spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/stop-when-stopped.sh diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/test-functions.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/test-functions.sh new file mode 100644 index 0000000000..e7430eb770 --- /dev/null +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/intTest/resources/scripts/test-functions.sh @@ -0,0 +1,53 @@ +install_service() { + mkdir /test-service + mv /app.jar /test-service/spring-boot-app.jar + chmod +x /test-service/spring-boot-app.jar + ln -s /test-service/spring-boot-app.jar /etc/init.d/spring-boot-app +} + +install_double_link_service() { + mkdir /test-service + mv /app.jar /test-service/ + chmod +x /test-service/app.jar + ln -s /test-service/app.jar /test-service/spring-boot-app.jar + ln -s /test-service/spring-boot-app.jar /etc/init.d/spring-boot-app +} + +start_service() { + service spring-boot-app start $@ +} + +restart_service() { + service spring-boot-app restart +} + +status_service() { + service spring-boot-app status +} + +stop_service() { + service spring-boot-app stop +} + +force_stop_service() { + service spring-boot-app force-stop +} + +await_app() { + if [ -z $1 ] + then + url=http://127.0.0.1:8080 + else + url=$1 + fi + end=$(date +%s) + let "end+=600" + until curl -s $url > /dev/null + do + now=$(date +%s) + if [[ $now -ge $end ]]; then + break + fi + sleep 1 + done +} diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/java/org/springframework/boot/launchscript/SysVinitLaunchScriptIT.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/java/org/springframework/boot/launchscript/SysVinitLaunchScriptIT.java deleted file mode 100644 index a4014dcb47..0000000000 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/java/org/springframework/boot/launchscript/SysVinitLaunchScriptIT.java +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Copyright 2012-2019 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.boot.launchscript; - -import java.io.File; -import java.time.Duration; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Pattern; - -import org.assertj.core.api.Condition; -import org.junit.jupiter.api.Assumptions; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; -import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.output.ToStringConsumer; -import org.testcontainers.images.builder.ImageFromDockerfile; -import org.testcontainers.utility.MountableFile; - -import org.springframework.boot.ansi.AnsiColor; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.hamcrest.Matchers.containsString; - -/** - * Integration tests for Spring Boot's launch script on OSs that use SysVinit. - * - * @author Andy Wilkinson - * @author Ali Shahbour - */ -class SysVinitLaunchScriptIT { - - private static final char ESC = 27; - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void statusWhenStopped(String os, String version) throws Exception { - String output = doTest(os, version, "status-when-stopped.sh"); - assertThat(output).contains("Status: 3"); - assertThat(output).has(coloredString(AnsiColor.RED, "Not running")); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void statusWhenStarted(String os, String version) throws Exception { - String output = doTest(os, version, "status-when-started.sh"); - assertThat(output).contains("Status: 0"); - assertThat(output).has(coloredString(AnsiColor.GREEN, "Started [" + extractPid(output) + "]")); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void statusWhenKilled(String os, String version) throws Exception { - String output = doTest(os, version, "status-when-killed.sh"); - assertThat(output).contains("Status: 1"); - assertThat(output) - .has(coloredString(AnsiColor.RED, "Not running (process " + extractPid(output) + " not found)")); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void stopWhenStopped(String os, String version) throws Exception { - String output = doTest(os, version, "stop-when-stopped.sh"); - assertThat(output).contains("Status: 0"); - assertThat(output).has(coloredString(AnsiColor.YELLOW, "Not running (pidfile not found)")); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void forceStopWhenStopped(String os, String version) throws Exception { - String output = doTest(os, version, "force-stop-when-stopped.sh"); - assertThat(output).contains("Status: 0"); - assertThat(output).has(coloredString(AnsiColor.YELLOW, "Not running (pidfile not found)")); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void startWhenStarted(String os, String version) throws Exception { - String output = doTest(os, version, "start-when-started.sh"); - assertThat(output).contains("Status: 0"); - assertThat(output).has(coloredString(AnsiColor.YELLOW, "Already running [" + extractPid(output) + "]")); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void restartWhenStopped(String os, String version) throws Exception { - String output = doTest(os, version, "restart-when-stopped.sh"); - assertThat(output).contains("Status: 0"); - assertThat(output).has(coloredString(AnsiColor.YELLOW, "Not running (pidfile not found)")); - assertThat(output).has(coloredString(AnsiColor.GREEN, "Started [" + extractPid(output) + "]")); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void restartWhenStarted(String os, String version) throws Exception { - String output = doTest(os, version, "restart-when-started.sh"); - assertThat(output).contains("Status: 0"); - assertThat(output).has(coloredString(AnsiColor.GREEN, "Started [" + extract("PID1", output) + "]")); - assertThat(output).has(coloredString(AnsiColor.GREEN, "Stopped [" + extract("PID1", output) + "]")); - assertThat(output).has(coloredString(AnsiColor.GREEN, "Started [" + extract("PID2", output) + "]")); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void startWhenStopped(String os, String version) throws Exception { - String output = doTest(os, version, "start-when-stopped.sh"); - assertThat(output).contains("Status: 0"); - assertThat(output).has(coloredString(AnsiColor.GREEN, "Started [" + extractPid(output) + "]")); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void basicLaunch(String os, String version) throws Exception { - String output = doTest(os, version, "basic-launch.sh"); - assertThat(output).doesNotContain("PID_FOLDER"); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void launchWithMissingLogFolderGeneratesAWarning(String os, String version) throws Exception { - String output = doTest(os, version, "launch-with-missing-log-folder.sh"); - assertThat(output).has( - coloredString(AnsiColor.YELLOW, "LOG_FOLDER /does/not/exist does not exist. Falling back to /tmp")); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void launchWithMissingPidFolderGeneratesAWarning(String os, String version) throws Exception { - String output = doTest(os, version, "launch-with-missing-pid-folder.sh"); - assertThat(output).has( - coloredString(AnsiColor.YELLOW, "PID_FOLDER /does/not/exist does not exist. Falling back to /tmp")); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void launchWithSingleCommandLineArgument(String os, String version) throws Exception { - doLaunch(os, version, "launch-with-single-command-line-argument.sh"); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void launchWithMultipleCommandLineArguments(String os, String version) throws Exception { - doLaunch(os, version, "launch-with-multiple-command-line-arguments.sh"); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void launchWithSingleRunArg(String os, String version) throws Exception { - doLaunch(os, version, "launch-with-single-run-arg.sh"); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void launchWithMultipleRunArgs(String os, String version) throws Exception { - doLaunch(os, version, "launch-with-multiple-run-args.sh"); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void launchWithSingleJavaOpt(String os, String version) throws Exception { - doLaunch(os, version, "launch-with-single-java-opt.sh"); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void launchWithDoubleLinkSingleJavaOpt(String os, String version) throws Exception { - doLaunch(os, version, "launch-with-double-link-single-java-opt.sh"); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void launchWithMultipleJavaOpts(String os, String version) throws Exception { - doLaunch(os, version, "launch-with-multiple-java-opts.sh"); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void launchWithUseOfStartStopDaemonDisabled(String os, String version) throws Exception { - // CentOS doesn't have start-stop-daemon - Assumptions.assumeFalse(os.equals("CentOS")); - doLaunch(os, version, "launch-with-use-of-start-stop-daemon-disabled.sh"); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void launchWithRelativePidFolder(String os, String version) throws Exception { - String output = doTest(os, version, "launch-with-relative-pid-folder.sh"); - assertThat(output).has(coloredString(AnsiColor.GREEN, "Started [" + extractPid(output) + "]")); - assertThat(output).has(coloredString(AnsiColor.GREEN, "Running [" + extractPid(output) + "]")); - assertThat(output).has(coloredString(AnsiColor.GREEN, "Stopped [" + extractPid(output) + "]")); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void pidFolderOwnership(String os, String version) throws Exception { - String output = doTest(os, version, "pid-folder-ownership.sh"); - assertThat(output).contains("phil root"); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void pidFileOwnership(String os, String version) throws Exception { - String output = doTest(os, version, "pid-file-ownership.sh"); - assertThat(output).contains("phil root"); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void logFileOwnership(String os, String version) throws Exception { - String output = doTest(os, version, "log-file-ownership.sh"); - assertThat(output).contains("phil root"); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void logFileOwnershipIsChangedWhenCreated(String os, String version) throws Exception { - String output = doTest(os, version, "log-file-ownership-is-changed-when-created.sh"); - assertThat(output).contains("andy root"); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void logFileOwnershipIsUnchangedWhenExists(String os, String version) throws Exception { - String output = doTest(os, version, "log-file-ownership-is-unchanged-when-exists.sh"); - assertThat(output).contains("root root"); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void launchWithRelativeLogFolder(String os, String version) throws Exception { - String output = doTest(os, version, "launch-with-relative-log-folder.sh"); - assertThat(output).contains("Log written"); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void launchWithRunAsUser(String os, String version) throws Exception { - String output = doTest(os, version, "launch-with-run-as-user.sh"); - assertThat(output).contains("wagner root"); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void whenRunAsUserDoesNotExistLaunchFailsWithInvalidArgument(String os, String version) throws Exception { - String output = doTest(os, version, "launch-with-run-as-invalid-user.sh"); - assertThat(output).contains("Status: 2"); - assertThat(output).has(coloredString(AnsiColor.RED, "Cannot run as 'johndoe': no such user")); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void whenJarOwnerAndRunAsUserAreBothSpecifiedRunAsUserTakesPrecedence(String os, String version) throws Exception { - String output = doTest(os, version, "launch-with-run-as-user-preferred-to-jar-owner.sh"); - assertThat(output).contains("wagner root"); - } - - @ParameterizedTest(name = "{0} {1}") - @MethodSource("parameters") - void whenLaunchedUsingNonRootUserWithRunAsUserSpecifiedLaunchFailsWithInsufficientPrivilege(String os, - String version) throws Exception { - String output = doTest(os, version, "launch-with-run-as-user-root-required.sh"); - assertThat(output).contains("Status: 4"); - assertThat(output).has(coloredString(AnsiColor.RED, "Cannot run as 'wagner': current user is not root")); - } - - static List parameters() { - List parameters = new ArrayList<>(); - for (File os : new File("src/test/resources/conf").listFiles()) { - for (File version : os.listFiles()) { - parameters.add(new Object[] { os.getName(), version.getName() }); - } - } - return parameters; - } - - private void doLaunch(String os, String version, String script) throws Exception { - assertThat(doTest(os, version, script)).contains("Launched"); - } - - private String doTest(String os, String version, String script) throws Exception { - ToStringConsumer consumer = new ToStringConsumer().withRemoveAnsiCodes(false); - try (LaunchScriptTestContainer container = new LaunchScriptTestContainer(os, version, script)) { - container.withLogConsumer(consumer); - container.start(); - while (container.isRunning()) { - Thread.sleep(100); - } - } - return consumer.toUtf8String(); - } - - private Condition coloredString(AnsiColor color, String string) { - String colorString = ESC + "[0;" + color + "m" + string + ESC + "[0m"; - return new Condition() { - - @Override - public boolean matches(String value) { - return containsString(colorString).matches(value); - } - - }; - } - - private String extractPid(String output) { - return extract("PID", output); - } - - private String extract(String label, String output) { - Pattern pattern = Pattern.compile(".*" + label + ": ([0-9]+).*", Pattern.DOTALL); - java.util.regex.Matcher matcher = pattern.matcher(output); - if (matcher.matches()) { - return matcher.group(1); - } - throw new IllegalArgumentException("Failed to extract " + label + " from output: " + output); - } - - private static final class LaunchScriptTestContainer extends GenericContainer { - - private LaunchScriptTestContainer(String os, String version, String testScript) { - super(new ImageFromDockerfile("spring-boot-launch-script/" + os.toLowerCase() + "-" + version) - .withFileFromFile("Dockerfile", - new File("src/test/resources/conf/" + os + "/" + version + "/Dockerfile")) - .withFileFromFile("spring-boot-launch-script-tests.jar", findApplication()) - .withFileFromFile("test-functions.sh", new File("src/test/resources/scripts/test-functions.sh"))); - withCopyFileToContainer(MountableFile.forHostPath("src/test/resources/scripts/" + testScript), - "/" + testScript); - withCommand("/bin/bash", "-c", "chmod +x " + testScript + " && ./" + testScript); - withStartupTimeout(Duration.ofMinutes(10)); - } - - private static File findApplication() { - File targetDir = new File("target"); - for (File file : targetDir.listFiles()) { - if (file.getName().startsWith("spring-boot-launch-script-tests") && file.getName().endsWith(".jar") - && !file.getName().endsWith("-sources.jar")) { - return file; - } - } - throw new IllegalStateException( - "Could not find test application in target directory. Have you built it (mvn package)?"); - } - - } - -} diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/conf/CentOS/6.9-a23bced6/Dockerfile b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/conf/CentOS/6.9-a23bced6/Dockerfile deleted file mode 100644 index 70513764d0..0000000000 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/conf/CentOS/6.9-a23bced6/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -# CentOS 6.9 from 02/06/2017 -FROM centos@sha256:a23bced61701af9a0a758e94229676d9f09996a3ff0f3d26955b06bac8c282e0 -RUN yum install -y wget && \ - yum install -y system-config-services && \ - yum install -y curl && \ - wget --output-document jdk.rpm \ - https://cdn.azul.com/zulu/bin/zulu8.21.0.1-jdk8.0.131-linux.x86_64.rpm && \ - yum --nogpg localinstall -y jdk.rpm && \ - rm -f jdk.rpm -ADD spring-boot-launch-script-tests.jar /spring-boot-launch-script-tests.jar -ADD test-functions.sh /test-functions.sh \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/conf/Ubuntu/trusty-20160914/Dockerfile b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/conf/Ubuntu/trusty-20160914/Dockerfile deleted file mode 100644 index cf95d7cacf..0000000000 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/conf/Ubuntu/trusty-20160914/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM ubuntu:trusty-20160914 -RUN apt-get update && \ - apt-get install -y software-properties-common curl && \ - mkdir -p /opt/openjdk && \ - cd /opt/openjdk && \ - curl -L https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u202-b08/OpenJDK8U-jdk_x64_linux_hotspot_8u202b08.tar.gz | tar zx --strip-components=1 -ENV JAVA_HOME /opt/openjdk -ENV PATH $JAVA_HOME/bin:$PATH -ADD spring-boot-launch-script-tests.jar /spring-boot-launch-script-tests.jar -ADD test-functions.sh /test-functions.sh \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/conf/Ubuntu/xenial-20160914/Dockerfile b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/conf/Ubuntu/xenial-20160914/Dockerfile deleted file mode 100644 index d1a37468b5..0000000000 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/conf/Ubuntu/xenial-20160914/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM ubuntu:xenial-20160914 -RUN apt-get update && \ - apt-get install -y software-properties-common curl && \ - mkdir -p /opt/openjdk && \ - cd /opt/openjdk && \ - curl -L https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u202-b08/OpenJDK8U-jdk_x64_linux_hotspot_8u202b08.tar.gz | tar zx --strip-components=1 -ENV JAVA_HOME /opt/openjdk -ENV PATH $JAVA_HOME/bin:$PATH -ADD spring-boot-launch-script-tests.jar /spring-boot-launch-script-tests.jar -ADD test-functions.sh /test-functions.sh \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/test-functions.sh b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/test-functions.sh deleted file mode 100644 index 903713b888..0000000000 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/resources/scripts/test-functions.sh +++ /dev/null @@ -1,53 +0,0 @@ -install_service() { - mkdir /test-service - mv /spring-boot-launch-script-tests.jar /test-service/spring-boot-app.jar - chmod +x /test-service/spring-boot-app.jar - ln -s /test-service/spring-boot-app.jar /etc/init.d/spring-boot-app -} - -install_double_link_service() { - mkdir /test-service - mv /spring-boot-launch-script-tests.jar /test-service/ - chmod +x /test-service/spring-boot-launch-script-tests.jar - ln -s /test-service/spring-boot-launch-script-tests.jar /test-service/spring-boot-app.jar - ln -s /test-service/spring-boot-app.jar /etc/init.d/spring-boot-app -} - -start_service() { - service spring-boot-app start $@ -} - -restart_service() { - service spring-boot-app restart -} - -status_service() { - service spring-boot-app status -} - -stop_service() { - service spring-boot-app stop -} - -force_stop_service() { - service spring-boot-app force-stop -} - -await_app() { - if [ -z $1 ] - then - url=http://127.0.0.1:8080 - else - url=$1 - fi - end=$(date +%s) - let "end+=30" - until curl -s $url > /dev/null - do - now=$(date +%s) - if [[ $now -ge $end ]]; then - break - fi - sleep 1 - done -} diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/build.gradle b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/build.gradle new file mode 100644 index 0000000000..b7c4cd5a04 --- /dev/null +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/build.gradle @@ -0,0 +1,51 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = "Spring Boot Server Tests" + +configurations { + testRepository +} + +dependencies { + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation project(':spring-boot-project:spring-boot-tools:spring-boot-test-support') + + testImplementation 'com.samskivert:jmustache' + testImplementation 'jakarta.servlet:jakarta.servlet-api' + testImplementation 'org.apache.httpcomponents:httpasyncclient' + testImplementation 'org.apache.maven.shared:maven-invoker:3.0.0' + testImplementation 'org.awaitility:awaitility' + testImplementation('org.eclipse.jetty:jetty-webapp') { + exclude group: 'javax.servlet', module: 'javax-servlet-api' + } + testImplementation 'org.springframework:spring-web' + + testRepository project(path: ':spring-boot-project:spring-boot-dependencies', configuration: 'mavenRepository') + testRepository project(path: ':spring-boot-project:spring-boot-tools:spring-boot-maven-plugin', configuration: 'mavenRepository') + testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter', configuration: 'mavenRepository') + testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter-jetty', configuration: 'mavenRepository') + testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter-parent', configuration: 'mavenRepository') + testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter-tomcat', configuration: 'mavenRepository') + testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter-undertow', configuration: 'mavenRepository') + + testRuntimeOnly project(':spring-boot-project:spring-boot-starters:spring-boot-starter-logging') +} + +task prepareMavenBinaries(type: org.springframework.boot.build.mavenplugin.PrepareMavenBinaries) { + outputDir = file("$buildDir/maven-binaries") + versions '3.6.2' +} + +task syncTestRepository(type: Sync) { + destinationDir = file("${buildDir}/test-repository") + from { + configurations.testRepository + } +} + +test { + dependsOn prepareMavenBinaries, syncTestRepository +} diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/pom.xml b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/pom.xml deleted file mode 100644 index 95ddd77d9c..0000000000 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/pom.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-integration-tests - ${revision} - - spring-boot-server-tests - jar - Spring Boot Server Tests - - ${basedir}/../../.. - - - - org.springframework.boot - spring-boot-starter-logging - test - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.boot - spring-boot-test-support - test - - - com.samskivert - jmustache - test - - - jakarta.servlet - jakarta.servlet-api - test - - - org.apache.maven.shared - maven-invoker - 3.0.0 - test - - - org.awaitility - awaitility - test - - - org.eclipse.jetty - jetty-webapp - test - - - javax.servlet - javax.servlet-api - - - - - org.springframework - spring-web - test - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - ${maven.home} - ${repository} - - - - - - diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/AbstractApplicationLauncher.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/AbstractApplicationLauncher.java index 42caaae4d6..d22fa9c880 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/AbstractApplicationLauncher.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/AbstractApplicationLauncher.java @@ -95,7 +95,7 @@ abstract class AbstractApplicationLauncher implements BeforeEachCallback, AfterE } private int awaitServerPort(Process process, File serverPortFile) throws Exception { - Awaitility.waitAtMost(Duration.ofSeconds(30)).until(serverPortFile::length, (length) -> { + Awaitility.waitAtMost(Duration.ofSeconds(180)).until(serverPortFile::length, (length) -> { if (!process.isAlive()) { throw new IllegalStateException("Application failed to start"); } diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/ApplicationBuilder.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/ApplicationBuilder.java index 198c8ec420..2b02843546 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/ApplicationBuilder.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/ApplicationBuilder.java @@ -36,13 +36,11 @@ import org.apache.maven.shared.invoker.InvocationResult; import org.apache.maven.shared.invoker.MavenInvocationException; import org.springframework.util.FileCopyUtils; -import org.springframework.util.StringUtils; import static org.assertj.core.api.Assertions.assertThat; /** - * Builds a Spring Boot application using Maven. To use this class, the {@code maven.home} - * system property must be set. + * Builds a Spring Boot application using Maven. * * @author Andy Wilkinson */ @@ -121,12 +119,9 @@ class ApplicationBuilder { } private File writeSettingsXml(File appFolder) throws IOException { - String repository = System.getProperty("repository"); - if (!StringUtils.hasText(repository)) { - return null; - } Map context = new HashMap<>(); - context.put("repository", repository); + context.put("repository", new File("build/test-repository").toURI().toURL()); + context.put("localRepository", new File("build/local-m2-repository").getAbsolutePath()); File settingsXml = new File(appFolder, "settings.xml"); try (FileWriter out = new FileWriter(settingsXml); FileReader templateReader = new FileReader("src/test/resources/settings-template.xml")) { @@ -160,7 +155,9 @@ class ApplicationBuilder { if (settingsXml != null) { invocation.setUserSettingsFile(settingsXml); } - InvocationResult execute = new DefaultInvoker().execute(invocation); + DefaultInvoker invoker = new DefaultInvoker(); + invoker.setMavenHome(new File("build/maven-binaries/apache-maven-3.6.2")); + InvocationResult execute = invoker.execute(invocation); assertThat(execute.getExitCode()).isEqualTo(0); } diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/EmbeddedServerContainerInvocationContextProvider.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/EmbeddedServerContainerInvocationContextProvider.java index cf09b7fb04..083d0ad3b7 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/EmbeddedServerContainerInvocationContextProvider.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/EmbeddedServerContainerInvocationContextProvider.java @@ -27,6 +27,8 @@ import java.util.Map; import java.util.Set; import java.util.stream.Stream; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.client.StandardHttpRequestRetryHandler; import org.junit.jupiter.api.extension.AfterAllCallback; import org.junit.jupiter.api.extension.Extension; import org.junit.jupiter.api.extension.ExtensionContext; @@ -39,6 +41,7 @@ import org.junit.platform.commons.util.ReflectionUtils; import org.springframework.boot.testsupport.BuildOutput; import org.springframework.http.client.ClientHttpResponse; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.util.FileSystemUtils; import org.springframework.util.StringUtils; import org.springframework.web.client.ResponseErrorHandler; @@ -154,7 +157,8 @@ class EmbeddedServerContainerInvocationContextProvider @Override public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { - RestTemplate rest = new RestTemplate(); + RestTemplate rest = new RestTemplate(new HttpComponentsClientHttpRequestFactory( + HttpClients.custom().setRetryHandler(new StandardHttpRequestRetryHandler(10, false)).build())); rest.setErrorHandler(new ResponseErrorHandler() { @Override diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/ExplodedApplicationLauncher.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/ExplodedApplicationLauncher.java index 2370caa7d1..5e9be691a2 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/ExplodedApplicationLauncher.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/ExplodedApplicationLauncher.java @@ -80,6 +80,7 @@ class ExplodedApplicationLauncher extends AbstractApplicationLauncher { extracted.mkdirs(); } else { + extracted.getParentFile().mkdirs(); FileOutputStream extractedOutputStream = new FileOutputStream(extracted); StreamUtils.copy(jarFile.getInputStream(jarEntry), extractedOutputStream); extractedOutputStream.close(); diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/Versions.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/Versions.java index 5d7a5fbc02..4028cd0255 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/Versions.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/Versions.java @@ -16,43 +16,28 @@ package org.springframework.boot.context.embedded; -import java.io.File; -import java.io.FileReader; - -import javax.xml.xpath.XPath; -import javax.xml.xpath.XPathFactory; - -import org.xml.sax.InputSource; - -import org.springframework.util.StringUtils; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Properties; /** - * Provides access to dependency versions by querying the project's pom. + * Provides access to the current Boot version by referring to {@code gradle.properties}. * * @author Andy Wilkinson */ final class Versions { - private static final String PROPERTIES = "/*[local-name()='project']/*[local-name()='properties']"; - private Versions() { } static String getBootVersion() { - String baseDir = StringUtils.cleanPath(new File(".").getAbsolutePath()); - String mainBaseDir = evaluateExpression("pom.xml", PROPERTIES + "/*[local-name()='main.basedir']/text()"); - mainBaseDir = mainBaseDir.replace("${basedir}", baseDir); - return evaluateExpression(mainBaseDir + "/pom.xml", PROPERTIES + "/*[local-name()='revision']/text()"); - } - - private static String evaluateExpression(String file, String expression) { - try { - InputSource source = new InputSource(new FileReader(file)); - XPath xpath = XPathFactory.newInstance().newXPath(); - return xpath.compile(expression).evaluate(source); + Properties gradleProperties = new Properties(); + try (FileInputStream input = new FileInputStream("../../../gradle.properties")) { + gradleProperties.load(input); + return gradleProperties.getProperty("version"); } - catch (Exception ex) { - throw new IllegalStateException("Failed to evaluate expression", ex); + catch (IOException ex) { + throw new RuntimeException(ex); } } diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/resources/settings-template.xml b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/resources/settings-template.xml index 5cf9a073f9..8f5030fac9 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/resources/settings-template.xml +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/resources/settings-template.xml @@ -1,6 +1,7 @@ + {{localRepository}} repository diff --git a/spring-boot-tests/spring-boot-smoke-tests-invoker/pom.xml b/spring-boot-tests/spring-boot-smoke-tests-invoker/pom.xml deleted file mode 100644 index 9dc633c60c..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests-invoker/pom.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-parent - ${revision} - ../../spring-boot-project/spring-boot-parent - - spring-boot-smoke-tests-invoker - pom - Spring Boot Smoke Tests Invoker - Spring Boot Smoke Tests Invoker - - ${basedir}/../.. - - - - - - org.apache.maven.plugins - maven-invoker-plugin - false - - ${main.basedir}/spring-boot-tests/spring-boot-smoke-tests - ${skipTests} - true - - pom.xml - - - - - integration-test - install - - run - - - - - - org.apache.maven.plugins - maven-antrun-plugin - false - - - clean-smoke-tests - clean - - run - - - - - - - - - - - - - org.apache.maven.plugins - maven-clean-plugin - false - - - clean-smoke-tests - clean - - clean - - - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/pom.xml deleted file mode 100644 index 10de667638..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/pom.xml +++ /dev/null @@ -1,206 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - ${revision} - ../../spring-boot-project/spring-boot-starters/spring-boot-starter-parent - - spring-boot-smoke-tests - pom - Spring Boot Smoke Tests - Spring Boot Smoke Tests - - ${basedir}/../.. - 1.8 - false - - - spring-boot-smoke-test-ant - spring-boot-smoke-test-activemq - spring-boot-smoke-test-actuator - spring-boot-smoke-test-actuator-log4j2 - spring-boot-smoke-test-actuator-noweb - spring-boot-smoke-test-actuator-ui - spring-boot-smoke-test-actuator-custom-security - spring-boot-smoke-test-amqp - spring-boot-smoke-test-animated-banner - spring-boot-smoke-test-aop - spring-boot-smoke-test-atmosphere - spring-boot-smoke-test-batch - spring-boot-smoke-test-cache - spring-boot-smoke-test-custom-layout - spring-boot-smoke-test-data-cassandra - spring-boot-smoke-test-data-couchbase - spring-boot-smoke-test-data-elasticsearch - spring-boot-smoke-test-data-jdbc - spring-boot-smoke-test-data-jpa - spring-boot-smoke-test-data-ldap - spring-boot-smoke-test-data-mongodb - spring-boot-smoke-test-data-neo4j - spring-boot-smoke-test-data-redis - spring-boot-smoke-test-data-rest - spring-boot-smoke-test-data-solr - spring-boot-smoke-test-devtools - spring-boot-smoke-test-flyway - spring-boot-smoke-test-hateoas - spring-boot-smoke-test-hibernate52 - spring-boot-smoke-test-integration - spring-boot-smoke-test-jersey - spring-boot-smoke-test-jetty - spring-boot-smoke-test-jetty-jsp - spring-boot-smoke-test-jetty-ssl - spring-boot-smoke-test-jooq - spring-boot-smoke-test-jpa - spring-boot-smoke-test-jta-atomikos - spring-boot-smoke-test-jta-bitronix - spring-boot-smoke-test-jta-jndi - spring-boot-smoke-test-junit-jupiter - spring-boot-smoke-test-junit-vintage - spring-boot-smoke-test-kafka - spring-boot-smoke-test-liquibase - spring-boot-smoke-test-logback - spring-boot-smoke-test-oauth2-client - spring-boot-smoke-test-oauth2-resource-server - spring-boot-smoke-test-parent-context - spring-boot-smoke-test-profile - spring-boot-smoke-test-property-validation - spring-boot-smoke-test-quartz - spring-boot-smoke-test-reactive-oauth2-client - spring-boot-smoke-test-reactive-oauth2-resource-server - spring-boot-smoke-test-rsocket - spring-boot-smoke-test-saml2-service-provider - spring-boot-smoke-test-secure - spring-boot-smoke-test-secure-jersey - spring-boot-smoke-test-secure-webflux - spring-boot-smoke-test-servlet - spring-boot-smoke-test-session - spring-boot-smoke-test-session-webflux - spring-boot-smoke-test-simple - spring-boot-smoke-test-test - spring-boot-smoke-test-test-nomockito - spring-boot-smoke-test-testng - spring-boot-smoke-test-tomcat - spring-boot-smoke-test-tomcat-jsp - spring-boot-smoke-test-tomcat-ssl - spring-boot-smoke-test-tomcat-multi-connectors - spring-boot-smoke-test-traditional - spring-boot-smoke-test-undertow - spring-boot-smoke-test-undertow-ssl - spring-boot-smoke-test-war - spring-boot-smoke-test-web-freemarker - spring-boot-smoke-test-web-groovy-templates - spring-boot-smoke-test-web-jsp - spring-boot-smoke-test-web-method-security - spring-boot-smoke-test-web-mustache - spring-boot-smoke-test-web-secure - spring-boot-smoke-test-web-secure-custom - spring-boot-smoke-test-web-secure-jdbc - spring-boot-smoke-test-web-static - spring-boot-smoke-test-web-ui - spring-boot-smoke-test-webflux - spring-boot-smoke-test-webflux-coroutines - spring-boot-smoke-test-websocket-jetty - spring-boot-smoke-test-websocket-tomcat - spring-boot-smoke-test-websocket-undertow - spring-boot-smoke-test-webservices - spring-boot-smoke-test-xml - - - - - - - org.codehaus.mojo - flatten-maven-plugin - true - - - flatten - process-resources - - flatten - - - true - oss - - - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*Tests.java - - - **/Abstract*.java - - - file:/dev/./urandom - true - - - - - org.apache.maven.plugins - maven-enforcer-plugin - - - enforce-rules - - enforce - - - - - - commons-logging:*:* - - true - - - true - - - - - - org.apache.maven.plugins - maven-install-plugin - - true - - - - org.apache.maven.plugins - maven-javadoc-plugin - - true - - true - - - - - - fast - - - fast - - - - true - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-activemq/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-activemq/build.gradle new file mode 100644 index 0000000000..b1de23afa1 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-activemq/build.gradle @@ -0,0 +1,11 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Actuator ActiveMQ smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-activemq') + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-activemq/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-activemq/pom.xml deleted file mode 100644 index 94d0db4ada..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-activemq/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-activemq - Spring Boot ActiveMQ Smoke Test - Spring Boot ActiveMQ Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-activemq - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-custom-security/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-custom-security/build.gradle new file mode 100644 index 0000000000..02c2597511 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-custom-security/build.gradle @@ -0,0 +1,17 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Actuator custom security smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-actuator') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-freemarker') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-security') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + runtimeOnly 'org.jolokia:jolokia-core' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testRuntimeOnly 'org.apache.httpcomponents:httpclient' +} \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-custom-security/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-custom-security/pom.xml deleted file mode 100644 index de0f0b25f8..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-custom-security/pom.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-actuator-custom-security - Spring Boot Actuator Custom Security Smoke Test - Spring Boot Actuator Custom Security Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-freemarker - - - org.springframework.boot - spring-boot-starter-security - - - org.jolokia - jolokia-core - - - - org.apache.httpcomponents - httpclient - runtime - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-log4j2/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-log4j2/build.gradle new file mode 100644 index 0000000000..25f853b428 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-log4j2/build.gradle @@ -0,0 +1,20 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Actuator Log4j 2 smoke test' + +configurations.all { + exclude module: 'spring-boot-starter-logging' +} + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-actuator') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-log4j2') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-security') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-log4j2/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-log4j2/pom.xml deleted file mode 100644 index a697d566f9..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-log4j2/pom.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-actuator-log4j2 - Spring Boot Actuator Log4j 2 Smoke Test - Spring Boot Actuator Log4j 2 Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-logging - - - - - org.springframework.boot - spring-boot-starter-log4j2 - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-security - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-noweb/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-noweb/build.gradle new file mode 100644 index 0000000000..c031508fc0 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-noweb/build.gradle @@ -0,0 +1,14 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Actuator non-web smoke test' + +dependencies { + annotationProcessor project(':spring-boot-project:spring-boot-tools:spring-boot-configuration-processor') + + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-actuator') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-noweb/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-noweb/pom.xml deleted file mode 100644 index 863864bd57..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-noweb/pom.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-actuator-noweb - Spring Boot Actuator Non-Web Smoke Test - Spring Boot Actuator Non-Web Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-actuator - - - - org.springframework.boot - spring-boot-configuration-processor - true - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-ui/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-ui/build.gradle new file mode 100644 index 0000000000..65379711f0 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-ui/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Actuator UI smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-actuator') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-freemarker') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-security') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-ui/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-ui/pom.xml deleted file mode 100644 index d53df3d901..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-ui/pom.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-actuator-ui - Spring Boot Actuator UI Smoke Test - Spring Boot Actuator UI Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-freemarker - - - org.springframework.boot - spring-boot-starter-security - - - org.jolokia - jolokia-core - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/build.gradle new file mode 100644 index 0000000000..6626aa97dc --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/build.gradle @@ -0,0 +1,17 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Actuator smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-actuator') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jdbc') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-security') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + runtimeOnly 'com.h2database:h2' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testRuntimeOnly 'org.apache.httpcomponents:httpclient' +} \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/pom.xml deleted file mode 100644 index 4093b2cb40..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/pom.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-actuator - Spring Boot Actuator Smoke Test - Spring Boot Actuator Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-jdbc - - - - org.apache.httpcomponents - httpclient - runtime - - - com.h2database - h2 - runtime - - - - org.springframework.boot - spring-boot-configuration-processor - true - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - true - - - - generate build info - - build-info - - - - ${project.build.sourceEncoding} - ${project.reporting.outputEncoding} - ${maven.compiler.source} - ${maven.compiler.target} - - - - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/src/main/resources/META-INF/build-info.properties b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/src/main/resources/META-INF/build-info.properties new file mode 100644 index 0000000000..1ca9f92804 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/src/main/resources/META-INF/build-info.properties @@ -0,0 +1,5 @@ +build.artifact=spring-boot-smoke-test-actuator +build.encoding.source=UTF-8 +build.encoding.reporting=UTF-8 +build.java.source=1.8 +build.java.target=1.8 \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/build.gradle new file mode 100644 index 0000000000..0d4dbfb422 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/build.gradle @@ -0,0 +1,10 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot AMQP smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-amqp') +} \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/pom.xml deleted file mode 100644 index 66e0dd896c..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-amqp/pom.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-amqp - Spring Boot AMQP Smoke Test - Spring Boot AMQP Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-amqp - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-animated-banner/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-animated-banner/build.gradle new file mode 100644 index 0000000000..2b04032ab9 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-animated-banner/build.gradle @@ -0,0 +1,10 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot animated banner smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter') +} \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-animated-banner/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-animated-banner/pom.xml deleted file mode 100644 index b62aff0376..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-animated-banner/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-animated-banner - Spring Boot Animated Banner Smoke Test - Spring Boot Animated Banner Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-ant/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-ant/build.gradle new file mode 100644 index 0000000000..9b26aae89d --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-ant/build.gradle @@ -0,0 +1,69 @@ +plugins { + id 'org.springframework.boot.conventions' + id 'java-base' +} + +description = 'Spring Boot Ant smoke test' + +configurations { + antDependencies + testRepository +} + +sourceSets { + test +} + +plugins.withType(EclipsePlugin) { + eclipse { + classpath { + plusConfigurations = [configurations.testRuntimeClasspath] + } + } +} + +dependencies { + antDependencies 'org.apache.ivy:ivy:2.4.0' + antDependencies project(path: ':spring-boot-project:spring-boot-tools:spring-boot-antlib') + + testRepository project(path: ':spring-boot-project:spring-boot-tools:spring-boot-loader', configuration: 'mavenRepository') + testRepository project(path: ':spring-boot-project:spring-boot-starters:spring-boot-starter', configuration: 'mavenRepository') + + testImplementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + testImplementation project(path: ':spring-boot-project:spring-boot-tools:spring-boot-loader-tools') + testImplementation 'org.assertj:assertj-core' + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.springframework:spring-core' +} + +task syncTestRepository(type: Sync) { + destinationDir = file("${buildDir}/test-repository") + from configurations.testRepository + rename { + it.replaceAll('-[0-9]+\\.[0-9]+-[0-9]+\\.', '-SNAPSHOT.') + } +} + +ant.importBuild('build.xml') { + 'ant' + it +} +ant.properties['ant-spring-boot.version'] = project.version +ant.properties['projectDir'] = project.layout.projectDirectory + +antresolve { + dependsOn syncTestRepository, configurations.antDependencies + doFirst { + ClassLoader antClassLoader = org.apache.tools.ant.Project.class.classLoader + configurations.antDependencies.each { antClassLoader.addURL it.toURI().toURL() } + } +} + +task test(type: Test) { + dependsOn antbuild + testClassesDirs = sourceSets.test.output.classesDirs + classpath = sourceSets.test.runtimeClasspath +} + +check { + dependsOn test +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-ant/build.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-ant/build.xml index 31e5018195..1cc4fcae34 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-ant/build.xml +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-ant/build.xml @@ -11,7 +11,6 @@ actual jars). Run with '$ java -jar target/*.jar'. - @@ -26,11 +25,11 @@ - + - + @@ -38,7 +37,7 @@ - + @@ -48,7 +47,7 @@ - + diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-ant/ivysettings.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-ant/ivysettings.xml index a96e5a5c7f..37ccec0280 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-ant/ivysettings.xml +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-ant/ivysettings.xml @@ -4,8 +4,8 @@ - - + + diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-ant/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-ant/pom.xml deleted file mode 100644 index cf2a8c9675..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-ant/pom.xml +++ /dev/null @@ -1,107 +0,0 @@ - - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-ant - Spring Boot Ant Smoke Test - Spring Boot Ant Smoke Test - - ${basedir}/../../.. - 1.9.3 - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-loader - - - org.springframework.boot - spring-boot-starter-test - - - org.springframework.boot - spring-boot-antlib - ${project.version} - - - - org.springframework.boot - spring-boot-loader-tools - test - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - default-compile - none - - - - - org.apache.maven.plugins - maven-antrun-plugin - - - antbuild - package - - - - - - - - run - - - - - - org.apache.ant - ant - ${ant.version} - - - org.apache.ivy - ivy - 2.4.0 - - - org.springframework.boot - spring-boot-antlib - ${revision} - - - - - org.apache.maven.plugins - maven-failsafe-plugin - - - - integration-test - verify - - - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-ant/src/test/java/smoketest/ant/SampleAntApplicationIT.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-ant/src/test/java/smoketest/ant/SampleAntApplicationIT.java index 51e870bff4..9d0f7cde7b 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-ant/src/test/java/smoketest/ant/SampleAntApplicationIT.java +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-ant/src/test/java/smoketest/ant/SampleAntApplicationIT.java @@ -38,7 +38,7 @@ public class SampleAntApplicationIT { @Test void runJar() throws Exception { - File target = new File("target"); + File target = new File("build/ant/libs"); File[] jarFiles = target.listFiles(new FileFilter() { @Override diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-aop/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-aop/build.gradle new file mode 100644 index 0000000000..7c7c7fa9d3 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-aop/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot AOP smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-aop') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-aop/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-aop/pom.xml deleted file mode 100644 index 8a47c6a21a..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-aop/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-aop - Spring Boot AOP Smoke Test - Spring Boot AOP Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-aop - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-atmosphere/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-atmosphere/build.gradle new file mode 100644 index 0000000000..75edfaedf1 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-atmosphere/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Atmosphere smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + implementation 'org.atmosphere:atmosphere-runtime:2.4.14' + runtimeOnly 'org.webjars:atmosphere-javascript:2.3.4' + + testImplementation enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'org.springframework:spring-websocket' +} \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-atmosphere/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-atmosphere/pom.xml deleted file mode 100644 index d3b7058a5c..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-atmosphere/pom.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-atmosphere - Spring Boot Atmosphere Smoke Test - Spring Boot Atmosphere Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-web - - - javax.inject - javax.inject - 1 - - - org.atmosphere - atmosphere-runtime - 2.4.14 - - - org.webjars - atmosphere-javascript - 2.3.4 - - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework - spring-websocket - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-batch/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-batch/build.gradle new file mode 100644 index 0000000000..2af7bc92de --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-batch/build.gradle @@ -0,0 +1,13 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Batch smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-batch') + runtimeOnly 'org.hsqldb:hsqldb' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-batch/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-batch/pom.xml deleted file mode 100644 index 3249ad312e..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-batch/pom.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-batch - Spring Boot Batch Smoke Test - Spring Boot Batch Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-batch - - - - org.hsqldb - hsqldb - runtime - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-cache/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-cache/build.gradle new file mode 100644 index 0000000000..3f1c407436 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-cache/build.gradle @@ -0,0 +1,46 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot cache smoke test' + +def caches = [ + 'caffeine': [ + 'com.github.ben-manes.caffeine:caffeine' + ], + 'couchbase': [ + 'com.couchbase.client:java-client', + 'com.couchbase.client:couchbase-spring-cache' + ], + 'ehcache': [ + 'javax.cache:cache-api', + 'org.ehcache:ehcache' + ], + 'ehcache2': [ + 'net.sf.ehcache:ehcache' + ], + 'hazelcast': [ + 'com.hazelcast:hazelcast', + 'com.hazelcast:hazelcast-spring' + ], + 'infinispan': [ + 'org.infinispan:infinispan-jcache', + 'org.infinispan:infinispan-spring5-embedded' + ], + 'redis': [ + project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-redis') + ] +] + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-actuator') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-cache') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + if (project.hasProperty('cache')) { + caches[project.getProperty('cache')].each { runtimeOnly it } + } + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-cache/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-cache/pom.xml deleted file mode 100644 index 79e99e6b2f..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-cache/pom.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-cache - Spring Boot Cache Smoke Test - Spring Boot Cache Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-cache - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-actuator - - - - javax.cache - cache-api - - - org.ehcache - ehcache - runtime - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/pom.xml deleted file mode 100644 index a87f8d0575..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/pom.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-custom-layout - Spring Boot Custom Layout Smoke Test - Spring Boot Custom Layout Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-loader-tools - - - - - - org.apache.maven.plugins - maven-invoker-plugin - - ${project.build.directory}/local-repo - - - - prepare-integration-test - pre-integration-test - - install - - - - integration-test - integration-test - - run - - - ${project.build.directory}/it - src/it/settings.xml - verify - true - ${skipTests} - true - - - - - - org.apache.maven.plugins - maven-antrun-plugin - - - cleanup-local-integration-repo - pre-integration-test - - run - - - - - - - - - - - - - org.apache.maven.plugins - maven-failsafe-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/custom/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/custom/pom.xml deleted file mode 100644 index 2216ebfca8..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/custom/pom.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - custom - 0.0.1.BUILD-SNAPSHOT - - 1.8 - 1.8 - UTF-8 - - - - - org.springframework.boot - spring-boot-maven-plugin - @project.version@ - - - - repackage - - - - custom - - - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/custom/verify.groovy b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/custom/verify.groovy deleted file mode 100644 index 7da68e56a2..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/custom/verify.groovy +++ /dev/null @@ -1,6 +0,0 @@ -import java.io.*; -import smoketest.layout.*; - -Verify.verify( - new File(basedir, "target/custom-0.0.1.BUILD-SNAPSHOT.jar"), "custom" -) diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/default/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/default/pom.xml deleted file mode 100644 index 3937a72a21..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/default/pom.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - 4.0.0 - org.springframework.boot.maven.it - default - 0.0.1.BUILD-SNAPSHOT - - 1.8 - 1.8 - UTF-8 - - - - - org.springframework.boot - spring-boot-maven-plugin - @project.version@ - - - - repackage - - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/default/src/main/java/org/test/SampleApplication.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/default/src/main/java/org/test/SampleApplication.java deleted file mode 100644 index 672d96a2a6..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/default/src/main/java/org/test/SampleApplication.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2012-2019 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.test; - -public class SampleApplication { - - public static void main(String[] args) { - } - -} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/default/verify.groovy b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/default/verify.groovy deleted file mode 100644 index aca02ce428..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/default/verify.groovy +++ /dev/null @@ -1,6 +0,0 @@ -import java.io.*; -import smoketest.layout.*; - -Verify.verify( - new File(basedir, "target/default-0.0.1.BUILD-SNAPSHOT.jar"), "sample" -) diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/settings.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/settings.xml deleted file mode 100644 index e1e0ace341..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/it/settings.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - it-repo - - true - - - - local.central - @localRepositoryUrl@ - - true - - - true - - - - - - local.central - @localRepositoryUrl@ - - true - - - true - - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/test/java/smoketest/layout/Verify.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/test/java/smoketest/layout/Verify.java deleted file mode 100644 index f7d5c924e8..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-custom-layout/src/test/java/smoketest/layout/Verify.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2012-2019 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 smoketest.layout; - -import java.io.File; -import java.util.Enumeration; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; - -public final class Verify { - - private Verify() { - } - - public static void verify(File file, String entry) throws Exception { - try (ZipFile zipFile = new ZipFile(file)) { - Enumeration entries = zipFile.entries(); - while (entries.hasMoreElements()) { - if (entries.nextElement().getName().equals(entry)) { - return; - } - } - throw new AssertionError("No entry " + entry); - } - } - -} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/build.gradle new file mode 100644 index 0000000000..34c0983d74 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/build.gradle @@ -0,0 +1,40 @@ +buildscript { + dependencies { + classpath 'org.springframework:spring-core:5.2.2.RELEASE' + } +} + +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Data Cassandra smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-cassandra') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation('org.cassandraunit:cassandra-unit-spring:3.5.0.1') { + exclude group: 'org.slf4j', module: 'jcl-over-slf4j' + } +} + +test { + jvmArgumentProviders.add new CassandraPortsProvider() + enabled = !JavaVersion.current().java9Compatible +} + +class CassandraPortsProvider implements CommandLineArgumentProvider { + + @Override + Iterable asArguments() { + def ports = org.springframework.util.SocketUtils.findAvailableTcpPorts(2) + return [ + "-Dspring.data.cassandra.port=${ports[0]}", + "-Dcassandra.native_transport_port=${ports[0]}", + "-Dcassandra.port.storage=${ports[1]}" + ] + } + +} \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/pom.xml deleted file mode 100644 index 607cc194ee..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/pom.xml +++ /dev/null @@ -1,102 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-data-cassandra - Spring Boot Data Cassandra Smoke Test - Spring Boot Data Cassandra Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-data-cassandra - - - - org.springframework.boot - spring-boot-starter-test - test - - - org.cassandraunit - cassandra-unit-spring - 3.5.0.1 - test - - - org.slf4j - jcl-over-slf4j - - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - reserve-cassandra-port - - reserve-network-port - - process-resources - - - cassandra.port.native-transport - cassandra.port.storage - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - ${cassandra.port.native-transport} - ${cassandra.port.native-transport} - ${cassandra.port.storage} - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - java9+ - - [9,) - - - - - org.apache.maven.plugins - maven-surefire-plugin - - true - - - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-couchbase/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-couchbase/build.gradle new file mode 100644 index 0000000000..8480164a8e --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-couchbase/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Data Couchbase smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-couchbase') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-couchbase/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-couchbase/pom.xml deleted file mode 100644 index 58a8b51d99..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-couchbase/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - 4.0.0 - - spring-boot-smoke-tests - org.springframework.boot - ${revision} - - spring-boot-smoke-test-data-couchbase - Spring Boot Data Couchbase Smoke Test - Spring Boot Data Couchbase Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-data-couchbase - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-elasticsearch/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-elasticsearch/build.gradle new file mode 100644 index 0000000000..fa4759b310 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-elasticsearch/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Data Elasticsearch smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-elasticsearch') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-elasticsearch/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-elasticsearch/pom.xml deleted file mode 100644 index a7e1a39369..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-elasticsearch/pom.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-data-elasticsearch - Spring Boot Data Elasticsearch Smoke Test - Spring Boot Data Elasticsearch Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-data-elasticsearch - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jdbc/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jdbc/build.gradle new file mode 100644 index 0000000000..b91d1d72fb --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jdbc/build.gradle @@ -0,0 +1,14 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Data JDBC smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-jdbc') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + runtimeOnly 'com.h2database:h2' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jdbc/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jdbc/pom.xml deleted file mode 100755 index d631952f91..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jdbc/pom.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-data-jdbc - Spring Boot Data JDBC Smoke Test - Spring Boot Data JDBC Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-data-jdbc - - - org.springframework.boot - spring-boot-starter-web - - - - com.h2database - h2 - runtime - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jpa/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jpa/build.gradle new file mode 100644 index 0000000000..01abdb2150 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jpa/build.gradle @@ -0,0 +1,14 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Data JPA smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-jpa') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + runtimeOnly 'com.h2database:h2' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jpa/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jpa/pom.xml deleted file mode 100755 index 6a616898b3..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jpa/pom.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-data-jpa - Spring Boot Data JPA Smoke Test - Spring Boot Data JPA Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-web - - - - com.h2database - h2 - runtime - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-ldap/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-ldap/build.gradle new file mode 100644 index 0000000000..abcf5208e9 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-ldap/build.gradle @@ -0,0 +1,13 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Data LDAP smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-ldap') + runtimeOnly 'com.unboundid:unboundid-ldapsdk' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-ldap/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-ldap/pom.xml deleted file mode 100644 index 5dd86ff90b..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-ldap/pom.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-data-ldap - Spring Boot Data LDAP Smoke Test - Spring Boot Data LDAP Smoke Test - - ${basedir}/../../.. - - - - - com.unboundid - unboundid-ldapsdk - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-data-ldap - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-mongodb/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-mongodb/build.gradle new file mode 100644 index 0000000000..9d31618775 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-mongodb/build.gradle @@ -0,0 +1,13 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Data MongoDB smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-mongodb') + runtimeOnly 'de.flapdoodle.embed:de.flapdoodle.embed.mongo' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-mongodb/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-mongodb/pom.xml deleted file mode 100644 index 5b6c9509c0..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-mongodb/pom.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-data-mongodb - Spring Boot Data MongoDB Smoke Test - Spring Boot Data MongoDB Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-data-mongodb - - - de.flapdoodle.embed - de.flapdoodle.embed.mongo - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-neo4j/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-neo4j/build.gradle new file mode 100644 index 0000000000..0a5d557bdd --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-neo4j/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Data Neo4j smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-neo4j') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-neo4j/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-neo4j/pom.xml deleted file mode 100644 index 071ef99619..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-neo4j/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-data-neo4j - Spring Boot Data Neo4j Smoke Test - Spring Boot Data Neo4j Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-data-neo4j - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-redis/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-redis/build.gradle new file mode 100644 index 0000000000..9fb8091008 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-redis/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Data Redis smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-redis') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-redis/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-redis/pom.xml deleted file mode 100644 index f354ac153e..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-redis/pom.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-data-redis - Spring Boot Data Redis Smoke Test - Spring Boot Data Redis Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - production - - - - commons-pool - commons-pool - pom.lastUpdated - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-rest/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-rest/build.gradle new file mode 100644 index 0000000000..5eb4857318 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-rest/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Data REST smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-jpa') + implementation(project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-rest')) { + exclude module: 'spring-boot-starter-tomcat' + } + implementation 'com.h2database:h2' + + runtimeOnly project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jetty') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testRuntimeOnly 'com.jayway.jsonpath:json-path' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-rest/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-rest/pom.xml deleted file mode 100644 index 8268687c67..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-rest/pom.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-data-rest - Spring Boot Data REST Smoke Test - Spring Boot Data REST Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - org.springframework.boot - spring-boot-starter-jetty - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-data-rest - - - - com.h2database - h2 - runtime - - - - org.springframework.boot - spring-boot-starter-test - test - - - com.jayway.jsonpath - json-path - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - java9+ - - [9,) - - - - jakarta.xml.bind - jakarta.xml.bind-api - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-solr/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-solr/build.gradle new file mode 100644 index 0000000000..9575c1022e --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-solr/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Data Solr smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-solr') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-solr/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-solr/pom.xml deleted file mode 100644 index 69ba3dfcea..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-solr/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-data-solr - Spring Boot Data Solr Smoke Test - Spring Boot Data Solr Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-data-solr - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-devtools/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-devtools/build.gradle new file mode 100644 index 0000000000..f451df2412 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-devtools/build.gradle @@ -0,0 +1,20 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot DevTools smoke test' + +configurations { + developmentOnly + runtimeClasspath.extendsFrom developmentOnly +} + +dependencies { + developmentOnly project(':spring-boot-project:spring-boot-devtools') + + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-thymeleaf') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-devtools/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-devtools/pom.xml deleted file mode 100644 index bdab3466c0..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-devtools/pom.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-devtools - Spring Boot Developer Tools Smoke Test - Spring Boot Developer Tools Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-devtools - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-flyway/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-flyway/build.gradle new file mode 100644 index 0000000000..408d0ff3ea --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-flyway/build.gradle @@ -0,0 +1,17 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Flyway smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-actuator') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-jpa') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + runtimeOnly 'com.h2database:h2' + runtimeOnly 'org.flywaydb:flyway-core' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-flyway/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-flyway/pom.xml deleted file mode 100644 index 8bf6446af7..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-flyway/pom.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-flyway - Spring Boot Flyway Smoke Test - Spring Boot Flyway Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-actuator - - - org.flywaydb - flyway-core - - - - com.h2database - h2 - runtime - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - java9+ - - [9,) - - - - jakarta.xml.bind - jakarta.xml.bind-api - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hateoas/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hateoas/build.gradle new file mode 100644 index 0000000000..8b8163d150 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hateoas/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot HATEOAS smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-hateoas') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hateoas/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hateoas/pom.xml deleted file mode 100644 index b124977934..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hateoas/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-hateoas - Spring Boot Hateoas Smoke Test - Spring Boot Hateoas Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-hateoas - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hibernate52/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hibernate52/build.gradle new file mode 100644 index 0000000000..25972c05c1 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hibernate52/build.gradle @@ -0,0 +1,22 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Hibernate 5.2 smoke test' + +configurations.all { + resolutionStrategy { + force 'org.hibernate:hibernate-core:5.2.17.Final' + } +} + +dependencies { + implementation(project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-jpa')) { + exclude group: 'org.hibernate.javax.persistence', module: 'hibernate-jpa-2.1-api' + } + + runtimeOnly 'com.h2database:h2' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hibernate52/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hibernate52/pom.xml deleted file mode 100755 index 526fd2f360..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-hibernate52/pom.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-hibernate52 - Spring Boot Hibernate 5.2 Smoke Tests - ${project.name} - - ${basedir}/../../.. - 5.2.17.Final - - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - - com.h2database - h2 - runtime - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-integration/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-integration/build.gradle new file mode 100644 index 0000000000..960f09ca56 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-integration/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Integration smoke test' + +dependencies { + annotationProcessor project(':spring-boot-project:spring-boot-tools:spring-boot-configuration-processor') + + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-integration') + implementation 'org.springframework.integration:spring-integration-file' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'org.awaitility:awaitility' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-integration/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-integration/pom.xml deleted file mode 100644 index 9c2026d12b..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-integration/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-integration - Spring Boot Integration Smoke Test - Spring Boot Integration Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-integration - - - org.springframework.integration - spring-integration-file - - - - org.springframework.boot - spring-boot-configuration-processor - true - - - - org.springframework.boot - spring-boot-starter-test - test - - - org.awaitility - awaitility - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jersey/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jersey/build.gradle new file mode 100644 index 0000000000..7a3b3c2a2e --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jersey/build.gradle @@ -0,0 +1,18 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Jersey smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-actuator') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jersey') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-tomcat') + + if (JavaVersion.current().java9Compatible) { + runtimeOnly 'jakarta.xml.bind:jakarta.xml.bind-api' + } + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jersey/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jersey/pom.xml deleted file mode 100644 index d2d2b2164a..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jersey/pom.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-jersey - Spring Boot Jersey Smoke Test - Spring Boot Jersey Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-jersey - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-tomcat - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - generate build info - - build-info - - - - - - - - - java9+ - - [9,) - - - - jakarta.xml.bind - jakarta.xml.bind-api - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty-jsp/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty-jsp/build.gradle new file mode 100644 index 0000000000..75490b6c9c --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty-jsp/build.gradle @@ -0,0 +1,25 @@ +plugins { + id 'war' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Jetty JSP smoke test' + +dependencies { + compileOnly 'jakarta.servlet:jakarta.servlet-api' + compileOnly project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jetty') + + implementation(project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web')) { + exclude module: 'spring-boot-starter-tomcat' + } + + providedRuntime enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + providedRuntime('org.eclipse.jetty:apache-jsp') { + exclude group: 'javax.annotation', module: 'javax.annotation-api' + } + + runtimeOnly 'javax.servlet:jstl' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jetty') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty-jsp/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty-jsp/pom.xml deleted file mode 100644 index 795f4ddc70..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty-jsp/pom.xml +++ /dev/null @@ -1,125 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-jetty-jsp - war - Spring Boot Jetty JSP Smoke Test - Spring Boot Jetty JSP Smoke Test - - ${basedir}/../../.. - / - 3.1.0 - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - javax.servlet - jstl - - - - org.springframework.boot - spring-boot-starter-jetty - provided - - - jakarta.servlet - jakarta.servlet-api - - - - - org.eclipse.jetty - apache-jsp - provided - - - javax.annotation - javax.annotation-api - - - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - true - - - - org.apache.maven.plugins - maven-enforcer-plugin - - - enforce-rules - - enforce - - - - - - javax.servlet:javax.servlet-api:* - - true - - - true - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - false - - - - - - - java9+ - - [9,) - - - - - org.apache.maven.plugins - maven-surefire-plugin - - true - - - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty-ssl/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty-ssl/build.gradle new file mode 100644 index 0000000000..5c52b3e364 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty-ssl/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Jetty SSL smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jetty') + implementation(project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web')) { + exclude module: 'spring-boot-starter-tomcat' + } + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testRuntimeOnly 'org.apache.httpcomponents:httpclient' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty-ssl/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty-ssl/pom.xml deleted file mode 100644 index fffed29070..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty-ssl/pom.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-jetty-ssl - Spring Boot Jetty SSL Smoke Test - Spring Boot Jetty SSL Smoke Test - - ${basedir}/../../.. - 3.1.0 - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - org.springframework.boot - spring-boot-starter-jetty - - - - org.springframework.boot - spring-boot-starter-test - test - - - org.apache.httpcomponents - httpclient - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty/build.gradle new file mode 100644 index 0000000000..ae3b1c1f49 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Jetty smoke test' + +dependencies { + implementation(project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web')) { + exclude module: 'spring-boot-starter-tomcat' + } + + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jetty') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty/pom.xml deleted file mode 100644 index d36c7dbe1b..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jetty/pom.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-jetty - Spring Boot Jetty Smoke Test - Spring Boot Jetty Smoke Test - - ${basedir}/../../.. - 3.1.0 - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - org.springframework.boot - spring-boot-starter-jetty - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jooq/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jooq/build.gradle new file mode 100644 index 0000000000..790d9fd6a2 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jooq/build.gradle @@ -0,0 +1,43 @@ +// plugins { +// id 'java' +// id 'nu.studer.jooq' version '3.0.3' +// id 'org.springframework.boot.conventions' +// } +// +// description = 'Spring Boot JOOQ smoke test' +// +// dependencies { +// implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jooq') +// jooqRuntime enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) +// jooqRuntime 'com.h2database:h2' +// runtimeOnly 'com.h2database:h2' +// +// testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +// } +// +// jooq { +// version = '3.12.3' +// smokeTest(sourceSets.main) { +// jdbc { +// driver = 'org.h2.Driver' +// url = 'jdbc:h2:~/springbootjooq' +// } +// generator { +// name = 'org.jooq.codegen.DefaultGenerator' +// database { +// name = 'org.jooq.meta.h2.H2Database' +// includes = '.*' +// inputSchema = 'PUBLIC' +// } +// strategy { +// // name = 'smoketest.jooq.util.TangleFreeGeneratorStrategy' +// } +// target { +// packageName = 'smoketest.jooq.domain' +// } +// generate { +// records = false +// } +// } +// } +// } diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jooq/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jooq/pom.xml deleted file mode 100644 index e6e5c10cac..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jooq/pom.xml +++ /dev/null @@ -1,164 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-jooq - Spring Boot jOOQ Smoke Test - Spring Boot jOOQ Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-jooq - - - - com.h2database - h2 - runtime - - - - org.jooq - jooq-codegen - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - generate-sources - - add-source - - - - gensrc/main/java - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - generate - - - - maven-compiler-plugin - - - generate-jooq-utils - generate-sources - - compile - - false - - - smoketest/jooq/util/** - - - - - - - org.codehaus.mojo - sql-maven-plugin - 1.5 - - - generate-sources - - execute - - - - - - com.h2database - h2 - ${h2.version} - - - - org.h2.Driver - jdbc:h2:~/springbootjooq - - ${basedir}/src/main/resources/reset.sql - ${basedir}/src/main/resources/schema.sql - - - - - org.jooq - jooq-codegen-maven - - - - generate - - - - - - com.h2database - h2 - ${h2.version} - - - - - org.h2.Driver - jdbc:h2:~/springbootjooq - - - org.jooq.util.DefaultGenerator - - org.jooq.util.h2.H2Database - .* - - PUBLIC - - - smoketest.jooq.util.TangleFreeGeneratorStrategy - - - smoketest.jooq.domain - ${basedir}/gensrc/main/java - - - false - - - - - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jpa/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jpa/build.gradle new file mode 100644 index 0000000000..b6e319a8a8 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jpa/build.gradle @@ -0,0 +1,25 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot JPA smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-freemarker') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + implementation 'jakarta.persistence:jakarta.persistence-api' + if (JavaVersion.current().java9Compatible) { + implementation 'jakarta.xml.bind:jakarta.xml.bind-api' + } + implementation('org.hibernate:hibernate-core') { + exclude group: 'javax.activation', module: 'javax.activation-api' + exclude group: 'javax.persistence', module: 'javax.persistence-api' + exclude group: 'javax.xml.bind', module: 'jaxb-api' + } + implementation 'org.springframework:spring-orm' + + runtimeOnly 'com.h2database:h2' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jpa/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jpa/pom.xml deleted file mode 100644 index 3a718411f5..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jpa/pom.xml +++ /dev/null @@ -1,87 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-jpa - Spring Boot JPA Smoke Test - Spring Boot JPA Smoke Test - - ${basedir}/../../.. - - - - - jakarta.persistence - jakarta.persistence-api - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-freemarker - - - org.springframework - spring-orm - - - org.hibernate - hibernate-core - - - javax.xml.bind - jaxb-api - - - javax.persistence - javax.persistence-api - - - javax.activation - javax.activation-api - - - - - - com.h2database - h2 - runtime - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - java9+ - - [9,) - - - - jakarta.xml.bind - jakarta.xml.bind-api - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jta-atomikos/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jta-atomikos/build.gradle new file mode 100644 index 0000000000..46979b6018 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jta-atomikos/build.gradle @@ -0,0 +1,23 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Atomikos JTA smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-artemis') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-jpa') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jta-atomikos') + if (JavaVersion.current().java9Compatible) { + implementation 'jakarta.xml.bind:jakarta.xml.bind-api' + } + implementation 'org.springframework:spring-jms' + + runtimeOnly 'com.h2database:h2' + runtimeOnly('org.apache.activemq:artemis-jms-server') { + exclude group: 'org.apache.geronimo.specs', module: 'geronimo-jms_2.0_spec' + } + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jta-atomikos/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jta-atomikos/pom.xml deleted file mode 100644 index b117c9ec0a..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jta-atomikos/pom.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-jta-atomikos - Spring Boot Atomikos JTA Smoke Test - Spring Boot Atomikos JTA Smoke Test - - ${basedir}/../../.. - - - - - org.springframework - spring-jms - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-jta-atomikos - - - org.springframework.boot - spring-boot-starter-artemis - - - org.apache.activemq - artemis-jms-server - - - geronimo-jms_2.0_spec - org.apache.geronimo.specs - - - - - com.h2database - h2 - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - java9+ - - [9,) - - - - jakarta.xml.bind - jakarta.xml.bind-api - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jta-bitronix/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jta-bitronix/build.gradle new file mode 100644 index 0000000000..c30bea68d4 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jta-bitronix/build.gradle @@ -0,0 +1,23 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Bitronix JTA smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-artemis') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-jpa') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jta-bitronix') + if (JavaVersion.current().java9Compatible) { + implementation 'jakarta.xml.bind:jakarta.xml.bind-api' + } + implementation 'org.springframework:spring-jms' + + runtimeOnly 'com.h2database:h2' + runtimeOnly('org.apache.activemq:artemis-jms-server') { + exclude group: 'org.apache.geronimo.specs', module: 'geronimo-jms_2.0_spec' + } + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jta-bitronix/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jta-bitronix/pom.xml deleted file mode 100644 index fbc875808f..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jta-bitronix/pom.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-jta-bitronix - Spring Boot Bitronix JTA Smoke Test - Spring Boot Bitronix JTA Smoke Test - - ${basedir}/../../.. - - - - - org.springframework - spring-jms - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-jta-bitronix - - - org.springframework.boot - spring-boot-starter-artemis - - - org.apache.activemq - artemis-jms-server - - - geronimo-jms_2.0_spec - org.apache.geronimo.specs - - - - - com.h2database - h2 - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - java9+ - - [9,) - - - - jakarta.xml.bind - jakarta.xml.bind-api - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jta-jndi/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jta-jndi/pom.xml deleted file mode 100644 index d69a7e7d7f..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jta-jndi/pom.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-jta-jndi - Spring Boot JNDI JTA Smoke Test - war - Spring Boot JNDI JTA Smoke Test - - ${basedir}/../../.. - - - - - org.springframework - spring-jms - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - - jakarta.servlet - jakarta.servlet-api - provided - - - jakarta.jms - jakarta.jms-api - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - spring-boot-smoke-test-jta-jndi - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-junit-jupiter/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-junit-jupiter/build.gradle new file mode 100644 index 0000000000..d48beca8ba --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-junit-jupiter/build.gradle @@ -0,0 +1,26 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot JUnit Jupiter smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + testImplementation(project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test')) { + exclude group: 'org.junit.vintage' + } +} + +test { + testLogging { + afterSuite { description, result -> + if (!description.parent) { + if (!result.testCount) { + throw new GradleException('No tests were executed') + } + } + } + } +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-junit-jupiter/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-junit-jupiter/pom.xml deleted file mode 100644 index 1c661d1f34..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-junit-jupiter/pom.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-junit-jupiter - Spring Boot JUnit Jupiter Smoke Test - Spring Boot JUnit Jupiter Smoke Test - - ${basedir}/../../.. - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-test - test - - - org.junit.vintage - junit-vintage-engine - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - org.apache.maven.plugins - maven-surefire-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-junit-vintage/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-junit-vintage/build.gradle new file mode 100644 index 0000000000..2ae43e941a --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-junit-vintage/build.gradle @@ -0,0 +1,24 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot JUnit Vintage smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + testImplementation(project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test')) +} + +test { + testLogging { + afterSuite { description, result -> + if (!description.parent) { + if (!result.testCount) { + throw new GradleException('No tests were executed') + } + } + } + } +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-junit-vintage/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-junit-vintage/pom.xml deleted file mode 100644 index 6452cb757f..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-junit-vintage/pom.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-junit-vintage - Spring Boot JUnit Vintage Smoke Test - Spring Boot JUnit Vintage Smoke Test - - ${basedir}/../../.. - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-test - test - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/build.gradle new file mode 100644 index 0000000000..2abfa04180 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Kafka smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-json') + implementation 'org.springframework.kafka:spring-kafka' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'org.awaitility:awaitility' + testImplementation 'org.springframework.kafka:spring-kafka-test' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/pom.xml deleted file mode 100644 index 2b0b0fd109..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/pom.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-kafka - Spring Boot Kafka Smoke Test - Spring Boot Kafka Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-json - - - org.springframework.kafka - spring-kafka - - - - org.springframework.boot - spring-boot-starter-test - test - - - org.awaitility - awaitility - test - - - org.springframework.kafka - spring-kafka-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-liquibase/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-liquibase/build.gradle new file mode 100644 index 0000000000..9ca130e1ee --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-liquibase/build.gradle @@ -0,0 +1,17 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Liquibase smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-actuator') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jdbc') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + implementation 'org.liquibase:liquibase-core' + + runtimeOnly 'com.h2database:h2' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-liquibase/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-liquibase/pom.xml deleted file mode 100644 index 0454135098..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-liquibase/pom.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-liquibase - Spring Boot Liquibase Smoke Test - Spring Boot Liquibase Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-jdbc - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-actuator - - - org.liquibase - liquibase-core - - - - com.h2database - h2 - runtime - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-logback/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-logback/build.gradle new file mode 100644 index 0000000000..9889556499 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-logback/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Logback smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-logback/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-logback/pom.xml deleted file mode 100644 index fe1daa14a1..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-logback/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-logback - Spring Boot Logback Smoke Test - Spring Boot Logback Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-oauth2-client/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-oauth2-client/build.gradle new file mode 100644 index 0000000000..3d14d0b45b --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-oauth2-client/build.gradle @@ -0,0 +1,14 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot OAuth2 Client smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-oauth2-client') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'org.apache.httpcomponents:httpclient' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-oauth2-client/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-oauth2-client/pom.xml deleted file mode 100644 index 4682992ad3..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-oauth2-client/pom.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-oauth2-client - Spring Boot OAuth2 Client Smoke Test - Spring Boot OAuth2 Client Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-oauth2-client - - - org.springframework.boot - spring-boot-starter-web - - - - org.apache.httpcomponents - httpclient - test - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-oauth2-resource-server/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-oauth2-resource-server/build.gradle new file mode 100644 index 0000000000..ff995cdfe2 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-oauth2-resource-server/build.gradle @@ -0,0 +1,14 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot OAuth2 Resource Server smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-oauth2-resource-server') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'com.squareup.okhttp3:mockwebserver:3.9.0' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-oauth2-resource-server/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-oauth2-resource-server/pom.xml deleted file mode 100644 index 08064623a6..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-oauth2-resource-server/pom.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-oauth2-resource-server - Spring Boot OAuth2 Resource Server Smoke Test - Spring Boot OAuth2 Resource Server Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-oauth2-resource-server - - - org.springframework.boot - spring-boot-starter-web - - - - com.squareup.okhttp3 - mockwebserver - 3.9.0 - test - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-parent-context/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-parent-context/build.gradle new file mode 100644 index 0000000000..4596ddac2b --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-parent-context/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot parent context smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-integration') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-actuator') + implementation 'org.springframework.integration:spring-integration-file' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'org.awaitility:awaitility' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-parent-context/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-parent-context/pom.xml deleted file mode 100644 index 970261a078..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-parent-context/pom.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-parent-context - Spring Boot Parent Context Smoke Test - Spring Boot Parent Context Smoke Test - - smoketest.parent.SampleParentContextApplication - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-integration - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.integration - spring-integration-file - - - - org.springframework.boot - spring-boot-starter-test - test - - - org.awaitility - awaitility - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-profile/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-profile/build.gradle new file mode 100644 index 0000000000..70937058ff --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-profile/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot profile smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-profile/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-profile/pom.xml deleted file mode 100644 index c450b9540a..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-profile/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-profile - Spring Boot Profile Smoke Test - Spring Boot Profile Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-property-validation/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-property-validation/build.gradle new file mode 100644 index 0000000000..e430ee65d9 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-property-validation/build.gradle @@ -0,0 +1,14 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot property validation smoke test' + +dependencies { + annotationProcessor project(':spring-boot-project:spring-boot-tools:spring-boot-configuration-processor') + + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-property-validation/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-property-validation/pom.xml deleted file mode 100644 index 772aac45c5..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-property-validation/pom.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-property-validation - Spring Boot Property Validation Smoke Test - Spring Boot Property Validation Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-configuration-processor - true - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-quartz/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-quartz/build.gradle new file mode 100644 index 0000000000..792ce334e8 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-quartz/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Quartz smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jdbc') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-quartz') + + runtimeOnly 'com.h2database:h2' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'org.awaitility:awaitility' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-quartz/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-quartz/pom.xml deleted file mode 100644 index a31b639a03..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-quartz/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-quartz - Spring Boot Quartz Smoke Test - Spring Boot Quartz Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-jdbc - - - org.springframework.boot - spring-boot-starter-quartz - - - - com.h2database - h2 - runtime - - - - org.springframework.boot - spring-boot-starter-test - test - - - org.awaitility - awaitility - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-reactive-oauth2-client/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-reactive-oauth2-client/build.gradle new file mode 100644 index 0000000000..7415212766 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-reactive-oauth2-client/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot reactive OAuth 2 client smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-actuator') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-oauth2-client') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-webflux') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'org.apache.httpcomponents:httpclient' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-reactive-oauth2-client/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-reactive-oauth2-client/pom.xml deleted file mode 100644 index 4ea448e9d6..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-reactive-oauth2-client/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-reactive-oauth2-client - Spring Boot Reactive OAuth2 Client Smoke Test - Spring Boot Reactive OAuth2 Client Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-oauth2-client - - - org.springframework.boot - spring-boot-starter-webflux - - - - org.apache.httpcomponents - httpclient - test - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-reactive-oauth2-resource-server/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-reactive-oauth2-resource-server/build.gradle new file mode 100644 index 0000000000..0aee1a03c4 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-reactive-oauth2-resource-server/build.gradle @@ -0,0 +1,14 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot reactive OAuth 2 resource server smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-oauth2-resource-server') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-webflux') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'com.squareup.okhttp3:mockwebserver:3.9.0' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-reactive-oauth2-resource-server/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-reactive-oauth2-resource-server/pom.xml deleted file mode 100644 index 89056132a7..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-reactive-oauth2-resource-server/pom.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-reactive-oauth2-resource-server - Spring Boot Reactive OAuth2 Resource Server Smoke Test - Spring Boot OAuth2 Reactive Resource Server Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-oauth2-resource-server - - - org.springframework.boot - spring-boot-starter-webflux - - - - com.squareup.okhttp3 - mockwebserver - 3.9.0 - test - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-rsocket/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-rsocket/build.gradle new file mode 100644 index 0000000000..6176f9e03a --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-rsocket/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot RSocket smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-rsocket') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-security') + implementation 'org.springframework.security:spring-security-rsocket' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'io.projectreactor:reactor-test' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-rsocket/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-rsocket/pom.xml deleted file mode 100644 index 99bfae491f..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-rsocket/pom.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-rsocket - Spring Boot RSocket Smoke Test - Spring Boot RSocket Smoke Test - - ${basedir}/../../.. - / - - - - - org.springframework.boot - spring-boot-starter-rsocket - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.security - spring-security-rsocket - - - - org.springframework.boot - spring-boot-starter-test - test - - - io.projectreactor - reactor-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-saml2-service-provider/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-saml2-service-provider/build.gradle new file mode 100644 index 0000000000..9cf22b2ea3 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-saml2-service-provider/build.gradle @@ -0,0 +1,14 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot SAML 2 service provider smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + implementation 'org.springframework.security:spring-security-config' + implementation 'org.springframework.security:spring-security-saml2-service-provider' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-saml2-service-provider/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-saml2-service-provider/pom.xml deleted file mode 100644 index a09b044368..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-saml2-service-provider/pom.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-saml2-service-provider - Spring Boot SAML2 Service Provider Smoke Test - Spring Boot SAML2 Service Provider Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.security - spring-security-config - - - org.springframework.security - spring-security-saml2-service-provider - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure-jersey/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure-jersey/build.gradle new file mode 100644 index 0000000000..c8d2548a58 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure-jersey/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot secure Jersey smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-actuator') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jersey') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-security') + implementation 'org.jolokia:jolokia-core' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure-jersey/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure-jersey/pom.xml deleted file mode 100644 index 5ad8da0f5d..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure-jersey/pom.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-secure-jersey - jar - Spring Boot Secure Jersey Smoke Test - Spring Boot Secure Jersey Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-jersey - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-security - - - org.jolokia - jolokia-core - - - - org.springframework.boot - spring-boot-starter-tomcat - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - generate build info - - build-info - - - - - - - - - java9+ - - [9,) - - - - javax.xml.bind - jaxb-api - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure-webflux/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure-webflux/build.gradle new file mode 100644 index 0000000000..66f73aedce --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure-webflux/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot secure WebFlux smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-actuator') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-security') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-webflux') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'io.projectreactor:reactor-test' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure-webflux/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure-webflux/pom.xml deleted file mode 100644 index c92dcf5052..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure-webflux/pom.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-secure-webflux - Spring Boot Secure WebFlux Smoke Test - Spring Boot Secure WebFlux Smoke Test - - ${basedir}/../../.. - / - - - - - org.springframework.boot - spring-boot-starter-webflux - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-security - - - - org.springframework.boot - spring-boot-starter-test - test - - - io.projectreactor - reactor-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - generate build info - - build-info - - - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure/build.gradle new file mode 100644 index 0000000000..e4bd622b0b --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Security smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-security') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure/pom.xml deleted file mode 100644 index 8e3eec4a94..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-secure/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-secure - Spring Boot Security Smoke Test - Spring Boot Security Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-security - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-servlet/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-servlet/build.gradle new file mode 100644 index 0000000000..3cd180ab43 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-servlet/build.gradle @@ -0,0 +1,14 @@ +plugins { + id 'war' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Servlet smoke test' + +dependencies { + compileOnly project(':spring-boot-project:spring-boot-starters:spring-boot-starter-tomcat') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-security') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testRuntimeOnly project(':spring-boot-project:spring-boot-starters:spring-boot-starter-tomcat') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-servlet/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-servlet/pom.xml deleted file mode 100644 index e40be5a1b0..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-servlet/pom.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-servlet - war - Spring Boot Servlet Smoke Test - Spring Boot Servlet Smoke Test - - ${basedir}/../../.. - / - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-security - - - - org.springframework.boot - spring-boot-starter-tomcat - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-session-webflux/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-session-webflux/build.gradle new file mode 100644 index 0000000000..4fee4d429f --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-session-webflux/build.gradle @@ -0,0 +1,27 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Session WebFlux smoke test' + +def sessionStores = [ + 'mongodb': [ + project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-mongodb-reactive'), + 'de.flapdoodle.embed:de.flapdoodle.embed.mongo', + 'org.springframework.session:spring-session-data-mongodb' + ], + 'redis': [ + project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-redis-reactive'), + 'org.springframework.session:spring-session-data-redis' + ] +] + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-security') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-webflux') + + sessionStores[project.findProperty('sessionStore') ?: 'mongodb'].each { runtimeOnly it } + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-session-webflux/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-session-webflux/pom.xml deleted file mode 100644 index 4028c68679..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-session-webflux/pom.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-session-webflux - Spring Boot Session WebFlux Smoke Test - Spring Boot Session WebFlux Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-webflux - - - org.springframework.boot - spring-boot-starter-security - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - redis - - - org.springframework.session - spring-session-data-redis - - - org.springframework.boot - spring-boot-starter-data-redis-reactive - - - - - mongodb - - true - - - - org.springframework.session - spring-session-data-mongodb - - - org.springframework.boot - spring-boot-starter-data-mongodb-reactive - - - de.flapdoodle.embed - de.flapdoodle.embed.mongo - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-session/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-session/build.gradle new file mode 100644 index 0000000000..46cc84d54a --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-session/build.gradle @@ -0,0 +1,36 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Session smoke test' + +def sessionStores = [ + 'hazelcast': [ + 'com.hazelcast:hazelcast', + 'org.springframework.session:spring-session-hazelcast' + ], + 'jdbc': [ + project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jdbc'), + 'org.springframework.session:spring-session-jdbc' , + 'com.h2database:h2' + ], + 'mongodb': [ + project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-mongodb'), + 'org.springframework.session:spring-session-data-mongodb' + ], + 'redis': [ + project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-redis'), + 'org.springframework.session:spring-session-data-redis' + ] +] + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-actuator') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-security') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + sessionStores[project.findProperty('sessionStore') ?: 'jdbc'].each { runtimeOnly it } + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-session/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-session/pom.xml deleted file mode 100644 index a806f3a006..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-session/pom.xml +++ /dev/null @@ -1,105 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-session - Spring Boot Session Smoke Test - Spring Boot Session Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-actuator - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - redis - - - org.springframework.session - spring-session-data-redis - - - org.springframework.boot - spring-boot-starter-data-redis - - - - - jdbc - - true - - - - org.springframework.session - spring-session-jdbc - - - org.springframework.boot - spring-boot-starter-jdbc - - - com.h2database - h2 - - - - - hazelcast - - - org.springframework.session - spring-session-hazelcast - - - com.hazelcast - hazelcast - - - - - mongodb - - - org.springframework.session - spring-session-data-mongodb - - - org.springframework.boot - spring-boot-starter-data-mongodb - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-simple/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-simple/build.gradle new file mode 100644 index 0000000000..c038dfeb9a --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-simple/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Simple smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + implementation 'jakarta.validation:jakarta.validation-api' + implementation('org.hibernate.validator:hibernate-validator') { + exclude group: 'javax.validation' + } + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-simple/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-simple/pom.xml deleted file mode 100644 index 7fca8bb43a..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-simple/pom.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-simple - Spring Boot Simple Smoke Test - Spring Boot Simple Smoke Test - - ${basedir}/../../.. - - - - - jakarta.validation - jakarta.validation-api - - - org.springframework.boot - spring-boot-starter - - - org.hibernate.validator - hibernate-validator - - - javax.validation - validation-api - - - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test-nomockito/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test-nomockito/build.gradle new file mode 100644 index 0000000000..88d23d3fa8 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test-nomockito/build.gradle @@ -0,0 +1,18 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Test no Mockito smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + runtimeOnly 'com.h2database:h2' + + testImplementation project(':spring-boot-project:spring-boot-test') + testImplementation 'org.assertj:assertj-core' + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.springframework:spring-test' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test-nomockito/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test-nomockito/pom.xml deleted file mode 100644 index 6f239374fd..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test-nomockito/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-test-nomockito - Spring Boot Test No Mockito Smoke Test - Spring Boot Test No Mockito Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-test - test - - - org.assertj - assertj-core - test - - - org.junit.jupiter - junit-jupiter-engine - test - - - org.springframework - spring-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test/build.gradle new file mode 100644 index 0000000000..b4470ce126 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test/build.gradle @@ -0,0 +1,18 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Test smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-data-jpa') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + runtimeOnly 'com.h2database:h2' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'org.seleniumhq.selenium:selenium-api' + testImplementation 'org.seleniumhq.selenium:htmlunit-driver' + testImplementation 'net.sourceforge.htmlunit:htmlunit' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test/pom.xml deleted file mode 100644 index fc6c5a58d8..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test/pom.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-test - Spring Boot Test Smoke Test - Spring Boot Test Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.seleniumhq.selenium - selenium-api - - - com.h2database - h2 - - - mysql - mysql-connector-java - - - - org.springframework.boot - spring-boot-starter-test - test - - - org.seleniumhq.selenium - htmlunit-driver - test - - - net.sourceforge.htmlunit - htmlunit - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - java9+ - - [9,) - - - - jakarta.xml.bind - jakarta.xml.bind-api - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-testng/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-testng/build.gradle new file mode 100644 index 0000000000..0bfa9d67c6 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-testng/build.gradle @@ -0,0 +1,21 @@ +plugins { + id 'java' +// id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot TestNG smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-tomcat') + implementation 'org.springframework:spring-webmvc' + + testImplementation project(':spring-boot-project:spring-boot-test') + testImplementation 'org.assertj:assertj-core' + testImplementation 'org.springframework:spring-test' + testImplementation 'org.testng:testng:6.8.13' +} + +test { + useTestNG() +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-testng/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-testng/pom.xml deleted file mode 100644 index 28c4100b31..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-testng/pom.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-testng - Spring Boot TestNG Smoke Test - Spring Boot TestNG Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-tomcat - - - org.springframework - spring-webmvc - - - - org.springframework - spring-test - test - - - org.springframework.boot - spring-boot-test - test - - - org.testng - testng - 6.8.13 - test - - - org.assertj - assertj-core - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-testng/src/test/java/smoketest/testng/SampleTestNGApplicationTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-testng/src/test/java/smoketest/testng/SampleTestNGApplicationTests.java index 84cf1b164b..0d382dbc08 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-testng/src/test/java/smoketest/testng/SampleTestNGApplicationTests.java +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-testng/src/test/java/smoketest/testng/SampleTestNGApplicationTests.java @@ -34,13 +34,13 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Phillip Webb */ @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) -class SampleTestNGApplicationTests extends AbstractTestNGSpringContextTests { +public class SampleTestNGApplicationTests extends AbstractTestNGSpringContextTests { @Autowired private TestRestTemplate restTemplate; @Test - void testHome() { + public void testHome() { ResponseEntity entity = this.restTemplate.getForEntity("/", String.class); assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(entity.getBody()).isEqualTo("Hello World"); diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-jsp/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-jsp/build.gradle new file mode 100644 index 0000000000..e7b096cfcc --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-jsp/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'war' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Tomcat JSP smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + providedRuntime project(':spring-boot-project:spring-boot-starters:spring-boot-starter-tomcat') + providedRuntime 'javax.servlet:jstl' + providedRuntime 'org.apache.tomcat.embed:tomcat-embed-jasper' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-jsp/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-jsp/pom.xml deleted file mode 100644 index 09a70d9579..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-jsp/pom.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-tomcat-jsp - war - Spring Boot Tomcat JSP Smoke Test - Spring Boot Tomcat JSP Smoke Test - - ${basedir}/../../.. - / - - - - - org.springframework.boot - spring-boot-starter-web - - - javax.servlet - jstl - - - - org.apache.tomcat.embed - tomcat-embed-jasper - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - org.apache.maven.plugins - maven-surefire-plugin - - false - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-multi-connectors/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-multi-connectors/build.gradle new file mode 100644 index 0000000000..5079c8f8a0 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-multi-connectors/build.gradle @@ -0,0 +1,13 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Tomcat multi-connectors smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'org.apache.httpcomponents:httpclient' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-multi-connectors/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-multi-connectors/pom.xml deleted file mode 100644 index 7aef1489a8..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-multi-connectors/pom.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-tomcat-multi-connectors - Spring Boot Multi-Connector Tomcat Smoke Test - Spring Boot Multi-Connector Tomcat Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - org.apache.httpcomponents - httpclient - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-ssl/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-ssl/build.gradle new file mode 100644 index 0000000000..08d55bdb6c --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-ssl/build.gradle @@ -0,0 +1,13 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Tomcat SSL smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'org.apache.httpcomponents:httpclient' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-ssl/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-ssl/pom.xml deleted file mode 100644 index 4b9acb73d4..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat-ssl/pom.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-tomcat-ssl - Spring Boot Tomcat SSL Smoke Test - Spring Boot Tomcat SSL Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - org.apache.httpcomponents - httpclient - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat/build.gradle new file mode 100644 index 0000000000..befc755c95 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat/build.gradle @@ -0,0 +1,14 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Tomcat smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-tomcat') + implementation 'org.springframework:spring-webmvc' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat/pom.xml deleted file mode 100644 index 1be0cce0f2..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-tomcat/pom.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-tomcat - Spring Boot Tomcat Smoke Test - Spring Boot Tomcat Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-tomcat - - - org.springframework - spring-webmvc - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-traditional/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-traditional/build.gradle new file mode 100644 index 0000000000..a526875314 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-traditional/build.gradle @@ -0,0 +1,17 @@ +plugins { + id 'war' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot traditional deployment smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + implementation 'org.springframework:spring-webmvc' + + providedRuntime project(':spring-boot-project:spring-boot-starters:spring-boot-starter-tomcat') + providedRuntime 'org.apache.tomcat.embed:tomcat-embed-jasper' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'org.apache.httpcomponents:httpclient' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-traditional/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-traditional/pom.xml deleted file mode 100644 index be279b47f7..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-traditional/pom.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-traditional - war - Spring Boot Traditional Smoke Test - Spring Boot Traditional Smoke Test - - ${basedir}/../../.. - / - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework - spring-webmvc - - - - org.springframework.boot - spring-boot-starter-tomcat - provided - - - org.apache.tomcat.embed - tomcat-embed-jasper - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-undertow-ssl/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-undertow-ssl/build.gradle new file mode 100644 index 0000000000..0af2b289b4 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-undertow-ssl/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Undertow SSL smoke test' + +dependencies { + implementation(project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web')) { + exclude module: 'spring-boot-starter-tomcat' + } + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-undertow') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'org.apache.httpcomponents:httpclient' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-undertow-ssl/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-undertow-ssl/pom.xml deleted file mode 100644 index bf42c11505..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-undertow-ssl/pom.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-undertow-ssl - Spring Boot Undertow SSL Smoke Test - Spring Boot Undertow SSL Smoke Test - - ${basedir}/../../.. - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - org.springframework.boot - spring-boot-starter-undertow - - - - org.springframework.boot - spring-boot-starter-test - test - - - org.apache.httpcomponents - httpclient - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-undertow/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-undertow/build.gradle new file mode 100644 index 0000000000..1296d950eb --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-undertow/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Undertow smoke test' + +dependencies { + implementation(project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web')) { + exclude module: 'spring-boot-starter-tomcat' + } + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-undertow') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-undertow/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-undertow/pom.xml deleted file mode 100644 index 6596725af7..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-undertow/pom.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-undertow - Spring Boot Undertow Smoke Test - Spring Boot Undertow Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - org.springframework.boot - spring-boot-starter-undertow - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-war/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-war/build.gradle new file mode 100644 index 0000000000..dc133506d3 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-war/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'war' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot war smoke test' + +dependencies { + implementation(project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web')) { + exclude module: 'spring-boot-starter-tomcat' + } + providedCompile enforcedPlatform(project(':spring-boot-project:spring-boot-dependencies')) + providedCompile 'jakarta.servlet:jakarta.servlet-api' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-war/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-war/pom.xml deleted file mode 100644 index 4c3dcf6e74..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-war/pom.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-war - war - Spring Boot War Smoke Test - Spring Boot War Smoke Test - - ${basedir}/../../.. - / - - - - - org.springframework.boot - spring-boot-starter - - - - jakarta.servlet - jakarta.servlet-api - provided - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - - org.springframework.boot - spring-boot-devtools - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - tomcat - - - org.springframework.boot - spring-boot-starter-tomcat - provided - - - - - jetty - - - org.springframework.boot - spring-boot-starter-jetty - provided - - - - - undertow - - - org.springframework.boot - spring-boot-starter-undertow - provided - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-freemarker/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-freemarker/build.gradle new file mode 100644 index 0000000000..5a509586ca --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-freemarker/build.gradle @@ -0,0 +1,13 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot web FreeMarker smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-freemarker') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-freemarker/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-freemarker/pom.xml deleted file mode 100644 index 290e34877a..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-freemarker/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-web-freemarker - Spring Boot Web FreeMarker Smoke Test - Spring Boot Web FreeMarker Smoke Test - - ${basedir}/../../.. - / - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-freemarker - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - true - - - - org.apache.maven.plugins - maven-surefire-plugin - - false - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-groovy-templates/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-groovy-templates/build.gradle new file mode 100644 index 0000000000..5079cdb18e --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-groovy-templates/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot web Groovy Templates smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-groovy-templates') + if (JavaVersion.current().java9Compatible) { + implementation 'jakarta.xml.bind:jakarta.xml.bind-api' + } + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-groovy-templates/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-groovy-templates/pom.xml deleted file mode 100755 index b383378db9..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-groovy-templates/pom.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-web-groovy-templates - Spring Boot Web Groovy Templates Smoke Test - Spring Boot Web Groovy Templates Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-groovy-templates - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - java9+ - - [9,) - - - - jakarta.xml.bind - jakarta.xml.bind-api - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-jsp/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-jsp/build.gradle new file mode 100644 index 0000000000..259deb0cdd --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-jsp/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'war' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot web JSP smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + providedRuntime project(':spring-boot-project:spring-boot-starters:spring-boot-starter-tomcat') + providedRuntime 'javax.servlet:jstl' + providedRuntime 'org.apache.tomcat.embed:tomcat-embed-jasper' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-jsp/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-jsp/pom.xml deleted file mode 100644 index 1d98da2480..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-jsp/pom.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-web-jsp - war - Spring Boot Web JSP Smoke Test - Spring Boot Web JSP Smoke Test - - ${basedir}/../../.. - / - - - - - org.springframework.boot - spring-boot-starter-web - - - javax.servlet - jstl - - - - org.springframework.boot - spring-boot-starter-tomcat - provided - - - org.apache.tomcat.embed - tomcat-embed-jasper - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - org.apache.maven.plugins - maven-surefire-plugin - - false - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-method-security/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-method-security/build.gradle new file mode 100644 index 0000000000..4aaafa2627 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-method-security/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot web method security smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-actuator') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-security') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-thymeleaf') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-method-security/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-method-security/pom.xml deleted file mode 100644 index acaceaa052..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-method-security/pom.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-web-method-security - Spring Boot Web Method Security Smoke Test - Spring Boot Web Method Security Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-mustache/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-mustache/build.gradle new file mode 100644 index 0000000000..6153f7d148 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-mustache/build.gradle @@ -0,0 +1,13 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot web Mustache smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-mustache') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-mustache/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-mustache/pom.xml deleted file mode 100644 index 4e37f23b7d..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-mustache/pom.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-web-mustache - Spring Boot Web Mustache Smoke Test - Spring Boot Web Mustache Smoke Test - - ${basedir}/../../.. - / - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-mustache - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - org.apache.maven.plugins - maven-surefire-plugin - - false - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure-custom/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure-custom/build.gradle new file mode 100644 index 0000000000..00bb73374d --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure-custom/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot web secure custom smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-security') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-thymeleaf') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'org.apache.httpcomponents:httpclient' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure-custom/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure-custom/pom.xml deleted file mode 100644 index 14b8eed03b..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure-custom/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-web-secure-custom - Spring Boot Web Secure Custom Smoke Test - Spring Boot Web Secure Custom Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - - org.apache.httpcomponents - httpclient - test - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure-jdbc/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure-jdbc/build.gradle new file mode 100644 index 0000000000..38a45ceeae --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure-jdbc/build.gradle @@ -0,0 +1,18 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot web secure JDBC smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jdbc') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-security') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-thymeleaf') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + runtimeOnly 'com.h2database:h2' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'org.apache.httpcomponents:httpclient' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure-jdbc/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure-jdbc/pom.xml deleted file mode 100644 index 2cdd189e06..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure-jdbc/pom.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-web-secure-jdbc - Spring Boot Web Secure JDBC Smoke Test - Spring Boot Web Secure JDBC Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-jdbc - - - com.h2database - h2 - - - - org.apache.httpcomponents - httpclient - test - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure/build.gradle new file mode 100644 index 0000000000..6c37b1940c --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot web secure smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-actuator') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-security') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-thymeleaf') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'org.apache.httpcomponents:httpclient' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure/pom.xml deleted file mode 100644 index 23c5128793..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-secure/pom.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-web-secure - Spring Boot Web Secure Smoke Test - Spring Boot Web Secure Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - - org.apache.httpcomponents - httpclient - test - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-static/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-static/build.gradle new file mode 100644 index 0000000000..36752d7f4b --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-static/build.gradle @@ -0,0 +1,17 @@ +plugins { + id 'war' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot web static smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + providedRuntime project(':spring-boot-project:spring-boot-starters:spring-boot-starter-tomcat') + + runtimeOnly 'org.webjars:bootstrap:3.0.3' + runtimeOnly 'org.webjars:jquery:2.0.3-1' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-static/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-static/pom.xml deleted file mode 100644 index 026ed3c5d1..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-static/pom.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-web-static - war - Spring Boot Web Static Smoke Test - Spring Boot Web Static Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-web - - - org.webjars - bootstrap - 3.0.3 - - - org.webjars - jquery - 2.0.3-1 - - - - org.springframework.boot - spring-boot-starter-tomcat - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-ui/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-ui/build.gradle new file mode 100644 index 0000000000..bececbfb5d --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-ui/build.gradle @@ -0,0 +1,13 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot web UI smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-thymeleaf') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-ui/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-ui/pom.xml deleted file mode 100755 index e7eb246205..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-ui/pom.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-web-ui - Spring Boot Web UI Smoke Test - Spring Boot Web UI Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-devtools - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webflux-coroutines/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webflux-coroutines/build.gradle new file mode 100644 index 0000000000..c9303314ef --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webflux-coroutines/build.gradle @@ -0,0 +1,30 @@ +plugins { + id 'org.jetbrains.kotlin.jvm' + id 'org.jetbrains.kotlin.plugin.spring' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot WebFlux coroutines smoke test' + +compileKotlin { + kotlinOptions { + jvmTarget = '1.8' + } +} + +compileTestKotlin { + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-webflux') + implementation 'com.fasterxml.jackson.module:jackson-module-kotlin' + implementation 'org.jetbrains.kotlin:kotlin-reflect' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-reactor' + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'io.projectreactor:reactor-test' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webflux-coroutines/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webflux-coroutines/pom.xml deleted file mode 100644 index a7396bfd16..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webflux-coroutines/pom.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-webflux-coroutines - Spring Boot WebFlux Coroutines Smoke Test - Spring Boot WebFlux Coroutines Smoke Test - - ${basedir}/../../.. - / - - - - - org.springframework.boot - spring-boot-starter-webflux - - - - org.jetbrains.kotlin - kotlin-reflect - - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - - - org.jetbrains.kotlinx - kotlinx-coroutines-reactor - - - - com.fasterxml.jackson.module - jackson-module-kotlin - - - - org.springframework.boot - spring-boot-starter-test - test - - - - ${project.basedir}/src/main/kotlin - ${project.basedir}/src/test/kotlin - - - org.springframework.boot - spring-boot-maven-plugin - - - org.jetbrains.kotlin - kotlin-maven-plugin - - - -Xjsr305=strict - - - spring - - - - - org.jetbrains.kotlin - kotlin-maven-allopen - ${kotlin.version} - - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webflux/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webflux/build.gradle new file mode 100644 index 0000000000..75a3810821 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webflux/build.gradle @@ -0,0 +1,14 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot WebFlux smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-actuator') + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-webflux') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') + testImplementation 'io.projectreactor:reactor-test' +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webflux/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webflux/pom.xml deleted file mode 100644 index 92f01fbcef..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webflux/pom.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-webflux - Spring Boot WebFlux Smoke Test - Spring Boot WebFlux Smoke Test - - ${basedir}/../../.. - / - - - - - org.springframework.boot - spring-boot-starter-webflux - - - org.springframework.boot - spring-boot-starter-actuator - - - - org.springframework.boot - spring-boot-starter-test - test - - - io.projectreactor - reactor-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - generate build info - - build-info - - - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webservices/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webservices/build.gradle new file mode 100644 index 0000000000..3de88c8ed9 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webservices/build.gradle @@ -0,0 +1,21 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot Web Services smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-web-services') + implementation 'org.jdom:jdom2' + + runtimeOnly 'jaxen:jaxen' + runtimeOnly 'wsdl4j:wsdl4j' + + if (JavaVersion.current().java11Compatible) { + runtimeOnly 'jakarta.activation:jakarta.activation-api' + runtimeOnly 'org.glassfish.jaxb:jaxb-runtime' + } + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webservices/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webservices/pom.xml deleted file mode 100644 index ca75ff62fe..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-webservices/pom.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-webservices - Spring Boot Web Services Smoke Test - Spring Boot Web Services Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-web-services - - - jaxen - jaxen - - - org.jdom - jdom2 - - - wsdl4j - wsdl4j - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - java11+ - - [11,) - - - - jakarta.activation - jakarta.activation-api - - - org.glassfish.jaxb - jaxb-runtime - - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-jetty/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-jetty/build.gradle new file mode 100644 index 0000000000..1adb130385 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-jetty/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot WebSocket Jetty smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-jetty') + implementation(project(':spring-boot-project:spring-boot-starters:spring-boot-starter-websocket')) { + exclude module: 'spring-boot-starter-tomcat' + } + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-jetty/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-jetty/pom.xml deleted file mode 100755 index 1c03905144..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-jetty/pom.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-websocket-jetty - Spring Boot WebSocket Jetty Smoke Test - Spring Boot WebSocket Jetty Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-websocket - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - org.springframework.boot - spring-boot-starter-jetty - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-tomcat/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-tomcat/build.gradle new file mode 100644 index 0000000000..36f289fc46 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-tomcat/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot WebSocket Tomcat smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-websocket') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-tomcat/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-tomcat/pom.xml deleted file mode 100755 index fed614e0c8..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-tomcat/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-websocket-tomcat - Spring Boot WebSocket Tomcat Smoke Test - Spring Boot WebSocket Tomcat Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-websocket - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-undertow/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-undertow/build.gradle new file mode 100644 index 0000000000..4d6e98bd4a --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-undertow/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot WebSocket Undertow smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-undertow') + implementation(project(':spring-boot-project:spring-boot-starters:spring-boot-starter-websocket')) { + exclude module: 'spring-boot-starter-tomcat' + } + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-undertow/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-undertow/pom.xml deleted file mode 100755 index cf44c04ed7..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-websocket-undertow/pom.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-websocket-undertow - Spring Boot WebSocket Undertow Smoke Test - Spring Boot WebSocket Undertow Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter-websocket - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - org.springframework.boot - spring-boot-starter-undertow - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-xml/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-xml/build.gradle new file mode 100644 index 0000000000..86c2cc77cb --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-xml/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'java' + id 'org.springframework.boot.conventions' +} + +description = 'Spring Boot XML smoke test' + +dependencies { + implementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter') + + testImplementation project(':spring-boot-project:spring-boot-starters:spring-boot-starter-test') +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-xml/pom.xml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-xml/pom.xml deleted file mode 100644 index d4a9abb4d9..0000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-xml/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-smoke-tests - ${revision} - - spring-boot-smoke-test-xml - Spring Boot XML Smoke Test - Spring Boot XML Smoke Test - - ${basedir}/../../.. - - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/src/checkstyle/checkstyle-suppressions.xml b/src/checkstyle/checkstyle-suppressions.xml index 1f7a85c547..8361ff02ee 100644 --- a/src/checkstyle/checkstyle-suppressions.xml +++ b/src/checkstyle/checkstyle-suppressions.xml @@ -42,4 +42,6 @@ + + diff --git a/src/checkstyle/checkstyle.xml b/src/checkstyle/checkstyle.xml index 22449bf754..e759f663af 100644 --- a/src/checkstyle/checkstyle.xml +++ b/src/checkstyle/checkstyle.xml @@ -3,8 +3,11 @@ "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN" "https://checkstyle.org/dtds/configuration_1_3.dtd"> + + + - + @@ -20,7 +23,7 @@ + value="${config_loc}/import-control.xml" />