我正在尝试使用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
和我想这发布罐子:my-spring-boot-starter-base.jar
和my-spring-boot-starter-module1.jar
。
Basebuild.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插件使用这个字段为每个子模块创建一个工件。