如何使用maven-publish和artifactory-gradle-plugin生成maven-metata.xml?

时间:2015-03-03 00:20:01

标签: maven gradle artifactory maven-metadata

我在groovy中编写了一个Gradle插件,并使用Gradle来构建它。我有一个本地网络Artifactory服务器,我将结果发布到使用Gradle Artifactory插件和Gradle中的maven-publish插件。我有另一个Gradle构建脚本,它依赖于这个插件作为依赖项。如果我用特定版本列出我的依赖项,我已经能够使这一切工作。我曾尝试使用maven版本范围(例如'[1.0,2.0)'),但这无法说它找不到maven-metadata.xml。我查了Artifactory,果然,它不存在。我需要做什么来制作它,最好是在插件的构建过程中?

以下是我的自定义gradle插件的build.gradle文件:

buildscript {
    repositories {
        maven {
            url "${artifactory_contextUrl}/plugins-release"
            credentials {
                username = "${artifactory_user}"
                password = "${artifactory_password}"
            }
        }
    }
    dependencies {
        classpath group: 'org.apache.directory.studio', name: 'org.apache.commons.io', version: '2.4'
        classpath group: 'org.jfrog.buildinfo', name: 'build-info-extractor-gradle', version: '2.0.9'
    }
}

plugins {
    id 'com.jfrog.artifactory' version '3.0.1'
}

apply plugin: 'groovy'
apply plugin: 'maven-publish'

artifactory {
    contextUrl = "${artifactory_contextUrl}"
    publish {
        repository {
            repoKey = 'plugins-snapshot-local'
            username = "${artifactory_user}"
            password = "${artifactory_password}"
            maven = true
        }
        defaults {
            publications ('mavenJava')
        }
    }
    resolve {
        repository {
            repoKey = 'libs-release'
            username = "${artifactory_user}"
            password = "${artifactory_password}"
            maven = true
        }
    }
}

dependencies {
    compile gradleApi()
    compile localGroovy()
}

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

我搜索了Gradle,Artifactory和Maven文档,以了解maven-metadata.xml以及如何生成和部署。它是有意义的,我可以手动构建一个,但我找不到具体解释如何使用maven-publish插件或artifactory-gradle-plugin在Gradle中自动生成它的任何内容。我不想手动更新文件,因为这会破坏自动化工作,我不想切换到mvn,因为我已经在Gradle投入了这么多。

4 个答案:

答案 0 :(得分:4)

必须将groupId添加到publications部分。实施后,maven-metadata.xml文件已发布到工件存储库。

publishing {
    publications {
        mavenJava(MavenPublication) {
            groupId = 'com.group'
        }
    }
}

答案 1 :(得分:1)

我遇到了同样的问题,事实证明Artifactory仓库不是Maven仓库,而是通用仓库。我花了很长时间才注意到,因为我没有创建存储库,而我认为这是一个Maven存储库,因此部署/解决其他问题按预期进行。
切换到Maven存储库后,发布时便生成了maven-metadata.xml。

答案 2 :(得分:0)

maven-metadata.xml应该由Artifactory处理。 Artifactory中的本地存储库布局是什么?

答案 3 :(得分:0)

接受的答案是正确的。我赞成。但是,也有此警告。

我有一个多模块项目,所以我将使用“ allprojects”。如果您使用的是单片/单罐(:()..,则可以使用与“ allprojects”不同的作用域。

这里的关键是您设置“组”。 (以及版本)

allprojects {

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


repositories {
    jcenter()
}

group = 'com.group'

version = '1.0-SNAPSHOT'

}

好吧,现在是build.gradle(在我的多模块项目中,它不是root-build.gradle)(但root build.gradle中的值将是相似的)

下面是我的非根build.gradle文件的全部内容

// the "name" variable inside the publications/myPublicationName block is getting overwritten.  so create a variable here to capture the name (as the artifactid)
def artifactIdForPublicationBlockHolder = "${name}"


dependencies {
    testImplementation group: 'junit', name: 'junit', version: junitVersion
}

println("hey.here.read.me")
println("group=${group}")
println("version=${version}")
println("artifactId=${name}")


publishing {
    publications {
        myCustomPublicationName(MavenPublication) {
            // groupId, artifactId and version have defaults, so do not arbitrarily override : https://docs.gradle.org/current/userguide/publishing_maven.html#publishing_maven:publications

//your value below could be slightly different, look for *.jar after you do ./gradlew. build (note, this path value (of "./") is relative to the non-root-build.gradle path, not the overall root-build.gradle
"./build/libs/${artifactIdForPublicationBlockHolder}-${version}.jar"
        }
    }
}

如链接所示,您将获得默认值

// groupId,artifactId和版本具有默认值,因此请勿随意覆盖:https://docs.gradle.org/current/userguide/publishing_maven.html#publishing_maven:publications

您只需要设置这些值,就像我上面用

显示的那样
group = 'com.group' 
version = '1.0-SNAPSHOT'

代码

使用

穿过研磨机几次之后
myCustomPublicationName(MavenPublication)

我发现我自定义设置的东西最少,越好。并且更愿意使用默认值...这意味着在build.gradle ..中设置驱动默认值的值...,而不是设置myCustomPublicationName(MavenPublication)

更改内部值

myCustomPublicationName(MavenPublication)

应保留(IMHO),以使默认设置不适合您。通常只有很少一部分时间。

注意:

我的非root-gradle.build顶部的

“ $ {name}”被我的多模块项目的目录结构填充。

我不知道它在非多模块中的工作方式,因为我从不编写整体。

我的代码中的

settings.gradle示例:

rootProject.name = 'com.me.myproject-rootProjectName'

include ':source:java:mydatalayer'
include ':source:java:mybizlogic'
include ':source:java:mydomain'

以下奖励报价:

此外,模块化分解代表了软件的关键组件 质量。如果您有一个紧密耦合的系统,则在调整一个 组件,整个系统崩溃。如果您考虑API, 模间边界很清楚,因此您可以维护和改进 一个模块而不会影响其他模块。

大规模重构非常困难。如果您以 整体系统,然后发现您在整个过程中都重复了代码 的地方,并且您想要适当地重构它,您将拥有庞大的 工作。相反,如果您将其编写为组件,但其中一些 组件边界有点错误,您可以轻松地对其进行调整。

-Google前首席Java架构师Joshua Bloch。模块化分解链接