阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

使用Gradle部署jar包到Maven中央库

191次阅读
没有评论

共计 4233 个字符,预计需要花费 11 分钟才能阅读完成。

Maven 作为目前 Java 界最好的 Dependency 管理系统,把 jar 包托管到 Maven 中央库,然后通过 Maven Dependency 使用是目前业界各种第三方库的普遍做法,如果,你想把自己开发的一些库分享给别人使用,也可以遵循这样的套路。Gradle 可以看做是升级版的 Maven,其使用了 Maven 最优秀的 Dependency 管理系统,但是,又规避了 Maven 的 build pipeline 的刻板和 xml 格式配置文件等缺点,可以说是目前 Java 界最好的构建工具。下面就来说说,如何使用 Gradle 把自己开发的 jar 包部署到 Maven 中央库中。

Part 1: 为自己的项目注册 Maven 中央库账号

在 http://oss.sonatype.orgz 注册账号,(注:Sonatype 是 Maven 中央库的管理系统),注册之后获得用户名,密码。后面的 build 脚本会用得上。

在 Sonatype 的 JIRA 系统中,创建一个 issue(选择 Project: Community Support – Open Source Project Repository Hosting; Issue Type: New Project),告诉 Sonatype 管理员,你想托管一个项目到 Sonatype 上。注意该 Issue 创建完之后,只有管理员有更改权限,因此,小心不要写错信息

创建完之后,需要等待 Sonatype 管理员审核,一般不超过 2 个工作日,一旦审核通过,会在该 Issue 上标明 Resolved,这就是说中央库已经准备好,可以随时上传自己的文件了。

Part 2: Maven 中央库托管规范

为了构建更加良好的 Maven 生态环境,Maven 对于托管到其上的库有非常明确的质量要求:* 项目的 Pom 文件必须包含如下元素:* 如果部署的是 jar 包且 jar 包里面有 java classes,那么除了 jar 包外,还必须上传该 jar 包的源代码包,javadoc 包,即必须部署三个包.jar/-sources.jar/ **-javadoc.jar。* 所有要部署的包都必须使用 GPG 签名,签名证书的 Public Key 必须上传到 hkp://pool.sks-keyservers.net/ 服务器上。More Info Maven Central Requirementhttps://docs.sonatype.org/display/Repository/Central+Sync+Requirements

Part 3: GPG 签名

前面提到,所有要上传到 Maven 中央库的文件都需要做签名,首先,需要下载 GPG 工具(https://gpgtools.org/)。Mac 用户可以直接下载带 UI 的工具 GPGTools Installer https://s3.amazonaws.com/gpgtools/GPGTools-20130330.dmg, 安装完之后,直接生成新的证书,然后 Send Public Key to Key Server 就行了。非常简单。如果你是命令行控,请参考 Gennerate GPG signature With Maven https://docs.sonatype.org/display/Repository/How+To+Generate+PGP+Signatures+With+Maven

使用 Gradle 部署 jar 包到 Maven 中央库

Part 4: Gradle 脚本

apply plugin: ‘idea’
apply plugin: ‘java’
apply plugin: ‘maven’
apply plugin: ‘signing’ // 使用 signing plugin 做数字签名

// 定义 GroupID 和 Version,ArtefactID 会自动使用 Project 名
group = ‘com.thoughtworks.toggle’
version = ‘0.1.0-SNAPSHOT’
sourceCompatibility = 1.6
targetCompatibility = 1.6

repositories {
    mavenCentral();
}

dependencies {
    compile(
            ‘junit:junit:4.11’,
    )
}

uploadArchives {
    repositories {
        mavenDeployer {
            // 为 Pom 文件做数字签名
            beforeDeployment {MavenDeployment deployment -> signing.signPom(deployment) }

            // 指定项目部署到的中央库地址,UserName 和 Password 就是 Part 1 中注册的账号。
            repository(url: “https://oss.sonatype.org/content/repositories/snapshots/”) {
                authentication(userName: sonatypeUsername, password: sonatypePassword)
            }
            // 构造项目的 Pom 文件,参见 Part 2 中 Pom 文件的规范,不要遗漏必填项
            pom.project {
                name project.name
                packaging ‘jar’
                description ‘Toggle is a little java tool to make your life easier when you try to use Feature Toggle in Java.’
                url ‘https://github.com/xianlinbox/Toggle’

                scm {
                    url ‘scm:git@github.com:xianlinbox/Toggle.git’
                    connection ‘scm:git@github.com:xianlinbox/Toggle.git’
                    developerConnection ‘git@github.com:xianlinbox/Toggle.git’
                }

                licenses {
                    license {
                        name ‘The Apache Software License, Version 2.0’
                        url ‘http://www.apache.org/licenses/LICENSE-2.0.txt’
                        distribution ‘repo’
                    }
                }

                developers {
                    developer {
                        id ‘xianlinbox’
                        name ‘Liu Xiannings’
                    }
                }
            }
        }
    }
}

// 参见 Part 2,为项目生成 **.jar/**-javadoc.jar/**-sources.jar
task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = ‘javadoc’
    from ‘build/docs/javadoc’
}

task sourcesJar(type: Jar) {
    classifier = ‘sources’
    from sourceSets.main.allSource
}

artifacts {
    archives jar
    archives javadocJar
    archives sourcesJar
}

// 为所有的 jar 包做数字签名
signing {
    sign configurations.archives
}

Part 5: 遇到过的问题

1. java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
这个问题只有在使用的是 OpenJDK 的时候才会遇到,原因是 OpenJDK 的包里面没有带有效的证书,在 MacOS 上,只要把系统库里带的 cacerts 给它关联过去就行了。

cd $(/usr/libexec/java_home -v 1.7)/jre/lib/security
ln -fsh /System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security/cacerts

2.Return Code is 400

这个问题有一段心酸的过程,有兴趣的可以看一下这个 issue :issue fixed process 在部署过程中收到这个 Error Message 的情况有 2 种:* 重复部署同一个 jar 包到 Maven 库,但是,Maven 库却设置为不允许重复部署,在 Gradle 1.0 版本的 MavenDeployer 就有这个问题,会重复提交 jar 包,不过已经在 1.1 版本修复。* 试图部署一个 release 版本的 jar 包到 snapshot 库。我的情况是后者,不过 Root Cause 比较汗颜,因为我把 version number 写成了“0.1.0-snapshot”, 不符合 Maven 对 Snapshot 包的规范,因此,被当做 release 版本了,修改为“0.1.0-SNAPSHOT”就成功了

Maven 权威指南_中文完整版清晰 PDF  http://www.linuxidc.com/Linux/2014-06/103690.htm

Maven 3.1.0 发布,项目构建工具 http://www.linuxidc.com/Linux/2013-07/87403.htm

Linux 安装 Maven http://www.linuxidc.com/Linux/2013-05/84489.htm

Maven3.0 配置和简单使用 http://www.linuxidc.com/Linux/2013-04/82939.htm

Ubuntu 下搭建 sun-jdk 和 Maven2 http://www.linuxidc.com/Linux/2012-12/76531.htm

Maven 使用入门 http://www.linuxidc.com/Linux/2012-11/74354.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计4233字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中