From a81e4ef77b818c778618bcf278998ecd9ea80b31 Mon Sep 17 00:00:00 2001 From: Joachim Pasquali Date: Wed, 13 Nov 2019 22:26:36 -0500 Subject: [PATCH] Add dependency classifier support See gh-1049 --- .../generator/buildsystem/Dependency.java | 18 +++++++++++++ .../gradle/GroovyDslGradleBuildWriter.java | 4 ++- .../gradle/KotlinDslGradleBuildWriter.java | 3 ++- .../buildsystem/maven/MavenBuildWriter.java | 1 + .../buildsystem/maven/MavenDependency.java | 3 ++- .../GroovyDslGradleBuildWriterTests.java | 20 ++++++++++++++ .../KotlinDslGradleBuildWriterTests.java | 20 ++++++++++++++ .../maven/MavenBuildWriterTests.java | 14 ++++++++++ .../maven/MavenDependencyTests.java | 17 ++++++++++-- .../initializr/metadata/Dependency.java | 27 +++++++++++++++++++ .../support/MetadataBuildItemMapper.java | 3 ++- .../MetadataBuildItemResolverTests.java | 3 ++- 12 files changed, 126 insertions(+), 7 deletions(-) diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/Dependency.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/Dependency.java index 2f1963f3..fd7761c4 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/Dependency.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/Dependency.java @@ -43,6 +43,8 @@ public class Dependency { private final String type; + private final String classifier; + private final Set exclusions; protected Dependency(Builder builder) { @@ -50,6 +52,7 @@ public class Dependency { this.artifactId = builder.artifactId; this.version = builder.version; this.scope = builder.scope; + this.classifier = builder.classifier; this.type = builder.type; this.exclusions = new LinkedHashSet<>(builder.exclusions); } @@ -116,6 +119,14 @@ public class Dependency { return this.type; } + /** + * The classifier of this dependency. Can be {@code null} + * @return the classifier or {@code null} + */ + public String getClassifier() { + return this.classifier; + } + /** * The {@link Exclusion exclusions} to apply. * @return the exclusions to apply @@ -140,6 +151,8 @@ public class Dependency { private DependencyScope scope; + private String classifier; + private String type; private Set exclusions = new LinkedHashSet<>(); @@ -174,6 +187,11 @@ public class Dependency { return self(); } + public B classifier(String classifier) { + this.classifier = classifier; + return self(); + } + public B exclusions(Exclusion... exclusions) { this.exclusions = new LinkedHashSet<>(Arrays.asList(exclusions)); return self(); diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleBuildWriter.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleBuildWriter.java index 10528ae8..429f17f1 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleBuildWriter.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleBuildWriter.java @@ -135,11 +135,13 @@ public class GroovyDslGradleBuildWriter extends GradleBuildWriter { String quoteStyle = determineQuoteStyle(dependency.getVersion()); String version = determineVersion(dependency.getVersion()); String type = dependency.getType(); + String classifier = dependency.getClassifier(); boolean hasExclusions = !dependency.getExclusions().isEmpty(); writer.print(configurationForDependency(dependency)); writer.print((hasExclusions) ? "(" : " "); writer.print(quoteStyle + dependency.getGroupId() + ":" + dependency.getArtifactId() - + ((version != null) ? ":" + version : "") + ((type != null) ? "@" + type : "") + quoteStyle); + + ((version != null) ? ":" + version : "") + ((classifier != null) ? ":" + classifier : "") + + ((type != null) ? "@" + type : "") + quoteStyle); if (hasExclusions) { writer.println(") {"); writer.indented( diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriter.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriter.java index 992730b0..09fb0ff3 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriter.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriter.java @@ -150,9 +150,10 @@ public class KotlinDslGradleBuildWriter extends GradleBuildWriter { protected void writeDependency(IndentingWriter writer, Dependency dependency) { String version = determineVersion(dependency.getVersion()); String type = dependency.getType(); + String classifier = dependency.getClassifier(); writer.print(configurationForDependency(dependency) + "(\"" + dependency.getGroupId() + ":" + dependency.getArtifactId() + ((version != null) ? ":" + version : "") - + ((type != null) ? "@" + type : "") + "\")"); + + ((classifier != null) ? ":" + classifier : "") + ((type != null) ? "@" + type : "") + "\")"); if (!dependency.getExclusions().isEmpty()) { writer.println(" {"); writer.indented( diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildWriter.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildWriter.java index 1e6fe8ae..d2eba024 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildWriter.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildWriter.java @@ -213,6 +213,7 @@ public class MavenBuildWriter { writeSingleElement(writer, "artifactId", dependency.getArtifactId()); writeSingleElement(writer, "version", determineVersion(dependency.getVersion())); writeSingleElement(writer, "scope", scopeForType(dependency.getScope())); + writeSingleElement(writer, "classifier", dependency.getClassifier()); if (isOptional(dependency)) { writeSingleElement(writer, "optional", Boolean.toString(true)); } diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenDependency.java b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenDependency.java index 87d8955f..9f084e2f 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenDependency.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/maven/MavenDependency.java @@ -49,7 +49,8 @@ public class MavenDependency extends Dependency { * @return a new builder initialized with the same state as the {@code dependency} */ public static Builder from(Dependency dependency) { - return new Builder(dependency.getGroupId(), dependency.getArtifactId()).initialize(dependency); + return new Builder(dependency.getGroupId(), dependency.getArtifactId()).initialize(dependency) + .classifier(dependency.getClassifier()); } /** diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleBuildWriterTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleBuildWriterTests.java index cdfc3300..f751f202 100644 --- a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleBuildWriterTests.java +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/GroovyDslGradleBuildWriterTests.java @@ -305,6 +305,16 @@ class GroovyDslGradleBuildWriterTests { " implementation 'org.springframework.boot:spring-boot-starter'", "}"); } + @Test + void gradleBuildWithClassifierDependency() { + GradleBuild build = new GradleBuild(); + build.dependencies().add("root", + Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter").classifier("classifier")); + List lines = generateBuild(build); + assertThat(lines).containsSequence("dependencies {", + " implementation 'org.springframework.boot:spring-boot-starter:classifier'", "}"); + } + @Test void gradleBuildWithNoScopeDependencyDefaultsToCompile() { GradleBuild build = new GradleBuild(); @@ -397,6 +407,16 @@ class GroovyDslGradleBuildWriterTests { " implementation 'org.springframework.boot:spring-boot-starter@tar.gz'", "}"); } + @Test + void gradleBuildWithNonNullArtifactTypeAndClassifierDependency() { + GradleBuild build = new GradleBuild(); + build.dependencies().add("root", Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter") + .scope(DependencyScope.COMPILE).type("tar.gz").classifier("classifier")); + List lines = generateBuild(build); + assertThat(lines).containsSequence("dependencies {", + " implementation 'org.springframework.boot:spring-boot-starter:classifier@tar.gz'", "}"); + } + @Test void gradleBuildWithBom() { GradleBuild build = new GradleBuild(); diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriterTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriterTests.java index 8d4a1235..8a025c7a 100644 --- a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriterTests.java +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/gradle/KotlinDslGradleBuildWriterTests.java @@ -313,6 +313,16 @@ class KotlinDslGradleBuildWriterTests { " implementation(\"org.springframework.boot:spring-boot-starter\")", "}"); } + @Test + void gradleBuildWithClassifierDependency() { + GradleBuild build = new GradleBuild(); + build.dependencies().add("root", Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter") + .scope(DependencyScope.COMPILE).classifier("classifier")); + List lines = generateBuild(build); + assertThat(lines).containsSequence("dependencies {", + " implementation(\"org.springframework.boot:spring-boot-starter:classifier\")", "}"); + } + @Test void gradleBuildWithNoScopeDependencyDefaultsToCompile() { GradleBuild build = new GradleBuild(); @@ -405,6 +415,16 @@ class KotlinDslGradleBuildWriterTests { " implementation(\"org.springframework.boot:spring-boot-starter@tar.gz\")", "}"); } + @Test + void gradleBuildWithNonNullArtifactTypeAndClassifierDependency() { + GradleBuild build = new GradleBuild(); + build.dependencies().add("root", Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter") + .scope(DependencyScope.COMPILE).type("tar.gz").classifier("classifier")); + List lines = generateBuild(build); + assertThat(lines).containsSequence("dependencies {", + " implementation(\"org.springframework.boot:spring-boot-starter:classifier@tar.gz\")", "}"); + } + @Test void gradleBuildWithBom() { GradleBuild build = new GradleBuild(); diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildWriterTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildWriterTests.java index ca63c2cc..be22cf76 100644 --- a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildWriterTests.java +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/maven/MavenBuildWriterTests.java @@ -223,6 +223,20 @@ class MavenBuildWriterTests { }); } + @Test + void pomWithClassifierDependency() { + MavenBuild build = new MavenBuild(); + build.settings().coordinates("com.example.demo", "demo"); + build.dependencies().add("foo-bar", Dependency + .withCoordinates("org.springframework.boot", "spring-boot-foo-bar").classifier("myClassifier")); + generatePom(build, (pom) -> { + NodeAssert dependency = pom.nodeAtPath("/project/dependencies/dependency"); + assertThat(dependency).textAtPath("groupId").isEqualTo("org.springframework.boot"); + assertThat(dependency).textAtPath("artifactId").isEqualTo("spring-boot-foo-bar"); + assertThat(dependency).textAtPath("classifier").isEqualTo("myClassifier"); + }); + } + @Test void pomWithCompileOnlyDependency() { MavenBuild build = new MavenBuild(); diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/maven/MavenDependencyTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/maven/MavenDependencyTests.java index 12585a7b..3d2ed5e8 100644 --- a/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/maven/MavenDependencyTests.java +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/buildsystem/maven/MavenDependencyTests.java @@ -33,7 +33,8 @@ class MavenDependencyTests { @Test void initializeFromStandardDependency() { Dependency original = Dependency.withCoordinates("com.example", "test") - .version(VersionReference.ofValue("1.0.0")).scope(DependencyScope.RUNTIME).type("zip").build(); + .version(VersionReference.ofValue("1.0.0")).scope(DependencyScope.RUNTIME).type("zip") + .classifier("classifier").build(); MavenDependency dependency = MavenDependency.from(original).build(); assertThat(original).isNotSameAs(dependency); assertThat(dependency.getGroupId()).isEqualTo("com.example"); @@ -41,6 +42,7 @@ class MavenDependencyTests { assertThat(dependency.getVersion()).isEqualTo(VersionReference.ofValue("1.0.0")); assertThat(dependency.getScope()).isEqualTo(DependencyScope.RUNTIME); assertThat(dependency.getType()).isEqualTo("zip"); + assertThat(dependency.getClassifier()).isEqualTo("classifier"); assertThat(dependency.isOptional()).isFalse(); } @@ -48,7 +50,7 @@ class MavenDependencyTests { void initializeFromMavenDependency() { Dependency original = MavenDependency.withCoordinates("com.example", "test") .version(VersionReference.ofValue("1.0.0")).scope(DependencyScope.RUNTIME).type("zip").optional(true) - .build(); + .classifier("classifier").build(); MavenDependency dependency = MavenDependency.from(original).build(); assertThat(original).isNotSameAs(dependency); assertThat(dependency.getGroupId()).isEqualTo("com.example"); @@ -56,7 +58,18 @@ class MavenDependencyTests { assertThat(dependency.getVersion()).isEqualTo(VersionReference.ofValue("1.0.0")); assertThat(dependency.getScope()).isEqualTo(DependencyScope.RUNTIME); assertThat(dependency.getType()).isEqualTo("zip"); + assertThat(dependency.getClassifier()).isEqualTo("classifier"); assertThat(dependency.isOptional()).isTrue(); } + @Test + void cloneUsingFromMethodOfMavenDependency() { + Dependency original = Dependency.withCoordinates("com.example", "test").classifier("classifier").build(); + Dependency dependency = MavenDependency.from(original).build(); + assertThat(original).isNotSameAs(dependency); + assertThat(dependency.getGroupId()).isEqualTo("com.example"); + assertThat(dependency.getArtifactId()).isEqualTo("test"); + assertThat(dependency.getClassifier()).isEqualTo("classifier"); + } + } diff --git a/initializr-metadata/src/main/java/io/spring/initializr/metadata/Dependency.java b/initializr-metadata/src/main/java/io/spring/initializr/metadata/Dependency.java index b0732956..767cef9e 100644 --- a/initializr-metadata/src/main/java/io/spring/initializr/metadata/Dependency.java +++ b/initializr-metadata/src/main/java/io/spring/initializr/metadata/Dependency.java @@ -89,6 +89,8 @@ public class Dependency extends MetadataElement implements Describable { private String type; + private String classifier; + private List mappings = new ArrayList<>(); private String scope = SCOPE_COMPILE; @@ -143,6 +145,7 @@ public class Dependency extends MetadataElement implements Describable { this.starter = dependency.starter; this.keywords.addAll(dependency.keywords); this.links.addAll(dependency.links); + this.classifier = dependency.classifier; } public void setScope(String scope) { @@ -325,6 +328,14 @@ public class Dependency extends MetadataElement implements Describable { this.version = version; } + public String getClassifier() { + return this.classifier; + } + + public void setClassifier(String classifier) { + this.classifier = classifier; + } + /** * Return the type, can be {@code null} to indicate that the default type should be * used (i.e. {@code jar}). @@ -458,12 +469,18 @@ public class Dependency extends MetadataElement implements Describable { } public static Dependency withId(String id, String groupId, String artifactId, String version, String scope) { + return withId(id, groupId, artifactId, version, scope, null); + } + + public static Dependency withId(String id, String groupId, String artifactId, String version, String scope, + String classifier) { Dependency dependency = new Dependency(); dependency.setId(id); dependency.groupId = groupId; dependency.artifactId = artifactId; dependency.version = version; dependency.scope = (scope != null) ? scope : SCOPE_COMPILE; + dependency.classifier = classifier; return dependency; } @@ -510,6 +527,8 @@ public class Dependency extends MetadataElement implements Describable { */ private String version; + private String classifier; + /** * The starter setting to use for the mapping or {@code null} to use the default. */ @@ -542,6 +561,14 @@ public class Dependency extends MetadataElement implements Describable { this.version = version; } + public String getClassifier() { + return this.classifier; + } + + public void setClassifier(String classifier) { + this.classifier = classifier; + } + public Boolean getStarter() { return this.starter; } diff --git a/initializr-metadata/src/main/java/io/spring/initializr/metadata/support/MetadataBuildItemMapper.java b/initializr-metadata/src/main/java/io/spring/initializr/metadata/support/MetadataBuildItemMapper.java index 900fd3cc..c4742e2c 100644 --- a/initializr-metadata/src/main/java/io/spring/initializr/metadata/support/MetadataBuildItemMapper.java +++ b/initializr-metadata/src/main/java/io/spring/initializr/metadata/support/MetadataBuildItemMapper.java @@ -46,7 +46,8 @@ public final class MetadataBuildItemMapper { ? VersionReference.ofValue(dependency.getVersion()) : null; return io.spring.initializr.generator.buildsystem.Dependency .withCoordinates(dependency.getGroupId(), dependency.getArtifactId()).version(versionReference) - .scope(toDependencyScope(dependency.getScope())).type(dependency.getType()).build(); + .scope(toDependencyScope(dependency.getScope())).type(dependency.getType()) + .classifier(dependency.getClassifier()).build(); } private static DependencyScope toDependencyScope(String scope) { diff --git a/initializr-metadata/src/test/java/io/spring/initializr/metadata/support/MetadataBuildItemResolverTests.java b/initializr-metadata/src/test/java/io/spring/initializr/metadata/support/MetadataBuildItemResolverTests.java index 2b36dfeb..9e64c021 100644 --- a/initializr-metadata/src/test/java/io/spring/initializr/metadata/support/MetadataBuildItemResolverTests.java +++ b/initializr-metadata/src/test/java/io/spring/initializr/metadata/support/MetadataBuildItemResolverTests.java @@ -45,7 +45,7 @@ class MetadataBuildItemResolverTests { void resoleDependencyWithMatchingEntry() { InitializrMetadata metadata = new InitializrMetadata(); DependencyGroup group = DependencyGroup.create("test"); - group.getContent().add(Dependency.withId("test-dep", "com.example", "test", "1.0.0", "runtime")); + group.getContent().add(Dependency.withId("test-dep", "com.example", "test", "1.0.0", "runtime", "classifier")); metadata.getDependencies().getContent().add(group); metadata.validate(); MetadataBuildItemResolver resolver = new MetadataBuildItemResolver(metadata, VERSION_2_0_0); @@ -53,6 +53,7 @@ class MetadataBuildItemResolverTests { assertThat(dependency.getGroupId()).isEqualTo("com.example"); assertThat(dependency.getArtifactId()).isEqualTo("test"); assertThat(dependency.getVersion()).hasToString("1.0.0"); + assertThat(dependency.getClassifier()).hasToString("classifier"); assertThat(dependency.getScope()).isEqualTo(DependencyScope.RUNTIME); }