使用 Gradle 将模块化库发布到 Maven

Publishing of a modular library to Maven using Gradle

假设我正在使用 Gradle 进行模块化库开发。在我的根项目中,我有子项目 geometryalgorithmsvisualizer,我想发布每个子项目的 jar 工件。

至于现在在我的根 build.gradle 我有以下部分:

apply plugin: 'maven-publish'
publishing {
    publications {
        publishDemos(MavenPublication) {
            groupId 'ru.ifmo.ctddev.igushkin.cg'
            artifactId 'geometry'
            version globalVersion
            artifact project(':geometry').tasks.getByName('jar')
        }
        publishAlgorithms(MavenPublication) {
            groupId 'ru.ifmo.ctddev.igushkin.cg'
            artifactId 'algorithms'
            version globalVersion
            artifact project(':algorithms').tasks.getByName('jar')
        }
        publishVisualizer(MavenPublication) {
            groupId 'ru.ifmo.ctddev.igushkin.cg'
            artifactId 'visualizer'
            version globalVersion
            artifact project(':visualizer').tasks.getByName('jar')
        }
    }
}

我的第一个问题:是否有更简短的描述出版物的方式?例如,我想声明,对于每个子项目,我需要一个出版物,其名称设置为 artifactId


接下来,我的子项目相互依赖,algorithmsvisualizer 都依赖于 geometry 的 类,但此时 jars 不包含依赖项,例如,如果用户想使用 algorithms.

,则必须向 geometryalgorithms 添加依赖项

那么,有没有办法提供某种自动依赖性,以便添加 algorithms 也会添加 geometry?如果是,我该怎么做?如果不是,提供模块化库的惯用方式是什么?我应该 assemble 带有依赖项的罐子吗?

UPD:我应该只使用 from project(':...').components.java 而不是 artifact ... 是对的吗,因为它会同时获取工件和依赖项?如果我使用 artifact ...?

如何单独选择依赖项

您可以通过将相同的发布配置注入每个子项目来减少冗长的发布声明。例如,对于具有以下结构的多构建项目:

ROOT
│   build.gradle
│   settings.gradle
├───subA
│       build.gradle
│
├───subB
│       build.gradle
│
└───subC
        build.gradle

在您的根 build.gradle 中,您可以:

apply plugin:'maven-publish'

subprojects{
    publishing {
        publications {
            "$project.name"(MavenPublication) {
                groupId project.group
                artifactId project.name
                version project.version
                from components.java
            }
        }
    }
}

每个子项目定义自己的groupid和版本,如下所示:

group = 'org.test.sample.A'
version = '1.0'

artifactId 从子项目名称中获取。 运行 gradle publish 导致此结构的回购:

org
└───test
    └───sample
        ├───A
        │   └───subA
        │       └───1.0
        │               subA-1.0.jar
        │               subA-1.0.pom
        ├───B
        │   └───subB
        │       └───1.0
        │               subB-1.0.jar
        │               subB-1.0.pom
        └───C
            └───subC
                └───1.0
                        subC-1.0.jar
                        subC-1.0.pom

依赖关系

此配置还会自动处理依赖项。例如,如果在子项目 subA 中你有:

dependencies{
    compile project(':subB')
}

由于我使用的是 from components.java 而不是 artifact,该插件知道查找依赖项并为 subA 生成一个 pom,其中包括:

  <dependencies>
    <dependency>
      <groupId>org.gradle.sample.B</groupId>
      <artifactId>subB</artifactId>
      <version>1.0</version>
      <scope>runtime</scope>
    </dependency>
  </dependencies>