Update init to new metadata format

Spring initializr now declares an improved metadata format (v2).

InitializrServiceMetadata has been updated to parse this format. Note
that the client could be further improved by using HAL generated links.

Closes gh-1953
pull/1958/head
Stephane Nicoll 10 years ago
parent ae23ba13b5
commit 8f488bd019

@ -134,7 +134,7 @@ class InitializrService {
*/
private CloseableHttpResponse executeInitializrMetadataRetrieval(String url) {
HttpGet request = new HttpGet(url);
request.setHeader(new BasicHeader(HttpHeaders.ACCEPT, "application/json"));
request.setHeader(new BasicHeader(HttpHeaders.ACCEPT, "application/vnd.initializr.v2+json"));
return execute(request, url, "retrieve metadata");
}

@ -19,6 +19,7 @@ package org.springframework.boot.cli.command.init;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.json.JSONArray;
@ -34,11 +35,9 @@ class InitializrServiceMetadata {
private static final String DEPENDENCIES_EL = "dependencies";
private static final String TYPES_EL = "types";
private static final String TYPE_EL = "type";
private static final String DEFAULTS_EL = "defaults";
private static final String CONTENT_EL = "content";
private static final String VALUES_EL = "values";
private static final String NAME_ATTRIBUTE = "name";
@ -123,7 +122,8 @@ class InitializrServiceMetadata {
if (!root.has(DEPENDENCIES_EL)) {
return result;
}
JSONArray array = root.getJSONArray(DEPENDENCIES_EL);
JSONObject dependencies = root.getJSONObject(DEPENDENCIES_EL);
JSONArray array = dependencies.getJSONArray(VALUES_EL);
for (int i = 0; i < array.length(); i++) {
JSONObject group = array.getJSONObject(i);
parseGroup(group, result);
@ -133,13 +133,15 @@ class InitializrServiceMetadata {
private MetadataHolder<String, ProjectType> parseProjectTypes(JSONObject root) {
MetadataHolder<String, ProjectType> result = new MetadataHolder<String, ProjectType>();
if (!root.has(TYPES_EL)) {
if (!root.has(TYPE_EL)) {
return result;
}
JSONArray array = root.getJSONArray(TYPES_EL);
JSONObject type = root.getJSONObject(TYPE_EL);
JSONArray array = type.getJSONArray(VALUES_EL);
String defaultType = type.has(DEFAULT_ATTRIBUTE) ? type.getString(DEFAULT_ATTRIBUTE) : null;
for (int i = 0; i < array.length(); i++) {
JSONObject typeJson = array.getJSONObject(i);
ProjectType projectType = parseType(typeJson);
ProjectType projectType = parseType(typeJson, defaultType);
result.getContent().put(projectType.getId(), projectType);
if (projectType.isDefaultType()) {
result.setDefaultItem(projectType);
@ -150,17 +152,23 @@ class InitializrServiceMetadata {
private Map<String, String> parseDefaults(JSONObject root) {
Map<String, String> result = new HashMap<String, String>();
if (!root.has(DEFAULTS_EL)) {
return result;
Iterator<?> keys = root.keys();
while (keys.hasNext()) {
String key = (String) keys.next();
Object o = root.get(key);
if (o instanceof JSONObject) {
JSONObject child = (JSONObject) o;
if (child.has(DEFAULT_ATTRIBUTE)) {
result.put(key, child.getString(DEFAULT_ATTRIBUTE));
}
}
}
JSONObject defaults = root.getJSONObject(DEFAULTS_EL);
result.putAll(parseStringItems(defaults));
return result;
}
private void parseGroup(JSONObject group, Map<String, Dependency> dependencies) {
if (group.has(CONTENT_EL)) {
JSONArray content = group.getJSONArray(CONTENT_EL);
if (group.has(VALUES_EL)) {
JSONArray content = group.getJSONArray(VALUES_EL);
for (int i = 0; i < content.length(); i++) {
Dependency dependency = parseDependency(content.getJSONObject(i));
dependencies.put(dependency.getId(), dependency);
@ -175,11 +183,11 @@ class InitializrServiceMetadata {
return new Dependency(id, name, description);
}
private ProjectType parseType(JSONObject object) {
private ProjectType parseType(JSONObject object, String defaultId) {
String id = getStringValue(object, ID_ATTRIBUTE, null);
String name = getStringValue(object, NAME_ATTRIBUTE, null);
String action = getStringValue(object, ACTION_ATTRIBUTE, null);
boolean defaultType = getBooleanValue(object, DEFAULT_ATTRIBUTE, false);
boolean defaultType = id.equals(defaultId);
Map<String, String> tags = new HashMap<String, String>();
if (object.has("tags")) {
JSONObject jsonTags = object.getJSONObject("tags");
@ -192,10 +200,6 @@ class InitializrServiceMetadata {
return object.has(name) ? object.getString(name) : defaultValue;
}
private boolean getBooleanValue(JSONObject object, String name, boolean defaultValue) {
return object.has(name) ? object.getBoolean(name) : defaultValue;
}
private Map<String, String> parseStringItems(JSONObject json) {
Map<String, String> result = new HashMap<String, String>();
for (Object k : json.keySet()) {

@ -26,6 +26,8 @@ import java.util.Map;
import org.apache.http.client.utils.URIBuilder;
import org.springframework.util.StringUtils;
/**
* Represent the settings to apply to generating the project.
*
@ -205,8 +207,9 @@ class ProjectGenerationRequest {
if (this.bootVersion != null) {
builder.setParameter("bootVersion", this.bootVersion);
}
for (String dependency : this.dependencies) {
builder.addParameter("style", dependency);
if (!this.dependencies.isEmpty()) {
builder.setParameter("dependencies", StringUtils.collectionToCommaDelimitedString(this.dependencies));
}
if (this.javaVersion != null) {
builder.setParameter("javaVersion", this.javaVersion);

@ -49,7 +49,7 @@ public abstract class AbstractHttpClientMockTests {
protected final CloseableHttpClient http = mock(CloseableHttpClient.class);
protected void mockSuccessfulMetadataGet() throws IOException {
mockSuccessfulMetadataGet("1.1.0");
mockSuccessfulMetadataGet("2.0.0");
}
protected void mockSuccessfulMetadataGet(String version) throws IOException {
@ -57,9 +57,9 @@ public abstract class AbstractHttpClientMockTests {
Resource resource = new ClassPathResource("metadata/service-metadata-" + version
+ ".json");
byte[] content = StreamUtils.copyToByteArray(resource.getInputStream());
mockHttpEntity(response, content, "application/json");
mockHttpEntity(response, content, "application/vnd.initializr.v2+json");
mockStatus(response, 200);
given(this.http.execute(argThat(getForJsonData()))).willReturn(response);
given(this.http.execute(argThat(getForJsonMetadata()))).willReturn(response);
}
protected void mockSuccessfulProjectGeneration(
@ -72,7 +72,7 @@ public abstract class AbstractHttpClientMockTests {
String header = (request.fileName != null ? contentDispositionValue(request.fileName)
: null);
mockHttpHeader(response, "Content-Disposition", header);
given(this.http.execute(argThat(getForNonJsonData()))).willReturn(response);
given(this.http.execute(argThat(getForNonJsonMetadata()))).willReturn(response);
}
protected void mockProjectGenerationError(int status, String message)
@ -122,12 +122,12 @@ public abstract class AbstractHttpClientMockTests {
given(response.getFirstHeader(headerName)).willReturn(header);
}
protected Matcher<HttpGet> getForJsonData() {
return new HasAcceptHeader("application/json", true);
protected Matcher<HttpGet> getForJsonMetadata() {
return new HasAcceptHeader("application/vnd.initializr.v2+json", true);
}
protected Matcher<HttpGet> getForNonJsonData() {
return new HasAcceptHeader("application/json", false);
protected Matcher<HttpGet> getForNonJsonMetadata() {
return new HasAcceptHeader("application/vnd.initializr.v2+json", false);
}
private String contentDispositionValue(String fileName) {

@ -38,15 +38,24 @@ public class InitializrServiceMetadataTests {
@Test
public void parseDefaults() {
InitializrServiceMetadata metadata = createInstance("1.0.0");
assertEquals("maven-project", metadata.getDefaults().get("type"));
InitializrServiceMetadata metadata = createInstance("2.0.0");
assertEquals("1.1.8.RELEASE", metadata.getDefaults().get("bootVersion"));
assertEquals("1.7", metadata.getDefaults().get("javaVersion"));
assertEquals("org.test", metadata.getDefaults().get("groupId"));
assertEquals("demo", metadata.getDefaults().get("name"));
assertEquals("Demo project for Spring Boot", metadata.getDefaults().get("description"));
assertEquals("jar", metadata.getDefaults().get("packaging"));
assertEquals("java", metadata.getDefaults().get("language"));
assertEquals("demo", metadata.getDefaults().get("artifactId"));
assertEquals("demo", metadata.getDefaults().get("packageName"));
assertEquals("maven-project", metadata.getDefaults().get("type"));
assertEquals("0.0.1-SNAPSHOT", metadata.getDefaults().get("version"));
assertEquals("Wrong number of defaults", 11, metadata.getDefaults().size());
}
@Test
public void parseDependencies() {
InitializrServiceMetadata metadata = createInstance("1.0.0");
InitializrServiceMetadata metadata = createInstance("2.0.0");
assertEquals(5, metadata.getDependencies().size());
// Security description
@ -60,16 +69,8 @@ public class InitializrServiceMetadataTests {
}
@Test
public void parseTypesNoTag() {
InitializrServiceMetadata metadata = createInstance("1.0.0");
ProjectType projectType = metadata.getProjectTypes().get("maven-project");
assertNotNull(projectType);
assertEquals(0, projectType.getTags().size());
}
@Test
public void parseTypesWithTags() {
InitializrServiceMetadata metadata = createInstance("1.1.0");
public void parseTypes() {
InitializrServiceMetadata metadata = createInstance("2.0.0");
ProjectType projectType = metadata.getProjectTypes().get("maven-project");
assertNotNull(projectType);
assertEquals("maven", projectType.getTags().get("build"));

@ -60,7 +60,7 @@ public class ProjectGenerationRequestTests {
this.request.setServiceUrl(customServerUrl);
this.request.getDependencies().add("security");
assertEquals(new URI(customServerUrl
+ "/starter.zip?style=security&type=test-type"),
+ "/starter.zip?dependencies=security&type=test-type"),
this.request.generateUrl(createDefaultMetadata()));
}
@ -74,7 +74,7 @@ public class ProjectGenerationRequestTests {
@Test
public void singleDependency() {
this.request.getDependencies().add("web");
assertEquals(createDefaultUrl("?style=web&type=test-type"),
assertEquals(createDefaultUrl("?dependencies=web&type=test-type"),
this.request.generateUrl(createDefaultMetadata()));
}
@ -82,7 +82,7 @@ public class ProjectGenerationRequestTests {
public void multipleDependencies() {
this.request.getDependencies().add("web");
this.request.getDependencies().add("data-jpa");
assertEquals(createDefaultUrl("?style=web&style=data-jpa&type=test-type"),
assertEquals(createDefaultUrl("?dependencies=web%2Cdata-jpa&type=test-type"),
this.request.generateUrl(createDefaultMetadata()));
}
@ -108,7 +108,7 @@ public class ProjectGenerationRequestTests {
this.request.setType("custom");
this.request.getDependencies().add("data-rest");
assertEquals(new URI(ProjectGenerationRequest.DEFAULT_SERVICE_URL
+ "/foo?style=data-rest&type=custom"), this.request.generateUrl(metadata));
+ "/foo?dependencies=data-rest&type=custom"), this.request.generateUrl(metadata));
}
@Test
@ -187,7 +187,7 @@ public class ProjectGenerationRequestTests {
}
private static InitializrServiceMetadata readMetadata() {
return readMetadata("1.1.0");
return readMetadata("2.0.0");
}
private static InitializrServiceMetadata readMetadata(String version) {

@ -1,134 +0,0 @@
{"dependencies": [
{
"name": "Core",
"content": [
{
"name": "Security",
"id": "security",
"description": "Security description"
},
{
"name": "AOP",
"id": "aop"
}
]
},
{
"name": "Data",
"content": [
{
"name": "JDBC",
"id": "jdbc"
},
{
"name": "JPA",
"id": "data-jpa"
},
{
"name": "MongoDB",
"id": "data-mongodb"
}
]
}
], "types": [
{
"name": "Maven POM",
"id": "maven-build",
"action": "/pom.xml",
"default": false
},
{
"name": "Maven Project",
"id": "maven-project",
"action": "/starter.zip",
"default": true
},
{
"name": "Gradle Config",
"id": "gradle-build",
"action": "/build.gradle",
"default": false
},
{
"name": "Gradle Project",
"id": "gradle-project",
"action": "/starter.zip",
"default": false
}
], "packagings": [
{
"name": "Jar",
"id": "jar",
"default": true
},
{
"name": "War",
"id": "war",
"default": false
}
], "javaVersions": [
{
"name": "1.6",
"id": "1.6",
"default": false
},
{
"name": "1.7",
"id": "1.7",
"default": true
},
{
"name": "1.8",
"id": "1.8",
"default": false
}
], "languages": [
{
"name": "Groovy",
"id": "groovy",
"default": false
},
{
"name": "Java",
"id": "java",
"default": true
}
], "bootVersions": [
{
"name": "1.2.0 M2",
"id": "1.2.0.M2",
"default": false
},
{
"name": "1.2.0 (SNAPSHOT)",
"id": "1.2.0.BUILD-SNAPSHOT",
"default": false
},
{
"name": "1.1.8",
"id": "1.1.8.RELEASE",
"default": true
},
{
"name": "1.1.8 (SNAPSHOT)",
"id": "1.1.8.BUILD-SNAPSHOT",
"default": false
},
{
"name": "1.0.2",
"id": "1.0.2.RELEASE",
"default": false
}
], "defaults": {
"groupId": "org.test",
"artifactId": "demo",
"version": "0.0.1-SNAPSHOT",
"name": "demo",
"description": "Demo project for Spring Boot",
"packageName": "demo",
"type": "maven-project",
"packaging": "jar",
"javaVersion": "1.7",
"language": "java",
"bootVersion": "1.1.8.RELEASE"
}}

@ -1,150 +0,0 @@
{"dependencies": [
{
"name": "Core",
"content": [
{
"name": "Security",
"id": "security",
"description": "Security description"
},
{
"name": "AOP",
"id": "aop"
}
]
},
{
"name": "Data",
"content": [
{
"name": "JDBC",
"id": "jdbc"
},
{
"name": "JPA",
"id": "data-jpa"
},
{
"name": "MongoDB",
"id": "data-mongodb"
}
]
}
], "types": [
{
"name": "Maven POM",
"id": "maven-build",
"action": "/pom.xml",
"tags": {
"build": "maven",
"format": "build"
},
"default": false
},
{
"name": "Maven Project",
"id": "maven-project",
"action": "/starter.zip",
"tags": {
"build": "maven",
"format": "project"
},
"default": true
},
{
"name": "Gradle Config",
"id": "gradle-build",
"action": "/build.gradle",
"tags": {
"build": "gradle",
"format": "build"
},
"default": false
},
{
"name": "Gradle Project",
"id": "gradle-project",
"action": "/starter.zip",
"tags": {
"build": "gradle",
"format": "project"
},
"default": false
}
], "packagings": [
{
"name": "Jar",
"id": "jar",
"default": true
},
{
"name": "War",
"id": "war",
"default": false
}
], "javaVersions": [
{
"name": "1.6",
"id": "1.6",
"default": false
},
{
"name": "1.7",
"id": "1.7",
"default": true
},
{
"name": "1.8",
"id": "1.8",
"default": false
}
], "languages": [
{
"name": "Groovy",
"id": "groovy",
"default": false
},
{
"name": "Java",
"id": "java",
"default": true
}
], "bootVersions": [
{
"name": "1.2.0 M2",
"id": "1.2.0.M2",
"default": false
},
{
"name": "1.2.0 (SNAPSHOT)",
"id": "1.2.0.BUILD-SNAPSHOT",
"default": false
},
{
"name": "1.1.8",
"id": "1.1.8.RELEASE",
"default": true
},
{
"name": "1.1.8 (SNAPSHOT)",
"id": "1.1.8.BUILD-SNAPSHOT",
"default": false
},
{
"name": "1.0.2",
"id": "1.0.2.RELEASE",
"default": false
}
], "defaults": {
"groupId": "org.test",
"artifactId": "demo",
"version": "0.0.1-SNAPSHOT",
"name": "demo",
"description": "Demo project for Spring Boot",
"packageName": "demo",
"type": "maven-project",
"packaging": "jar",
"javaVersion": "1.7",
"language": "java",
"bootVersion": "1.1.8.RELEASE"
}}

@ -0,0 +1,190 @@
{
"_links": {
"maven-build": {
"href": "http://localhost:8080/pom.xml?{dependencies,type,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}",
"templated": true
},
"maven-project": {
"href": "http://localhost:8080/starter.zip{?dependencies,type,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}",
"templated": true
},
"gradle-build": {
"href": "http://localhost:8080/build.gradle{?dependencies,type,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}",
"templated": true
},
"gradle-project": {
"href": "http://localhost:8080/starter.zip{?dependencies,type,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}",
"templated": true
}
},
"dependencies": {
"type": "hierarchical-multi-select",
"values": [
{
"name": "Core",
"values": [
{
"name": "Security",
"id": "security",
"description": "Security description"
},
{
"name": "AOP",
"id": "aop"
}
]
},
{
"name": "Data",
"values": [
{
"name": "JDBC",
"id": "jdbc"
},
{
"name": "JPA",
"id": "data-jpa"
},
{
"name": "MongoDB",
"id": "data-mongodb"
}
]
}
]
},
"type": {
"type": "action",
"default": "maven-project",
"values": [
{
"id": "maven-build",
"name": "Maven POM",
"action": "/pom.xml",
"tags": {
"build": "maven",
"format": "build"
}
},
{
"id": "maven-project",
"name": "Maven Project",
"action": "/starter.zip",
"tags": {
"build": "maven",
"format": "project"
}
},
{
"id": "gradle-build",
"name": "Gradle Config",
"action": "/build.gradle",
"tags": {
"build": "gradle",
"format": "build"
}
},
{
"id": "gradle-project",
"name": "Gradle Project",
"action": "/starter.zip",
"tags": {
"build": "gradle",
"format": "project"
}
}
]
},
"packaging": {
"type": "single-select",
"default": "jar",
"values": [
{
"id": "jar",
"name": "Jar"
},
{
"id": "war",
"name": "War"
}
]
},
"javaVersion": {
"type": "single-select",
"default": "1.7",
"values": [
{
"id": "1.6",
"name": "1.6"
},
{
"id": "1.7",
"name": "1.7"
},
{
"id": "1.8",
"name": "1.8"
}
]
},
"language": {
"type": "single-select",
"default": "java",
"values": [
{
"id": "groovy",
"name": "Groovy"
},
{
"id": "java",
"name": "Java"
}
]
},
"bootVersion": {
"type": "single-select",
"default": "1.1.8.RELEASE",
"values": [
{
"id": "1.2.0.BUILD-SNAPSHOT",
"name": "1.2.0 (SNAPSHOT)"
},
{
"id": "1.1.8.RELEASE",
"name": "1.1.8"
},
{
"id": "1.1.8.BUILD-SNAPSHOT",
"name": "1.1.8 (SNAPSHOT)"
},
{
"id": "1.0.2.RELEASE",
"name": "1.0.2"
}
]
},
"groupId": {
"type": "text",
"default": "org.test"
},
"artifactId": {
"type": "text",
"default": "demo"
},
"version": {
"type": "text",
"default": "0.0.1-SNAPSHOT"
},
"name": {
"type": "text",
"default": "demo"
},
"description": {
"type": "text",
"default": "Demo project for Spring Boot"
},
"packageName": {
"type": "text",
"default": "demo"
}
}

@ -1,7 +1,28 @@
{"dependencies": [
{
"_links": {
"maven-build": {
"href": "http://localhost:8080/pom.xml?style={dependencies}{&type,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}",
"templated": true
},
"maven-project": {
"href": "http://localhost:8080/starter.zip?style={dependencies}{&type,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}",
"templated": true
},
"gradle-build": {
"href": "http://localhost:8080/build.gradle?style={dependencies}{&type,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}",
"templated": true
},
"gradle-project": {
"href": "http://localhost:8080/starter.zip?style={dependencies}{&type,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}",
"templated": true
}
},
"dependencies": {
"type": "hierarchical-multi-select",
"values": [
{
"name": "Core",
"content": [
"values": [
{
"name": "Security",
"id": "security",
@ -15,7 +36,7 @@
},
{
"name": "Data",
"content": [
"values": [
{
"name": "JDBC",
"id": "jdbc"
@ -30,140 +51,157 @@
}
]
}
], "types": [
]
},
"type": {
"type": "action",
"values": [
{
"name": "Maven POM",
"id": "maven-build",
"name": "Maven POM",
"action": "/pom.xml",
"tags": {
"build": "maven",
"format": "build"
},
"default": false
}
},
{
"name": "Maven Project",
"id": "maven-project",
"name": "Maven Project",
"action": "/starter.zip",
"tags": {
"build": "maven",
"format": "project"
},
"default": false
}
},
{
"name": "Another Maven Project",
"id": "maven-project-2",
"name": "Another Maven Project",
"action": "/starter.zip",
"tags": {
"build": "maven",
"format": "project"
},
"default": false
}
},
{
"name": "Gradle Config",
"id": "gradle-build",
"name": "Gradle Config",
"action": "/build.gradle",
"tags": {
"build": "gradle",
"format": "build"
},
"default": false
}
},
{
"name": "Gradle Project",
"id": "gradle-project",
"name": "Gradle Project",
"action": "/starter.zip",
"tags": {
"build": "gradle",
"format": "project"
},
"default": false
}
},
{
"name": "Another gradle Project",
"id": "gradle-project-2",
"name": "Another Gradle Project",
"action": "/starter.zip",
"tags": {
"build": "gradle",
"format": "project"
},
"default": false
}
], "packagings": [
}
]
},
"packaging": {
"type": "single-select",
"default": "jar",
"values": [
{
"name": "Jar",
"id": "jar",
"default": true
"name": "Jar"
},
{
"name": "War",
"id": "war",
"default": false
"name": "War"
}
], "javaVersions": [
]
},
"javaVersion": {
"type": "single-select",
"default": "1.7",
"values": [
{
"name": "1.6",
"id": "1.6",
"default": false
"name": "1.6"
},
{
"name": "1.7",
"id": "1.7",
"default": true
"name": "1.7"
},
{
"name": "1.8",
"id": "1.8",
"default": false
"name": "1.8"
}
], "languages": [
]
},
"language": {
"type": "single-select",
"default": "java",
"values": [
{
"name": "Groovy",
"id": "groovy",
"default": false
"name": "Groovy"
},
{
"name": "Java",
"id": "java",
"default": true
"name": "Java"
}
], "bootVersions": [
{
"name": "1.2.0 M2",
"id": "1.2.0.M2",
"default": false
]
},
"bootVersion": {
"type": "single-select",
"default": "1.1.8.RELEASE",
"values": [
{
"name": "1.2.0 (SNAPSHOT)",
"id": "1.2.0.BUILD-SNAPSHOT",
"default": false
"name": "1.2.0 (SNAPSHOT)"
},
{
"name": "1.1.8",
"id": "1.1.8.RELEASE",
"default": true
"name": "1.1.8"
},
{
"name": "1.1.8 (SNAPSHOT)",
"id": "1.1.8.BUILD-SNAPSHOT",
"default": false
"name": "1.1.8 (SNAPSHOT)"
},
{
"name": "1.0.2",
"id": "1.0.2.RELEASE",
"default": false
}
], "defaults": {
"groupId": "org.test",
"artifactId": "demo",
"version": "0.0.1-SNAPSHOT",
"name": "demo",
"description": "Demo project for Spring Boot",
"packageName": "demo",
"packaging": "jar",
"javaVersion": "1.7",
"language": "java",
"bootVersion": "1.1.8.RELEASE"
}}
"name": "1.0.2"
}
]
},
"groupId": {
"type": "text",
"default": "org.test"
},
"artifactId": {
"type": "text",
"default": "demo"
},
"version": {
"type": "text",
"default": "0.0.1-SNAPSHOT"
},
"name": {
"type": "text",
"default": "demo"
},
"description": {
"type": "text",
"default": "Demo project for Spring Boot"
},
"packageName": {
"type": "text",
"default": "demo"
}
}
Loading…
Cancel
Save