将一个简单的 Java 库发布到 Maven

Publishing a simple Java library to Maven

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

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

但是,还有很多未解决的问题:

~/.gradle/gradle.properties

读取值

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

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

使用 Gradle,我觉得最简单的发布到存储库需要很多感觉就像自定义逻辑,当我的直觉说一些如此常见的东西必须已经封装在具有合理默认值的插件中时

在这里回答我自己的问题是发布到私人仓库的最低限度:

buildscript {
    ext.kotlin_version = '1.3.41'

    repositories {
        mavenCentral()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

plugins {
    id 'java-library'
    id 'maven-publish'
}

apply plugin: 'kotlin'

group 'com.company'
version '1.0.0-SNAPSHOT'

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

task sourcesJar(type: Jar, dependsOn: classes) {
    classifier = 'sources'
    from sourceSets.main.allSource
}

repositories {
    mavenCentral()
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            artifactId = 'some-artifactId'
            from components.java
            artifact sourcesJar
            pom {
                name = 'Project Name'
            }
        }
    }
    repositories {
        maven {
            url = "https://company.jfrog.io/company/maven-local"
            credentials {
                username = "${artifactory_user}"
                password = "${artifactory_password}"
            }
        }
    }
}

test {
    useJUnitPlatform()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
    compile "com.squareup.moshi:moshi-kotlin:1.8.0"
    compile "com.squareup.moshi:moshi-adapters:1.8.0"
    compile "com.squareup.okhttp3:okhttp:4.0.1"
    testImplementation "io.kotlintest:kotlintest-runner-junit5:3.1.0"
}

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

Is there no way to differentiate between SNAPSHOT and release builds other than to manually include the if-else statement?

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

What is from components.java

  • from 是来自 AbstractCopyTask which the Jar 任务类型的方法调用,是
  • 的子类
  • components 又是另一个方法调用。您实际上是在调用 ProjectgetComponents()
    • components.javacomponents.getByName("java") 的糖分。这是因为 Groovy.
    • 的 dynamic/magic

IDEA gives no autocomplete or documentation on most of these DSLs (unlike Maven, where the code intelligence works well)

这是由于 dynamic/weak 输入了 Groovy。 build.gradle 文件是使用 Groovy 编写的。 IntelliJ 确实会尝试推断构建脚本的类型,但不能完全推断。幸运的是,您现在可以使用 Kotlin 编写构建脚本:

我强烈建议继续使用 Kotlin DSL。您将确切地知道所有内容的来源。

How do I publish to a private repository that requires authentication?

不幸的是,maven-publish 插件的文档仅用一句话提到了它。即便如此,它只是将您引导至 API 文档,这些文档并非总是有用,但您能够弄明白。

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

You can also configure any authentication details that are required to connect to the repository. See MavenArtifactRepository for more details.

最后:

(...) the values being read from ~/.gradle/gradle.properties

Gradle 将竭尽全力解决 属性。 gradle.properties 只是 Gradle 寻找房产的众多地点之一。您可以在顶部 here.

Properties 部分下查看更多详细信息

我想通过使用 Kotlin DSL 提供您的答案的完整示例作为结束。同样使用 buildscript { } 是应用插件的传统方法,如 here. You should use the newer/preferred plugins { } block going forward. More info here.

所述
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")
    // ...
}