首页 文章

使用Gradle-Artifactory插件发布子项目

提问于
浏览
5

我有以下多项目Gradle构建:

myapp/
    myapp-client/
        build.gradle
        src/** (omitted for brevity)
    myapp-shared/
        build.gradle
        src/** (omitted for brevity)
    myapp-server
        build.gradle
        src/** (omitted for brevity)
    build.gradle
    settings.gradle

myapp/build.gradle 的样子:

subprojects {
    apply plugin: 'groovy'
    sourceCompatibility = '1.7'
    targetCompatibility = '1.7'
    [compileJava, compileTestJava]*.options*.encoding = 'UTF-8'

    repositories {
        mavenCentral()
        maven {
            // My local/private Artifactory
            url "http://localhost:8081/artifactory/myapp-snapshots"
        }
    }

    dependencies {
        compile (
            'org.codehaus.groovy:groovy-all:2.3.7'
        )
    }
}

目前,3个子项目Gradle文件中的每一个都非常简单:

dependencies {
    compile (
        'org.apache.commons:commons-lang3:3.3.2'
    )
}

这是我想要实现的目标:

  • 当我从父 myapp 目录运行 gradle clean build -Pversion=0.1.5 时,我希望所有三个子项目都使用0.1.5的版本构建;因此 myapp-client-0.1.5.jarmyapp-shared-0.1.5.jarmyapp-server-0.1.5.jar . 目前我的构建已经这样做,但是......

  • 如果客户端和共享JAR成功构建,我还希望将它们发布到我的私有Artifactory仓库 . (我不希望发布服务器JAR) .

我能够找到并测试/确认将Gradle构建的JAR发布到Artifactory的最紧凑的代码是:

buildscript {
    repositories {
        maven {
            url 'http://localhost:8081/artifactory/plugins-release'
            credentials {
                username = "admin"
                password = "12345"
            }
            name = "maven-main-cache"
        }
    }
    dependencies {
        classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.0.1"
    }
}

apply plugin: 'maven-publish'
apply plugin: "com.jfrog.artifactory"

repositories {
    add buildscript.repositories.getByName("maven-main-cache")
    maven {
        url "http://localhost:8081/artifactory/myapp-snapshots"
    }
}

artifactory {
    contextUrl = "http://localhost:8081/artifactory"
    publish {
        repository {
            repoKey = 'myapp-snapshots'
            username = "admin"
            password = "12345"
            maven = true
        }
        defaults {
            publications ('mavenJava')
        }
    }
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }
}

当我在测试 build.gradle 项目中使用此代码段并运行 gradle artifactoryPublish 时,它会正确地将我的JAR发布到Artifactory .

我的问题: How can I add this snippet to my project such that running gradle clean build from the parent dir, on success, produces client and shared JARs being published to Artifactory?

虽然不理想,但如果不可能一下子完成所有这一切,我愿意将出版单独的第二步 . 有任何想法吗?

1 回答

  • 3

    使用 artifactory 插件是正确的方法 . 您需要将其应用于 allprojects 并使用 artifactoryPublish.skip=true 禁用顶级项目上的部署 . 您可以找到与您的项目非常类似的完整工作示例here .

    默认情况下 build 不依赖于 artifactoryPublish ,因此您需要运行 gradle build artifactoryPublish 来上传jar . 原因是您可能希望运行大量构建,直到您决定上传某些内容 . 您可以通过将 build 配置为依赖于 artifactoryPublish 来 Build 依赖关系:

    build(dependsOn: 'artifactoryPublish')
    

相关问题