使用 Gradle 将模块化库发布到 Maven
Publishing of a modular library to Maven using Gradle
假设我正在使用 Gradle 进行模块化库开发。在我的根项目中,我有子项目 geometry
、algorithms
、visualizer
,我想发布每个子项目的 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
。
接下来,我的子项目相互依赖,algorithms
和 visualizer
都依赖于 geometry
的 类,但此时 jars 不包含依赖项,例如,如果用户想使用 algorithms
.
,则必须向 geometry
和 algorithms
添加依赖项
那么,有没有办法提供某种自动依赖性,以便添加 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>
假设我正在使用 Gradle 进行模块化库开发。在我的根项目中,我有子项目 geometry
、algorithms
、visualizer
,我想发布每个子项目的 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
。
接下来,我的子项目相互依赖,algorithms
和 visualizer
都依赖于 geometry
的 类,但此时 jars 不包含依赖项,例如,如果用户想使用 algorithms
.
geometry
和 algorithms
添加依赖项
那么,有没有办法提供某种自动依赖性,以便添加 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>