diff --git a/rewrite-maven/src/main/java/org/openrewrite/maven/internal/RawPom.java b/rewrite-maven/src/main/java/org/openrewrite/maven/internal/RawPom.java
index ff13a5f665f..26a449b0ece 100755
--- a/rewrite-maven/src/main/java/org/openrewrite/maven/internal/RawPom.java
+++ b/rewrite-maven/src/main/java/org/openrewrite/maven/internal/RawPom.java
@@ -36,7 +36,6 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import static java.util.Collections.emptyList;
import static java.util.Collections.emptyMap;
@@ -404,22 +403,26 @@ public static class Profile {
}
public @Nullable String getGroupId() {
- return groupId == null && parent != null ? parent.getGroupId() : groupId;
+ if (!StringUtils.isBlank(groupId)) {
+ return groupId;
+ }
+ if (parent != null && !StringUtils.isBlank(parent.getGroupId())) {
+ return parent.getGroupId();
+ }
+ return null;
}
public @Nullable String getVersion() {
- if (version == null) {
- if (currentVersion == null) {
- if (parent == null) {
- return null;
- } else {
- return parent.getVersion();
- }
- } else {
- return currentVersion;
- }
+ if (!StringUtils.isBlank(version)) {
+ return version;
}
- return version;
+ if (!StringUtils.isBlank(currentVersion)) {
+ return currentVersion;
+ }
+ if (parent != null && !StringUtils.isBlank(parent.getVersion())) {
+ return parent.getVersion();
+ }
+ return null;
}
@@ -428,15 +431,26 @@ public Pom toPom(@Nullable Path inputPath, @Nullable MavenRepository repo) {
getParent().getGroupId(), getParent().getArtifactId(),
getParent().getVersion()), getParent().getRelativePath());
+ String resolvedGroupId = getGroupId();
+ String resolvedVersion = getVersion();
+ if (resolvedGroupId == null || resolvedVersion == null) {
+ throw new MavenParsingException(
+ "POM is missing a required coordinate:" +
+ (resolvedGroupId == null ? " groupId" : "") +
+ (resolvedVersion == null ? " version" : "") +
+ " for " + new GroupArtifactVersion(resolvedGroupId, artifactId, resolvedVersion) +
+ (repo == null ? "" : " (from " + repo.getUri() + ")"));
+ }
+
Pom.PomBuilder builder = Pom.builder()
.sourcePath(inputPath)
.repository(repo)
.parent(parent)
.gav(new ResolvedGroupArtifactVersion(
repo == null ? null : repo.getUri(),
- Objects.requireNonNull(getGroupId()),
+ resolvedGroupId,
artifactId,
- Objects.requireNonNull(getVersion()),
+ resolvedVersion,
null))
.name(name)
.obsoletePomVersion(pomVersion)
diff --git a/rewrite-maven/src/test/java/org/openrewrite/maven/internal/RawPomTest.java b/rewrite-maven/src/test/java/org/openrewrite/maven/internal/RawPomTest.java
index 246933325e1..6a5d4f46653 100644
--- a/rewrite-maven/src/test/java/org/openrewrite/maven/internal/RawPomTest.java
+++ b/rewrite-maven/src/test/java/org/openrewrite/maven/internal/RawPomTest.java
@@ -610,4 +610,108 @@ void deserializePluginConfiguration() throws Exception {
assertThat(plugin.getConfigurationList("grandparent.parent.child.stringList", String.class)).hasSize(4)
.contains("f", "r", "e", "d");
}
+
+ @Test
+ void missingGroupIdThrowsParsingException() {
+ RawPom pom = RawPom.parse(
+ //language=xml
+ new ByteArrayInputStream("""
+
+ 4.0.0
+ my-app
+ 1
+
+ """.getBytes()),
+ null
+ );
+
+ assertThatThrownBy(() -> pom.toPom(null, null))
+ .isInstanceOf(MavenParsingException.class)
+ .hasMessageContaining("missing a required coordinate")
+ .hasMessageContaining("groupId")
+ .hasMessageContaining("my-app");
+ }
+
+ @Test
+ void missingVersionThrowsParsingException() {
+ RawPom pom = RawPom.parse(
+ //language=xml
+ new ByteArrayInputStream("""
+
+ 4.0.0
+ com.mycompany.app
+ my-app
+
+ """.getBytes()),
+ null
+ );
+
+ assertThatThrownBy(() -> pom.toPom(null, null))
+ .isInstanceOf(MavenParsingException.class)
+ .hasMessageContaining("missing a required coordinate")
+ .hasMessageContaining("version");
+ }
+
+ @Test
+ void emptyGroupIdElementThrowsParsingException() {
+ RawPom pom = RawPom.parse(
+ //language=xml
+ new ByteArrayInputStream("""
+
+ 4.0.0
+
+ my-app
+ 1
+
+ """.getBytes()),
+ null
+ );
+
+ assertThatThrownBy(() -> pom.toPom(null, null))
+ .isInstanceOf(MavenParsingException.class)
+ .hasMessageContaining("groupId");
+ }
+
+ @Test
+ void whitespaceVersionElementThrowsParsingException() {
+ RawPom pom = RawPom.parse(
+ //language=xml
+ new ByteArrayInputStream("""
+
+ 4.0.0
+ com.mycompany.app
+ my-app
+
+
+ """.getBytes()),
+ null
+ );
+
+ assertThatThrownBy(() -> pom.toPom(null, null))
+ .isInstanceOf(MavenParsingException.class)
+ .hasMessageContaining("version");
+ }
+
+ @Test
+ void groupIdInheritedFromParentStillResolves() {
+ RawPom pom = RawPom.parse(
+ //language=xml
+ new ByteArrayInputStream("""
+
+ 4.0.0
+
+ com.mycompany.app
+ my-parent
+ 1
+
+ my-app
+
+ """.getBytes()),
+ null
+ );
+
+ Pom resolved = pom.toPom(null, null);
+ assertThat(resolved.getGroupId()).isEqualTo("com.mycompany.app");
+ assertThat(resolved.getVersion()).isEqualTo("1");
+ }
}