Skip to content

Invalid pom is produced when using both the dependency management plugin and Gradle's bom support #257

Closed
@acidbee

Description

@acidbee

When including other BOMs in a build file, generating POMs for publishing artifacts include two dependency management nodes resulting in an invalid POM.

build.gradle.kts

plugins {
    java
    application
    maven
    `maven-publish`
    id("org.springframework.boot") version "2.1.5.RELEASE"
    id("com.gorylenko.gradle-git-properties") version "2.0.0"
}

apply(plugin = "io.spring.dependency-management")

group = "com.isonas"

repositories {
    mavenCentral()
}

// Configure Java
java {
    sourceCompatibility = JavaVersion.VERSION_11
    targetCompatibility = JavaVersion.VERSION_11
}

// Enable creating jar as part of build artifacts
tasks.getByName<Jar>("jar") {
    enabled = true
}

// Define main class name for distributions
springBoot {
    mainClassName = "com.isonas.microservice.App"
    buildInfo()
}

application {
    mainClassName = "com.isonas.microservice.App"
}

// Make sure distributions have launch scripts
tasks.bootJar {
    launchScript()
}

publishing {
    publications {
        create<MavenPublication>("jar") {
            from(components["java"])
            artifact(tasks.getByName("jar"))
        }

        create<MavenPublication>("bootJar") {
            artifact(tasks.getByName("bootJar"))
        }
    }
}

// Explicitly enable the JUnit 5 Jupiter engine
tasks.test {
    useJUnitPlatform()
}

// Project Dependencies
dependencies {
    // Bill of Materials
    implementation(platform("software.amazon.awssdk:bom:2.5.29"))

    // Annotation Processors
    annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")

    // Spring Boot Framework
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-actuator")

    // AWS
    implementation("software.amazon.awssdk:ssm")

    // Test Dependencies
    testImplementation("org.junit.jupiter:junit-jupiter-api")
    testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
}

Running a publish task results in an error

$gradle clean build publishToMavenLocal --stacktrace

> Task :publishJarPublicationToMavenLocal FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':publishJarPublicationToMavenLocal'.
> Failed to publish publication 'jar' to repository 'mavenLocal'
   > Invalid publication 'jar': POM file is invalid. Check any modifications you have made to the POM file.

...

Caused by: org.codehaus.plexus.util.xml.pull.XmlPullParserException: Duplicated tag: 'dependencyManagement' (position: START_TAG seen ...</dependencies>\n  <dependencyManagement>... @36:25)

build/publications/jar/pom-default.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.isonas</groupId>
  <artifactId>micro-service-template</artifactId>
  <version>unspecified</version>
  <packaging>pom</packaging>
  <!-- AWS SDK BOM -->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>bom</artifactId>
        <version>2.5.29</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>ssm</artifactId>
      <scope>runtime</scope>
    </dependency>
  </dependencies>
  <!-- Spring Boot BOM -->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.1.5.RELEASE</version>
        <scope>import</scope>
        <type>pom</type>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions