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

sme*_*eeb 6 publish artifactory gradle maven

我有以下多项目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
Run Code Online (Sandbox Code Playgroud)

其中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'
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

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

dependencies {
    compile (
        'org.apache.commons:commons-lang3:3.3.2'
    )
}
Run Code Online (Sandbox Code Playgroud)

这是我想要实现的目标:

  • 当我gradle clean build -Pversion=0.1.5从父myapp目录运行时,我希望所有三个子项目都使用0.1.5的版本构建; 因此myapp-client-0.1.5.jar,myapp-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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我的问题:如何将这个片段添加到我的项目中,以便gradle clean build从父目录运行,成功时,会生成发布到Artifactory的客户端和共享JAR?

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

JBa*_*uch 4

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

默认情况下build不依赖artifactoryPublish,所以需要运行gradle build artifactoryPublish才能上传jar。原因是您可能想要运行大量构建,直到您决定上传某些内容。您可以通过配置来建立依赖build关系artifactoryPublish

build(dependsOn: 'artifactoryPublish')
Run Code Online (Sandbox Code Playgroud)

  • @Adil我认为JBaruch正在引用https://github.com/JFrogDev/project-examples/tree/master/gradle-examples。这是4.x版本https://github.com/JFrogDev/project-examples/blob/master/gradle-examples/4/gradle-example/build.gradle#start-of-content (2认同)