如何使用 maven-publish 插件将库发布到 Maven 存储库

经验丰富的开发人员会不时地创建一段代码,并希望在不同的项目中重用它。当这种情况出现时,知道如何发布一个库是很有用的,这样就可以很容易地将它合并到一个不同的项目中。在这篇文章中,我将描述如何使用maven-publish和com.jfrog将Kotlin库发布到JCenter的bintray Gradle插件中。

Gradle Maven插件

第一步是应用Maven插件。该插件增加了对将工件部署到Maven存储库的支持。请注意,在多项目构建的情况下,例如ShouldKO,应将Maven插件应用于定义了要发布的工件的每个项目。您可以用allprojects来消除重复,例如:

allprojects {
    repositories {
        jcenter()
    }
 
    apply plugin: 'kotlin'
    apply plugin: 'maven'
 
    group "pl.miensol.shouldko"
}
 

对于com.jfrog.bintray稍后使用的插件,为了与Maven工件很好地配合使用,我们需要应用其他Gradle插件。这是maven-publish插件,它提供了以Maven格式发布工件的功能。我们需要做的就是在apply plugin: 'maven-publish'的主项目中。

定义Maven发布

com.jfrog.bintray插件依赖正确定义的Maven出版物。Gradle DSL允许我们根据项目属性轻松定义它们,例如

publishing {
    publications {
        hamcrest(MavenPublication) {
            def project = project(':hamcrest')
            from project.components.java
            artifact project.sourcesJar { // not required, includes sourcesJar with correct classifer
                classifier "sources"
            }
            groupId group
            artifactId project.name
            version project.version
        }
 
        core(MavenPublication) {
            def project = project(':core')
            from project.components.java
            artifact project.sourcesJar {
                classifier "sources"
            }
            groupId group
            artifactId project.name
            version project.version
        }
    }
}
 

上面的Maven出版物包括源工件。发布附加的工件分类器非常重要,因为它允许IDE显示文档弹出窗口或通过库源代码进行调试。但是,需要首先定义它,因为在向Gradle项目应用javakotlin插件时默认不包括它。这很容易做到,如下所示:

allprojects {
    task sourcesJar(type: Jar, dependsOn: classes) {
        from sourceSets.main.allSource
    }
}
 

项目版本控制

如您在上面看到的,我们通常将project.version指示为MavenPublication。版本软件有多种策略,但是当涉及到库时,语义版本控制方案已被广泛接受为标准。如果您想使用它,那么Gradle可以使用一些插件来简化维护预发行版本和补丁版本的日常任务。我喜欢其中的插件集,该插件集ajoberstar提供了一种基于git标签对项目进行版本控制的方法。应用它们很容易:

plugins {
    id "org.ajoberstar.grgit" version "1.7.2"
    id "org.ajoberstar.release-opinion" version "1.7.2"
}
 

现在,当你发布例如gradle build时,插件会根据你的git仓库状态来推断下一个版本:

> Configure project : 
Inferred project: shouldko, version: 0.1.5-dev.0.uncommitted+4f71d34
 

Bintray上传

最后,当我们准备上载我们的库并将其提供给所有人使用时,我们需要设置一个Bintray帐户。一旦我们有了它,在配置页面我们可以访问所需的API关键配置Bintray Gradle插件。

bintray {
    user = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER')
    key = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY')
    publications = ['core', 'hamcrest']
    pkg {
        repo = 'maven'
        name = 'shouldko'
        desc = 'Adds source line to tests assertion messages'
        userOrg = 'brightinventions'
        licenses = ['MIT']
        vcsUrl = 'https://github.com/bright/shouldko.git'
        labels = ['tests', 'hamcrest', 'junit']
    }
}
 

Bintray API密钥应保持私有状态,并且绝不包含在源代码存储库中。

我们可以通过查看项目属性来配置用户和密钥,如果不能使用环境变量也可以这样做。这样就没有必要公开揭露了。

gradle build bintrayUpload -PbintrayUser= -PbintrayApiKey=
 

repo是Bintray库的名称。您可以使用相同的Bintray存储库来托管多个项目。

Bintray插件非常沉默寡言,因此我想添加一些日志消息来查看bintrayUpload的完成时间:

afterEvaluate {
    tasks.bintrayUpload.doLast {
        logger.lifecycle("Uploaded artifacts to bintray at version $version")
    }
}
 

Travis建立

每个项目都应至少具有某种形式的持续集成。对于开源软件,至少有几个免费的构建服务器可用。Travis可能是最受欢迎的一款。对于gradle项目,Travis将默认调用build。如果您希望在成功完成构建时将构建工件上载到Bintray,则需要script.travis.yml诸如此类的部分添加一行:

script:
  - ./gradlew build
  - ./gradlew bintrayUpload
 

显然,还需要配置Bintray凭据,这可以通过项目配置页面完成:

TravisCI环境配置

现在,Gradle git插件将创建一个开发版本,并在每次Travis构建时将其发布到Bintray。

标记释放

每当您要发布该库的新版本时,现在只需标记特定版本即可,例如

git tag 0.1.4
git push origin 0.1.4
 

本地或continueos集成构建完成后,您应该在Bintray Web应用程序中看到一个新版本。从那里您需要发布版本。

使用新图书馆

发布版本后,您可以轻松地在Maven或Gradle项目中使用它。在将软件包链接到JCenter之前,您需要将新的Maven存储库位置通知构建系统,例如:

repositories {
    jcenter()
    maven { url 'https://dl.bintray.com/brightinventions/maven' }
}
 

请注意,brightinvention是组织用户名,maven是上面提到的存储库名称。现在,终于可以消耗你的图书馆:

compile 'pl.miensol.shouldko:hamcrest:0.1.4'
 

原文链接:https://dev.to//brightdevs/how-to-publish-a-library-to-a-maven-repository-with-the-maven-publish-plugin-4gpf

你可能感兴趣的:(maven,java)