将简单的 Java 库发布到 Maven

ech*_*hen 5 java build artifactory gradle maven

我可能在这里遗漏了一些重要的东西。但是,我正在努力将一个简单的库发布到 Maven 存储库(该库将由组织中其他基于 Maven 的项目使用)

我找到的最好的指南是在 Gradle 官方网站上:https ://docs.gradle.org/current/userguide/publishing_maven.html

然而,仍有许多问题没有得到解答:

  • 除了手动包含 if-else 语句之外,是否没有其他方法可以区分 SNAPSHOT 和发布版本?

  • 什么是from components.java?IDEA 没有提供关于大多数 DSL 的自动完成或文档(与 Maven 不同,Maven 的代码智能效果很好)

  • 如何发布到需要身份验证的私有存储库?我知道某处必须有一个块使用:

        username = "${artifactory_user}"
        password = "${artifactory_password}"
    
    Run Code Online (Sandbox Code Playgroud)

读取值~/.gradle/gradle.properties

但我该把这个块放在哪里呢?

总的来说,我觉得我在这里遗漏了一些东西,也许是一些被广泛阅读的文档...使用 Maven 本身,该过程相当简单,官方文档使该过程相对轻松

使用 Gradle,我觉得最简单的发布到存储库需要相当多的定制逻辑,因为我的直觉告诉我,如此常见的东西必须已经封装在具有合理默认值的插件中

Fra*_*teo 6

我看到您已经找到了解决方案,但我的回答旨在为您的问题提供详细的答案。

除了手动包含 if-else 语句之外,是否没有其他方法可以区分 SNAPSHOT 和发布版本?

正确的。语句if-else正是区分快照和发布版本所需要的。Gradle 本身不提供任何类型的版本控制功能。这由您来处理或使用诸如Nebula Release之类的插件来处理。

什么是from components.java

  • from是一个方法调用AbstractCopyTaskJar任务类型是其子类。
  • components又是另一个方法调用。您实际上正在getComponents()呼叫Project.
    • components.java是糖components.getByName("java")。这是因为Groovy的动态/魔力。

IDEA 没有提供关于大多数 DSL 的自动完成或文档(与 Maven 不同,Maven 的代码智能效果很好)

这是由于 Groovy 的动态/弱类型造成的。该build.gradle文件是使用 Groovy 编写的。IntelliJ 确实尝试推断构建脚本的类型,但不能完全推断。幸运的是,您现在可以使用 Kotlin 编写构建脚本:

我强烈建议继续使用 Kotlin DSL。你会确切地知道一切都是从哪里来的。

如何发布到需要身份验证的私有存储库?

不幸的是,该插件的文档maven-publish仅在一句话中提到了它。即便如此,它只是引导您访问 API 文档,这些文档并不总是有帮助,但您能够弄清楚。

https://docs.gradle.org/current/userguide/publishing_maven.html

您还可以配置连接到存储库所需的任何身份验证详细信息。有关更多详细信息,请参阅MavenArtifactRepository 。

最后:

(...) 从 ~/.gradle/gradle.properties 读取的值

Gradle 将不遗余力地解决属性问题。gradle.properties这只是 Gradle 寻找房产的众多地点之一。您可以在此处顶部的“属性”部分下查看更多详细信息。


最后,我想使用 Kotlin DSL 提供一个完整的答案示例。还使用的buildscript { }是应用插件的传统方法,如此处所述plugins { }您应该继续使用较新/首选的块。更多信息请点击这里

plugins {
    `maven-publish`
    id("org.jetbrains.kotlin.jvm") version "1.3.31"
}

group = "com.company"
version = "1.0.0-SNAPSHOT"

tasks.wrapper {
    gradleVersion = "5.6.1"
    distributionUrl = "https://services.gradle.org/distributions/gradle-$gradleVersion-all.zip"
}

val sourcesJar by tasks.registering(Jar::class) {
    archiveClassifier.set("sources")
    from(sourceSets.main.get().allSource)
}

repositories {
    mavenCentral()
}

publishing {
    publications {
        register<MavenPublication>("mavenJava") {
            artifactId = "some-artifactId"
            from(components["java"])
            artifact(sourcesJar.get())
            pom {
                name.set("Project Name")
            }
        }
    }
    repositories {
        maven {
            url = uri("https://company.jfrog.io/company/maven-local")
            credentials {
                username = property("artifactory_user") as String
                password = property("artifactory_password") as String
            }
        }
    }
}

val test by tasks.getting(Test::class) {
    useJUnitPlatform()
}

dependencies {
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    // ...
}
Run Code Online (Sandbox Code Playgroud)