Support for experimental reactiver starter

This commit adds support for the experimental reactive starter. When
that starter is selected, the version of Spring Framework and Reactor are
automatically overridden and the java version is forced to 1.8

This starter includes an additional BOM that provides dependency
management for reactive-related dependencies (typically netty).
This commit is contained in:
Stephane Nicoll 2016-07-19 16:33:33 +02:00
parent af2ae44b8d
commit ae2b596735
4 changed files with 208 additions and 0 deletions

View File

@ -24,6 +24,23 @@
<groupId>io.spring.initializr</groupId>
<artifactId>initializr-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.spring.initializr</groupId>
<artifactId>initializr-generator</artifactId>
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>xmlunit</groupId>
<artifactId>xmlunit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>

View File

@ -0,0 +1,32 @@
package io.spring.initializr.service.extension
import io.spring.initializr.generator.ProjectRequest
import io.spring.initializr.generator.ProjectRequestPostProcessorAdapter
import io.spring.initializr.metadata.InitializrMetadata
import org.springframework.stereotype.Component
/**
* The "web-reactive" starter is experimental as Spring Boot hasn't integrated Spring 5
* yet. This {@link io.spring.initializr.generator.ProjectRequestPostProcessor} forces
* Java 8 as well as Spring 5 and Reactor 3.
*
* @author Stephane Nicoll
*/
@Component
class ReactiveProjectRequestPostProcessor extends ProjectRequestPostProcessorAdapter {
@Override
void postProcessAfterResolution(ProjectRequest request, InitializrMetadata metadata) {
if (request.resolvedDependencies.find { it.id.equals('experimental-web-reactive') }) {
request.javaVersion = '1.8'
// No need to override those versions with Gradle
if ('maven'.equals(request.build)) {
request.buildProperties.versions['spring.version'] = { '5.0.0.BUILD-SNAPSHOT' }
request.buildProperties.versions['reactor.version'] = { '3.0.0.BUILD-SNAPSHOT' }
}
}
}
}

View File

@ -43,6 +43,10 @@ initializr:
version: 1.0.0.BUILD-SNAPSHOT
additionalBoms: [cloud-bom]
repositories: spring-snapshots,spring-milestones
experimental-reactive-bom:
groupId: org.springframework.boot.experimental
artifactId: spring-boot-dependencies-web-reactive
version: 0.1.0.BUILD-SNAPSHOT
scs-bom:
groupId: io.pivotal.spring.cloud
artifactId: spring-cloud-services-dependencies
@ -53,6 +57,16 @@ initializr:
kotlin:
version: 1.0.3
dependencies:
- name: Experimental
content:
- name: Reactive Web
id: experimental-web-reactive
groupId: org.springframework.boot.experimental
artifactId: spring-boot-starter-web-reactive
bom: experimental-reactive-bom
versionRange: 1.4.0.RC1
repository: spring-snapshots
description: Reactive web development with Tomcat and Spring Reactive (experimental)
- name: Core
content:
- name: Security

View File

@ -0,0 +1,145 @@
package io.spring.initializr.service.extension
import io.spring.initializr.generator.ProjectGenerator
import io.spring.initializr.generator.ProjectRequest
import io.spring.initializr.metadata.InitializrMetadata
import io.spring.initializr.metadata.InitializrMetadataBuilder
import io.spring.initializr.metadata.InitializrMetadataProvider
import io.spring.initializr.metadata.InitializrProperties
import io.spring.initializr.test.generator.GradleBuildAssert
import io.spring.initializr.test.generator.PomAssert
import io.spring.initializr.web.support.DefaultInitializrMetadataProvider
import org.junit.Test
import org.junit.runner.RunWith
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.context.TestConfiguration
import org.springframework.context.annotation.Bean
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner
import org.springframework.web.client.RestTemplate
/**
* Tests for {@link ReactiveProjectRequestPostProcessor}.
*
* @author Stephane Nicoll
*/
@RunWith(SpringJUnit4ClassRunner)
@SpringBootTest
class ReactiveProjectRequestPostProcessorTests {
@Autowired
private ProjectGenerator projectGenerator
@Autowired
private InitializrMetadataProvider metadataProvider
@Test
void java8IsMandatoryMaven() {
ProjectRequest request = createProjectRequest('experimental-web-reactive')
request.bootVersion = '1.4.0.BUILD-SNAPSHOT'
request.javaVersion = '1.7'
generateMavenPom(request).hasJavaVersion('1.8')
}
@Test
void java8IsMandatoryGradle() {
ProjectRequest request = createProjectRequest('experimental-web-reactive')
request.bootVersion = '1.4.0.BUILD-SNAPSHOT'
request.javaVersion = '1.7'
generateGradleBuild(request).hasJavaVersion('1.8')
}
@Test
void versionsAreOverriddenMaven() {
ProjectRequest request = createProjectRequest('experimental-web-reactive')
request.bootVersion = '1.4.0.BUILD-SNAPSHOT'
generateMavenPom(request)
.hasProperty('spring.version', '5.0.0.BUILD-SNAPSHOT')
.hasProperty('reactor.version', '3.0.0.BUILD-SNAPSHOT')
}
@Test
void versionsAreNorOverriddenGradle() {
ProjectRequest request = createProjectRequest('experimental-web-reactive')
request.bootVersion = '1.4.0.BUILD-SNAPSHOT'
generateGradleBuild(request)
.doesNotContain("ext['spring.version'] = '5.0.0.BUILD-SNAPSHOT'")
.doesNotContain("ext['reactor.version'] = '3.0.0.BUILD-SNAPSHOT'")
}
@Test
void bomIsAddedMaven() {
ProjectRequest request = createProjectRequest('experimental-web-reactive')
request.bootVersion = '1.4.0.BUILD-SNAPSHOT'
generateMavenPom(request).hasBom('org.springframework.boot.experimental',
'spring-boot-dependencies-web-reactive', '0.1.0.BUILD-SNAPSHOT')
}
@Test
void bomIsAddedGradle() {
ProjectRequest request = createProjectRequest('experimental-web-reactive')
request.bootVersion = '1.4.0.BUILD-SNAPSHOT'
generateGradleBuild(request).contains("dependencyManagement {")
.contains("imports {")
.contains("mavenBom \"org.springframework.boot.experimental:spring-boot-dependencies-web-reactive:0.1.0.BUILD-SNAPSHOT\"")
}
@Test
void snapshotRepoIsAddedIfNecessary() {
ProjectRequest request = createProjectRequest('experimental-web-reactive')
request.bootVersion = '1.4.1.RELEASE'
generateMavenPom(request).hasRepository('spring-snapshots', 'Spring Snapshots',
'https://repo.spring.io/snapshot', true)
}
@Test
void simpleProjectUnaffected() {
ProjectRequest request = createProjectRequest('web')
request.javaVersion = '1.7'
request.buildProperties.versions['spring.version'] = { '3.2.7.RELEASE' }
generateMavenPom(request).hasJavaVersion('1.7')
.hasProperty('spring.version', '3.2.7.RELEASE')
.hasNoProperty('reactor.version')
}
private ProjectRequest createProjectRequest(String... styles) {
def request = new ProjectRequest()
request.initialize(metadataProvider.get())
request.style.addAll Arrays.asList(styles)
request
}
private PomAssert generateMavenPom(ProjectRequest request) {
request.type = 'maven-build'
def content = new String(projectGenerator.generateMavenPom(request))
new PomAssert(content)
}
private GradleBuildAssert generateGradleBuild(ProjectRequest request) {
request.type = 'gradle-build'
def content = new String(projectGenerator.generateGradleBuild(request))
new GradleBuildAssert(content)
}
@TestConfiguration
static class Config {
@Bean
InitializrMetadataProvider initializrMetadataProvider(InitializrProperties properties) {
new DefaultInitializrMetadataProvider(
InitializrMetadataBuilder.fromInitializrProperties(properties).build(),
new RestTemplate()) {
@Override
protected void updateInitializrMetadata(InitializrMetadata metadata) {
// Disable metadata fetching from spring.io
}
}
}
}
}