【问题标题】:Publishing a simple Java library to Maven将一个简单的 Java 库发布到 Maven
【发布时间】:2020-01-10 06:34:00
【问题描述】:

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

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

然而,仍有许多未解之谜:

  • 除了手动包含 if-else 语句之外,没有办法区分 SNAPSHOT 和发布版本吗?

  • 什么是from components.java? IDEA 没有提供大多数这些 DSL 的自动完成或文档(不像 Maven,代码智能运行良好)

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

        username = "${artifactory_user}"
        password = "${artifactory_password}"
    

~/.gradle/gradle.properties读取值

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

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

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

【问题讨论】:

    标签: java maven gradle build artifactory


    【解决方案1】:

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

    除了手动包含 if-else 语句之外,没有办法区分 SNAPSHOT 和发布版本吗?

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

    什么是from components.java

    • from 是来自 AbstractCopyTask 的方法调用,Jar 任务类型是其子类。
    • components 又是另一个方法调用。您实际上是在调用Project 中的getComponents()
      • components.javacomponents.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 将寻找属性的众多位置之一。您可以在顶部here属性部分查看更多详细信息。


    最后,我想提供一个使用 Kotlin DSL 回答的完整示例。同样使用buildscript { } 是应用插件的传统方法,如here 所述。您应该继续使用更新/首选的 plugins { } 块。更多信息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")
        // ...
    }
    

    【讨论】:

      【解决方案2】:

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

      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"
      }
      

      【讨论】:

        猜你喜欢
        • 2016-01-11
        • 2018-04-10
        • 2017-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-20
        • 2018-06-04
        相关资源
        最近更新 更多