11

我有一个项目,它有一个SharedCode(Java)模块,其次是一个Android(Android 库)模块,它依赖于该SharedCode模块。我想发布模块中的工件和模块jar中的工件。我不知道如何编写我的文件,以便在任务运行时两个模块都发布到 Artifactory。目前只有模块将其工件发布到 Artifactory。SharedCodeaarAndroidbuild.gradleartifactoryPublishSharedCode

我的build.gradle文件如下。请注意,maven-publish我的build.gradle文件方面似乎是正确的,因为当我运行publishToMavenLocal任务时,我在本地 Maven 文件夹(即'~/.m2/repository')中看到来自两个模块的工件。

首先,build.gradle我的SharedCode模块中的文件如下:

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

group = "${projectGroupId}"
version = "${projectVersionName}"

dependencies {
    compile 'com.google.guava:guava:18.0'
}

publishing {
    publications {
        SharedCode(MavenPublication) {
            groupId "${projectGroupId}"
            artifactId 'SharedCode'
            version "${projectVersionName}"
            from components.java
        }
    }
}

artifactory {
    contextUrl = "${artifactory_url}"
    publish {
        repository {
            repoKey = 'libs-release-local'
            username = "${artifactory_username}"
            password = "${artifactory_password}"
        }
        defaults {
            publications('SharedCode')
            publishArtifacts = true
            properties = ['qa.level': 'basic', 'dev.team': 'core']
            publishPom = true
        }
    }
}

其次,build.gradle我的Android模块中的文件如下:

apply plugin: 'com.android.library'
apply plugin: 'maven-publish'
apply plugin: 'com.jfrog.artifactory'

group = "${projectGroupId}"
version = "${projectVersionName}"

android {
    // android stuff here...
}

dependencies {
    compile project(':SharedCode')
}

publishing {
    publications {
        Android(MavenPublication) {
            groupId "${projectGroupId}"
            artifactId 'Android'
            version "${projectVersionName}"
            artifact "$buildDir/outputs/aar/Android-release.aar"
        }
    }
}

artifactory {
    contextUrl = "${artifactory_url}"
    publish {
        repository {
            repoKey = 'libs-release-local'
            username = "${artifactory_username}"
            password = "${artifactory_password}"
        }
        defaults {
            publications('Android')
            publishArtifacts = true
            properties = ['qa.level': 'basic', 'dev.team': 'core']
            publishPom = true
        }
    }
}

如果我artifactoryPublish在根、项目级别或SharedCode模块级别运行任务,那么我会看到如下输出:

18:23:38: Executing external task 'artifactoryPublish'...
Publication named 'SharedCode' does not exist for project ':Android' in task ':Android:artifactoryPublish'.
:SharedCode:generatePomFileForSharedCodePublication
:SharedCode:artifactoryPublish
Deploying artifact: http://localhost:8081/artifactory/libs-release-local/com/mycompany/sdk/SharedCode/0.0.2/SharedCode-0.0.2.jar
Deploying artifact: http://localhost:8081/artifactory/libs-release-local/com/mycompany/sdk/SharedCode/0.0.2/SharedCode-0.0.2.pom
Deploying build descriptor to: http://localhost:8081/artifactory/api/build Build successfully deployed.
Browse it in Artifactory under http://localhost:8081/artifactory/webapp/builds/client-sdk/1457375019604

BUILD SUCCESSFUL

请注意,SharedCode在这种情况下仅发布工件。

如果我artifactoryPublish在模块级别运行任务Android,那么我会看到如下输出:

18:25:25: Executing external task 'artifactoryPublish'...
Publication named 'SharedCode' does not exist for project ':Android' in task ':Android:artifactoryPublish'.
:Android:artifactoryPublish
Deploying build descriptor to: http://localhost:8081/artifactory/api/build
Build successfully deployed. Browse it in Artifactory under http://localhost:8081/artifactory/webapp/builds/client-sdk/1457375127269

BUILD SUCCESSFUL

请注意,在这种情况下不会发布任何工件。

4

3 回答 3

6

更新:从com.jfrog.artifactory Gradle 插件的版本4.6.0开始,在多模块项目中发布工件不起作用。从个人经验来看,你最好放弃这个插件并为 Java 库模块和 Android 库模块使用标准的maven-publish插件。

---以下是我发布上述更新之前的原始答案---

所以我终于让这一切正常了!特别感谢@RaGe 在此过程中帮助我。需要注意的关键点是该artifactory块需要在项目的根级build.gradle文件中,而不是在build.gradle各个模块的文件中。此外,您需要添加artifactoryPublish.skip=true到项目的根级build.gradle文件。请参阅此 GitHub 存储库以获取完整但尽可能少的示例:

https://github.com/adil-hussain-84/SO-35851251-Multiproject-Artifactory-Publish

万一链接停止工作,我也会在build.gradle此处粘贴文件的内容。首先,项目的根级build.gradle文件:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
        classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:4.0.1'
    }
}

allprojects {
    apply plugin: 'com.jfrog.artifactory'

    repositories {
        jcenter()
    }

    group = "${projectGroupName}"
    version = "${projectVersionName}"
}

artifactoryPublish.skip=true

artifactory {
    contextUrl = "${artifactory_url}"
    publish {
        repository {
            repoKey = 'libs-release-local'
            username = "${artifactory_username}"
            password = "${artifactory_password}"
        }
        defaults {
        publications('SomePublication')
            publishArtifacts = true
            properties = ['qa.level': 'basic', 'dev.team': 'core']
            publishPom = true
        }
    }
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.8'
}

其次,模块的build.gradle文件Android

apply plugin: 'com.android.library'
apply plugin: 'maven-publish'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 23
        versionCode Integer.parseInt("${projectVersionCode}")
        versionName "${projectVersionName}"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile project(':SharedCode')
    compile 'com.android.support:appcompat-v7:23.2.1'

    testCompile 'junit:junit:4.12'
}

publishing {
    publications {
        SomePublication(MavenPublication) {
            artifact "$buildDir/outputs/aar/Android-release.aar"

            //The publication doesn't know about our dependencies, so we have to manually add them to the pom
            pom.withXml {
                def dependenciesNode = asNode().appendNode('dependencies')

                //Iterate over the compile dependencies (we don't want the test ones), adding a <dependency> node for each
                configurations.compile.allDependencies.each {
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', it.group)
                    dependencyNode.appendNode('artifactId', it.name)
                    dependencyNode.appendNode('version', it.version)
                }
            }
        }
    }
}

第三也是最后,(Java)模块的build.gradle文件:SharedCode

apply plugin: 'java'
apply plugin: 'maven-publish'

dependencies {
    compile 'com.google.guava:guava:18.0'
}

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

就是这样!

于 2016-03-16T19:34:25.757 回答
3

通过他们的 github repo 上的人工多项目示例,似乎只有根项目需要有一个artifactory{...}配置部分,而不是像您所做的那样在每个子项目中。

此外,当您publications('SharedCode')在根项目中声明时,工件插件似乎正在寻找sharedCode在每个子项目中调用的发布。

我会尝试:

  • artifactory{...}从 android build.gradle 中删除该部分

  • 将 android 出版物也重命名sharedCode为(或两个项目中更通用的名称)

于 2016-03-09T22:39:41.407 回答
3

Gradle Artifactory 插件的 4.2.0 版本于上周发布,并添加了多个 Artifactory 存储库部署。现在,您可以简单地为项目的不同模块定义一个具有不同存储库的工件闭包。

于 2016-04-09T04:22:13.660 回答