Creating/publishing 每个 Gradle 子模块一个 jar

Creating/publishing a jar per Gradle submodule

我正在尝试使用 Gradle 创建一个 Spring Boot Starter 项目,目的是让每个子模块成为一个不同的库(就像你如何拥有 spring-boot-starter-web, spring-boot-starter-security 等) .

但是,我很难Gradle正确生成 jar,并将它们发布到 Maven 存储库。理想情况下,我想在 Gradle 中使用 DRY 方法,因为我希望项目自动生成一个 jar 并随着起始项目的增长(尽可能少的代码更改)为每个子模块发布。

我的项目结构是:

base-repository:
- my-spring-boot-starter-base
- my-spring-boot-starter-module1

我希望这样发布 jar:my-spring-boot-starter-base.jarmy-spring-boot-starter-module1.jar

基础build.gradle:

import org.springframework.boot.gradle.plugin.SpringBootPlugin

plugins {
    id 'org.springframework.boot' version '2.6.7'
    id 'java'
    id 'java-library'
    id 'maven-publish'
}

allprojects {
    apply plugin: 'java'

    repositories {
        mavenCentral()
    }

    bootJar {
        enabled = false
    }
}

subprojects {
    apply plugin: 'java-library'

    dependencies {
        implementation platform(SpringBootPlugin.BOM_COORDINATES)
    }

    jar {
        enabled = true
    }

    publishing {
        publications {
            withSources(MavenPublication) {
                from components.java
            }
        }
        repositories {
            maven {
                url = 'https://my-repo'
            }
        }
    }
}

wrapper {
    gradleVersion = '7.4.2'
}

基础settings.gradle:

rootProject.name = 'my-spring-boot-starter'

include 'my-spring-boot-starter-base'
include 'my-spring-boot-starter-module1'

两个子模块都有 build.gradle 个类似于以下内容的文件:

dependencies {
   ...
}

我的 gradle 配置在你有一个子模块时有效,但不是多个。对于多个,构建失败并出现以下错误:

A problem occurred evaluating root project 'my-spring-boot-starter'.
> Maven publication 'withSources' cannot include multiple components

希望得到一些帮助!

所以我找到了解决我自己问题的方法。在根 build.gradle 中,改为使用:

subprojects {
    ...

    publishing {
        publications {
            "$project.name"(MavenPublication) {
                artifactId project.name
                from components.java
            }
        }
        repositories {
            maven {
                url = 'https://my-repo'
            }
        }
    }
}

project.name 获取子模块的名称,我们告诉 maven-publish 插件使用此字段为每个子模块创建一个工件。