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.jar
和 my-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 插件使用此字段为每个子模块创建一个工件。
我正在尝试使用 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.jar
和 my-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 插件使用此字段为每个子模块创建一个工件。