7

我在 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

4 回答 4

5

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

publishing {
    publications {
        mavenJava(MavenPublication) {
            groupId = 'com.group'
        }
    }
}
于 2015-03-03T21:54:11.113 回答
1

我遇到了同样的问题,结果发现 Artifactory 存储库不是 Maven 存储库,而是通用存储库。我花了很长时间才注意到,因为我没有创建存储库,并且我认为它是一个 Maven 存储库,否则部署/解析工作正常。
切换到 Maven 存储库后,发布时会生成 maven-metadata.xml。

于 2020-02-06T01:33:35.077 回答
0

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

于 2015-03-03T01:39:31.617 回答
0

接受的答案是正确的。我投了赞成票。但是,也有这个警告。

我有一个多模块项目,所以我将使用“allprojects”。如果您有一个整体/单一 jar ( :( ).. 您可以使用与“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 和 version 有默认值,所以不要随意覆盖: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)

应该保留(恕我直言)到默认值不适合您的情况。这通常是极少数的时间。

笔记:

我的 non-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 的角度考虑,模块间的界限是清晰的,因此您可以在不影响其他模块的情况下维护和改进一个模块。

大规模的重构被证明是困难的。如果你将某个东西构建为一个单一的系统,然后发现到处都有重复的代码,并且你想正确地重构它,那么你将完成一项艰巨的工作。相反,如果您将其编写为组件,但您的某些组件边界有点错误,您可以轻松调整它们。

——Joshua Bloch,谷歌前首席 Java 架构师。模块化分解链接

于 2020-09-27T07:14:40.343 回答