diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java b/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java
index c781faf4..4adab3a8 100644
--- a/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java
+++ b/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java
@@ -467,6 +467,11 @@ public class ProjectGenerator {
// Java versions
model.put("java8OrLater", isJava8OrLater(request));
+ // Has JPA facet
+ if (request.hasJpaFacet()) {
+ model.put("jpaFacet", true);
+ }
+
// Append the project request to the model
BeanWrapperImpl bean = new BeanWrapperImpl(request);
for (PropertyDescriptor descriptor : bean.getPropertyDescriptors()) {
diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectRequest.java b/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectRequest.java
index cccc78be..4341ba94 100644
--- a/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectRequest.java
+++ b/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectRequest.java
@@ -312,6 +312,14 @@ public class ProjectRequest extends BasicProjectRequest {
return hasFacet("web");
}
+ /**
+ * Specify if this request has the jpa facet enabled.
+ * @return {@code true} if the project has the jpa facet
+ */
+ public boolean hasJpaFacet() {
+ return hasFacet("jpa");
+ }
+
/**
* Specify if this request has the specified facet enabled.
* @param facet the facet to check
diff --git a/initializr-generator/src/main/resources/templates/starter-build.gradle b/initializr-generator/src/main/resources/templates/starter-build.gradle
index 59850a25..6c3c1a98 100644
--- a/initializr-generator/src/main/resources/templates/starter-build.gradle
+++ b/initializr-generator/src/main/resources/templates/starter-build.gradle
@@ -19,6 +19,9 @@ buildscript {
{{#kotlin}}
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")
classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}")
+ {{#jpaFacet}}
+ classpath("org.jetbrains.kotlin:kotlin-noarg:${kotlinVersion}")
+ {{/jpaFacet}}
{{/kotlin}}
}
}
@@ -26,6 +29,9 @@ buildscript {
apply plugin: '{{language}}'
{{#kotlin}}
apply plugin: 'kotlin-spring'
+{{#jpaFacet}}
+apply plugin: 'kotlin-jpa'
+{{/jpaFacet}}
{{/kotlin}}
{{#war}}
apply plugin: 'eclipse-wtp'
diff --git a/initializr-generator/src/main/resources/templates/starter-pom.xml b/initializr-generator/src/main/resources/templates/starter-pom.xml
index 5636da6e..95c9fa45 100644
--- a/initializr-generator/src/main/resources/templates/starter-pom.xml
+++ b/initializr-generator/src/main/resources/templates/starter-pom.xml
@@ -195,6 +195,9 @@
spring
+ {{#jpaFacet}}
+ jpa
+ {{/jpaFacet}}
{{^kotlinSupport}}
{{#java8OrLater}}
diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/ProjectGeneratorTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/ProjectGeneratorTests.java
index ce7838d3..2ce15680 100755
--- a/initializr-generator/src/test/java/io/spring/initializr/generator/ProjectGeneratorTests.java
+++ b/initializr-generator/src/test/java/io/spring/initializr/generator/ProjectGeneratorTests.java
@@ -960,4 +960,92 @@ public class ProjectGeneratorTests extends AbstractProjectGeneratorTests {
}
}
+ @Test
+ public void kotlinWithMavenUseJpaFacetHasJpaKotlinPlugin() {
+ Dependency jpa = Dependency.withId("data-jpa");
+ jpa.setFacets(Collections.singletonList("jpa"));
+ InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
+ .addDependencyGroup("data-jpa", jpa).build();
+ applyMetadata(metadata);
+
+ ProjectRequest request = createProjectRequest("data-jpa");
+ request.setType("maven-project");
+ request.setLanguage("kotlin");
+ assertThat(generateMavenPom(request).getMavenPom())
+ .contains("jpa");
+ }
+
+ @Test
+ public void kotlinWithMavenWithoutJpaFacetDoesNotHaveJpaKotlinPlugin() {
+ Dependency jpa = Dependency.withId("data-jpa");
+ InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
+ .addDependencyGroup("data-jpa", jpa).build();
+ applyMetadata(metadata);
+
+ ProjectRequest request = createProjectRequest("data-jpa");
+ request.setType("maven-project");
+ request.setLanguage("kotlin");
+ assertThat(generateMavenPom(request).getMavenPom())
+ .doesNotContain("jpa");
+ }
+
+ @Test
+ public void javaWithMavenUseJpaFacetDoesNotHaveJpaKotlinPlugin() {
+ Dependency jpa = Dependency.withId("data-jpa");
+ jpa.setFacets(Collections.singletonList("jpa"));
+ InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
+ .addDependencyGroup("data-jpa", jpa).build();
+ applyMetadata(metadata);
+
+ ProjectRequest request = createProjectRequest("data-jpa");
+ request.setType("maven-project");
+ request.setLanguage("java");
+ assertThat(generateMavenPom(request).getMavenPom())
+ .doesNotContain("jpa");
+ }
+
+ @Test
+ public void kotlinWithGradleUseJpaFacetHasJpaKotlinPlugin() {
+ Dependency jpa = Dependency.withId("data-jpa");
+ jpa.setFacets(Collections.singletonList("jpa"));
+ InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
+ .addDependencyGroup("data-jpa", jpa).build();
+ applyMetadata(metadata);
+
+ ProjectRequest request = createProjectRequest("data-jpa");
+ request.setType("gradle-project");
+ request.setLanguage("kotlin");
+ assertThat(generateGradleBuild(request).getGradleBuild())
+ .contains("apply plugin: 'kotlin-jpa'");
+ }
+
+ @Test
+ public void kotlinWithGradleWithoutJpaFacetDoesNotHaveJpaKotlinPlugin() {
+ Dependency jpa = Dependency.withId("data-jpa");
+ InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
+ .addDependencyGroup("data-jpa", jpa).build();
+ applyMetadata(metadata);
+
+ ProjectRequest request = createProjectRequest("data-jpa");
+ request.setType("gradle-project");
+ request.setLanguage("kotlin");
+ assertThat(generateGradleBuild(request).getGradleBuild())
+ .doesNotContain("apply plugin: 'kotlin-jpa'");
+ }
+
+ @Test
+ public void javaWithGradleUseJpaFacetDoesNotHaveJpaKotlinPlugin() {
+ Dependency jpa = Dependency.withId("data-jpa");
+ jpa.setFacets(Collections.singletonList("jpa"));
+ InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
+ .addDependencyGroup("data-jpa", jpa).build();
+ applyMetadata(metadata);
+
+ ProjectRequest request = createProjectRequest("data-jpa");
+ request.setType("gradle-project");
+ request.setLanguage("java");
+ assertThat(generateGradleBuild(request).getGradleBuild())
+ .doesNotContain("apply plugin: 'kotlin-jpa'");
+ }
+
}
diff --git a/initializr-generator/src/test/java/io/spring/initializr/test/generator/PomAssert.java b/initializr-generator/src/test/java/io/spring/initializr/test/generator/PomAssert.java
index fb0b943d..1ea3693a 100644
--- a/initializr-generator/src/test/java/io/spring/initializr/test/generator/PomAssert.java
+++ b/initializr-generator/src/test/java/io/spring/initializr/test/generator/PomAssert.java
@@ -46,6 +46,8 @@ import static org.assertj.core.api.Assertions.assertThat;
*/
public class PomAssert {
+ private final String content;
+
private final XpathEngine eng;
private final Document doc;
@@ -61,6 +63,7 @@ public class PomAssert {
private final Map repositories = new LinkedHashMap<>();
public PomAssert(String content) {
+ this.content = content;
this.eng = XMLUnit.newXpathEngine();
Map context = new LinkedHashMap<>();
context.put("pom", "http://maven.apache.org/POM/4.0.0");
@@ -298,6 +301,10 @@ public class PomAssert {
return this;
}
+ public String getMavenPom() {
+ return this.content;
+ }
+
private PomAssert hasPluginRepository(String name) {
NodeList nodes;
try {
diff --git a/initializr-service/src/main/resources/application.yml b/initializr-service/src/main/resources/application.yml
index 2864e043..764152fc 100644
--- a/initializr-service/src/main/resources/application.yml
+++ b/initializr-service/src/main/resources/application.yml
@@ -481,6 +481,8 @@ initializr:
id: data-jpa
description: Java Persistence API including spring-data-jpa, spring-orm and Hibernate
weight: 100
+ facets:
+ - jpa
aliases:
- jpa
links: