我有一個Gradle 7.0發布任務,在我的Java Spring boot專案子模塊build.gradle檔案中這樣定義:
publishing {
出版物 {
maven(MavenPublication) {
groupId 'com.sportswin.soa'
artifactId 'soa-auth-api'/span>
版本('1.0.0-SNAPSHOT')
從 components.java
artifact sourceJar {
"sources"分類器
}
}
}
資源庫 {
maven {
url = version.endWith('SNAPSHOT') ? "${dabaiSnapshotRepo}" : "${dabaiReleaseRepo}"。
url = "$url"/span>
憑證 {
用戶名 "$mavenLoginName"/span>
密碼 "$mavenPassword"/span>
}
}
}
}
它在我的每個子模塊中都運行良好。唯一的問題是,這段代碼必須被復制到我的每個子模塊中。現在的子模塊增加了50多個。我必須在每個地方復制和粘貼它。
是否可以將發布任務定義為一個公共任務,我只需要傳遞一些引數,如groupId, artifactId, version?我應該怎么做才能使它像這樣作業,這樣我就不必復制和粘貼重復的代碼片段了?
我的專案結構是這樣的:
rootProject
-- build.gradle
-- setting.gradle
模塊1
-- build.gradle
模塊2
-- build.gradle
BTW,這是完整的子模塊build.gradle:
project(":soa-auth") {
依賴性 {
}
}
project(":soa-auth:soa-auth-api") {
jar {
enabled = truefalse } bootJar {
}
依賴性 {
api project(":soa-misc-biz")。
}
出版 {
出版物 {
maven(MavenPublication) {
groupId 'com.sportswin.soa'。
artifactId 'soa-auth-api'/span>
版本('1.0.0-SNAPSHOT')
從 components.java
artifact sourceJar {
"sources"分類器
}
}
}
資源庫 {
maven {
url = "${dabaiSnapshotRepo}"/span>
url = "$url"。
憑證 {
用戶名 "$mavenLoginName"/span>
密碼 "$mavenPassword"/span>
}
}
}
}
}
project(":soa-auth:soa-auth-service") {
archivesBaseName = "soa-auth-service""1.0.0-SNAPSHOT"/span>
bootJar {
清單 {
屬性 'Start-Class'。'com.sportswin.soa.auth.AppStarter'。
}
}
依賴性 {
實作("org.springframework.cloud:spring-cloud-starter-netflix-ureka-client")
實作 project(":soa-auth:soa-auth-api")
}
}
我很高興能提供任何額外的資訊來解決這個問題。
uj5u.com熱心網友回復:
解決方案1:buildSrc
buildSrc是一個特殊的檔案夾,被Gradle隱含地視為一個包含的構建。你可以把一些常見的構建邏輯放在這里。
結構
├── buildSrc
│ ├── src/main/groovy/com.example.my-publishing.gradle
│ └── build.gradle
├──模塊1
│ └── build.gradle
├──模塊2
│ └── build.gradle
└── build.gradle
└──設定.gradle
./buildSrc/build.gradle
plugins {
id 'groovy-gradle-plugin'.
}
資源庫 {
gradlePluginPortal()
./buildSrc/src/main/com.example.my-publishing.gradle
plugins {
id 'java'/span>
id 'maven-publish'/span>
}
java {
withSourcesJar()
}
發布 {
出版物 {
maven(MavenPublication) {
from components.java {
}
}
資源庫 {
...
}
}
./module1/build.gradle
plugins {
...
id 'com.example.my-publishing'
}
解決方案2:明確的buildSrc
這個方案與第一個方案幾乎相同。我更喜歡這個方案,因為我相信顯式比隱式更好。
結構
├── build-conventions <-- 使用除'buildSrc'以外的任何名稱。
│ ├── src/main/groovy/com.example.my-publishing.gradle
│ ├── build.gradle
│ └──settings.gradle <--留空
├──模塊1
│ └── build.gradle
├──模塊2
│ └── build.gradle
├── build.gradle
└──設定.gradle
./settings.gradle
...
include('module1')
include('module2')
includeBuild('build-conventions')
解決方案3:獨立的插件
如果你的發布邏輯有一天變得非常復雜,你可能需要這個。我選擇用Kotlin來實作靜態型別化。你也可以用Groovy來寫。結構
├──插件
│ ├── src/main/kotlin/com/example/MyPublishingPlugin.kt
│ ├── build.gradle.kts
│ └── settings.gradle.kts <-- 留空。
├──模塊1
│ └── build.gradle
├──模塊2
│ └── build.gradle
├── build.gradle
└──設定.gradle
./settings.gradle
...
include('module1')
include('module2')
includeBuild('plugins')
./plugins/build.gradle.kts
plugins {
`java-gradle-plugin'。
id("org.jetbrains.kotlin.jvm"/span>) version "1.5.0"/span>
}
資源庫 {
mavenCentral()
}
依賴性 {
implementation(platform("org.jetbrains.kotlin:kotlin-bom")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
testImplementation("org.jetbrains.kotlin:kotlin-test")
testImplementation("org.jetbrains.kotlin:kotlin-test-junit")
}
gradlePlugin {
val myPublishing by plugins.creating {
id = "com.example.my-publishing"/span>
implementationClass = "com.example.MyPublishingPlugin"/span>
}
}
./plugins/src/main/kotlin/com/example/MyPublishingPlugin.kt
package com.example
import org.gradle.api.Project
import org.gradle.api.Plugin
import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.publish.maven.plugins.MavenPublishPlugin
class MyPublishingPlugin。Plugin<Project> {
override fun apply(project: Project) {
project.plugins.apply(MavenPublishPlugin::class.java)
project.afterEvaluate {
project.configureJavaExtension()
project.configurePublishingExtension()
}
}
private fun Project.configureJavaExtension() {
val extension = this.extensions.getByType(JavaPluginExtension::class.java)
extension.withSourcesJar()
}
private fun Project.configurePublishingExtension() {
val extension = this.extensions.getByType(PublishingExtension::class.java)
extension.publications { container ->
container.create("maven", MavenPublication::class.java) {
it.from(this.component.getByName("java")
}
}
extension.repositories {
it.maven { repo ->
repo.url = this.uri(this.layout.buildDirectory.dir("repo")
//------------ YOUR IMPLEMENTATION ------------
}
}
}
}
./module1/build.gradle
plugins {
...
id 'com.example.my-publishing'
}
你可以通過gradle init命令生成一個完整的Gradle插件專案。如果你需要向一個插件傳遞額外的引數,你可以將一個自定義擴展附加到它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/330186.html
標籤:
