BootJar + MavenJar. Артефакт не был создан этой сборкой - PullRequest
1 голос
/ 14 апреля 2020

У меня есть пример проекта со следующей иерархией:

Sample (root)
   -- model (simple jar)
   -- api   (springboot jar)

Я хочу опубликовать sh оба сгенерированных файла jar: plain jar & bootJar в моем localRepository.

gradlew clean build -xTest publishToMavenLocal    

Однако возникает следующая ошибка:

* What went wrong:
Execution failed for task ':api:publishMavenJavaPublicationToMavenLocal'.
> Failed to publish publication 'mavenJava' to repository 'mavenLocal'
   > Artifact api.jar wasn't produced by this build.

root build.gradle является следующим:

plugins {
    id 'java'
    id "org.springframework.boot" version "2.2.5.RELEASE" apply false
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
}
group 'sample'
version '1.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}
ext {
    artifactVersion = version
    springBootVersion = "2.2.5.RELEASE"
}

allprojects {
    apply plugin: 'java'
    apply plugin: 'idea'
    apply plugin: 'maven'
    tasks.withType(JavaCompile) {
        options.encoding = 'UTF-8'
    }
    repositories {
        mavenCentral()
        jcenter()
    }
}

subprojects {
    apply plugin: "io.spring.dependency-management"
    apply plugin: "maven-publish"

    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8

    dependencyManagement {
        imports {
            mavenBom "org.springframework.boot:spring-boot-dependencies:${springBootVersion}"
        }
    }
    dependencies {
        implementation "org.springframework.boot:spring-boot-dependencies:${springBootVersion}"
    }

    publishing {
        publications {
            mavenJava(MavenPublication) {
                groupId project.group
                artifactId project.name
                version project.version

                from components.java
            }
        }
    }
}

api build.gradle

apply plugin: 'org.springframework.boot'

dependencies {
    compile project(":model")
    implementation "org.springframework.boot:spring-boot-starter-web"
}

bootJar {
}

Добавление Задача boot Java для api build.gradle позволяет публиковать sh bootJar непосредственно из модуля api, но задача root publi sh остается неработоспособной.

publishing {
    publications {
        bootJava(MavenPublication) {
            artifact bootJar
        }
    }
}

Я пробовал почти каждое решение от docs & google, но ни одно, похоже, не работает. Кто-нибудь может объяснить, что неправильно настроено?

Версия Gradle: 6.3

1 Ответ

1 голос
/ 16 апреля 2020

Как указано в документации Gradle здесь :

Начиная с Gradle 6.2, Gradle выполняет проверку работоспособности перед загрузкой, чтобы убедиться, что вы не загружаете устаревшие файлы (файлы). производится другим билдом). Это создает проблему с приложениями Spring Boot, которые загружаются с использованием компонентов. java component

Более подробное описание доступно по ссылке выше. Они предлагают следующий обходной путь, который я лично попробовал и работал для меня:

настроить исходящие конфигурации

configurations {
       [apiElements, runtimeElements].each {
           it.outgoing.artifacts.removeIf { it.buildDependencies.getDependencies(null).contains(jar) }
           it.outgoing.artifact(bootJar)
       }
    }

здесь после конфигурации из моего build.gradle:

....
apply plugin: 'maven-publish'
...

configurations {
    [apiElements, runtimeElements].each {
        it.outgoing.artifacts.removeIf { it.buildDependencies.getDependencies(null).contains(jar) }
        it.outgoing.artifact(bootJar)
    }
    ....
}


publishing {
    publications {
        myPublication(MavenPublication) {
            groupId groupId
            artifactId artifactId
            version version
            from components.java
            versionMapping {
                usage('java-api') {
                    fromResolutionOf('runtimeClasspath')
                }
                usage('java-runtime') {
                    fromResolutionResult()
                }
            }
        }
    }
    repositories {
        maven {
            url azureRepoUrl
            name azureRepoName
            credentials {
                username azureRepoUserName
                password azureRepoAccessToken
            }
        }
    }
}
...