java - 发布一个简单的 Java 库到 Maven

标签 java maven gradle build artifactory

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

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

但是,还有很多问题没有解答:

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

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

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

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

~/.gradle/gradle.properties 读取值

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

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

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

最佳答案

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

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 的方法调用哪个Jar任务类型是的子类。
  • components 又是另一个方法调用。您实际上是在调用 ProjectgetComponents() .
    • components.javacomponents.getByName("java") 的糖。这是因为 Groovy 的动态/魔法而起作用.

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

这是由于 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 .


我想通过使用 Kotlin DSL 提供您的答案的完整示例作为结束。同样使用 buildscript { } 是应用插件的传统方法,如前所述 here .您应该继续使用更新/首选的 plugins{} block 。更多信息 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")
    // ...
}

关于java - 发布一个简单的 Java 库到 Maven,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57837967/

相关文章:

java - 认可的 dir 机制不起作用?

java - 在 OpenShift 上使用 JPA 时出现奇怪的错误

java - 如何让 PMD 在 Maven 构建开始而不是结束时运行?

java - 使用Gradle在Spring Boot中从环境变量设置spring.profiles.active

java - 是否可以仅针对特定风格包含并初始化 HockeyApp SDK?

java - 使用 JFileChooser 将某些文本从 JTextArea 保存到文件

java - 运行时显示的小程序中的随机数会更新每一帧,或被背景图像 overdraw

java - 如何将本地 jar 文件添加到 Maven 项目?

java - Maven 项目上的 MyEclipse 2017 CI 10 错误

android - 带有Gradle Release插件的Android构建