概述
说明
有时我们开发了一些开源的项目想给其他开发者使用,我们可以将自己的项目制作成war包、jar包等多种方式,但是比较好用和方便的方式应该就是直接通过maven引入了,本文将会把自己的项目上传到maven中央仓库,其他开发者通过maven的方式可以引用到我们的项目。
快速开始
发现网上的教程虽然不少,但多多少少都有一些问题,其中最主要的问题是几乎所有的教程都指定Maven项目的parent为oss-parent,然而Maven不支持多parent的情况,因此这样操作必须要求原有的Maven项目无parent项目。但对于Springboot项目来说,基本都指定了parent为spring-boot-starter-parent。下面开始正确的上传姿势:
1. Sonatype
Sonatype是一个通过Nexus对开源项目提供托管服务的网站。你可以通过它发布项目的快照(snapshot)或者稳定版本(release)到Maven中央仓库。我们只需要注册一个Sonatype的账号,新建一个issue,然后在项目的pom文件中进行配置即可。
在https://issues.sonatype.org/secure/Dashboard.jspa注册和登录账号
然后点击Create
Create Issue:
这里需要特别说明的是 Group Id,如果你是托管在 Github 或者 Git@OSC 可以使用 com.github.binarylei 或者 net.oschina.XXX,剩下的可以依照实际情况填写,例如托管的地址等等(托管地址等信息会在用去 maven 仓库搜索的时候显示,用来帮助用户找到你的项目地址寻求帮助)。group id中的域名最好自己有,比如此处我填写的是cn.yunlingfly,此处yunlingfly.cn就是我自己的域名,如果没有可以填写github项目链接地址另外此处填写的 groupId 必须和你要发布的组件的 pom 中的 groupId 一样,必须一样!!
新建成功issue后需要等待Sonatype的工作人员进行审核,审核时间大约几分钟左右(我当时5min貌似有人几小时的....),审核通过后issue的Status会转变为Resolved,此时你就可以进行下一步操作了。
Issue界面下面其实有一段操作提示的英文:
cn.yunlingfly has been prepared, now user(s) yunlingfly can:
Deploy snapshot artifacts into repository https://oss.sonatype.org/content/repositories/snapshots
Deploy release artifacts into the staging repository https://oss.sonatype.org/service/local/staging/deploy/maven2
Promote staged artifacts into repository 'Releases'
Download snapshot and release artifacts from group https://oss.sonatype.org/content/groups/public
Download snapshot, release and staged artifacts from staging group https://oss.sonatype.org/content/groups/staging
please comment on this ticket when you promoted your first release, thanks
这个是工作人员告诉我已经通过了,可以去下面那个地址发布(前两个地址),发布后去下面后两个地址搜索。
2. 使用gpg生成秘钥
gpg(GunPG)是一款用于生成秘钥的加密软件。Windows下载地址:https://files.gpg4win.org/选择最新的exe版本下载即可,安装过程省略,安装后可以通过 gpg --version 命令查看是否安装成功。
运行以下命令生成秘钥,当前gpg版本为1.4.22:
gpg --gen-key
运行后gpg要求你选择加密算法,过期时间等等,这些直接选择默认值即可。通过对比发现,gpg 2.0以上的版本运行gpg --gen-key命令 会跳过这些步骤。
之后gpg要求你输入姓名,邮箱以及关键的Passphrase(这个密码要自己记住,后面有用),依次输入即可。然后gpg为你生成了一对秘钥。
之后使用
gpg --list-keys
命令可以查看秘钥:
生成秘钥后,我们需要把公钥上传到服务器上。运行以下命令:2F19A699是你的公钥
gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 2F19A699
查询公钥是否发布成功:
gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 2F19A699
3. 配置Maven
修改maven全局配制文件 settings.xml,在maven安装目录的conf文件夹下:
在servers结点添加:
<server>
<id>oss</id>
<username>这里填写你注册oss.sonatype.org的用户名</username>
<password>这里填写你注册oss.sonatype.org的用户密码</password>
</server>
在profiles结点添加:
<profile>
<id>oss</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<gpg.executable>gpg</gpg.executable>
<gpg.passphrase>这里填写你生成公钥时要你记住的Passphrase密码</gpg.passphrase>
</properties>
</profile>
4 修改Springboot项目的pom.xml配置
pom.xml 中必须包括:name、description、url、licenses、developers、scm 等基本信息,使用了 Maven 的 profile 功能,只有在 release 的时候,创建源码包、文档包、使用 GPG 进行数字签名。
此外,snapshotRepository 与 repository 中的 id 一定要与 setting.xml 中 server 的 id 保持一致。
如果是多模块项目的话,只需要在父 pom.xml 中声明这些,子 pom.xml 中只需要修改相应的一些信息,如 name 标签。
放上官方的配置文档:https://central.sonatype.org/pages/apache-maven.html
我的完整配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.yunlingfly</groupId>
<artifactId>qiniu-spring-boot-starter</artifactId>
<version>0.0.1-RELEASE</version>
<packaging>jar</packaging>
<name>qiniu-spring-boot-starter</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<distributionManagement>
<snapshotRepository>
<id>oss</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<id>oss</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
<profiles>
<profile>
<id>release</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9.1</version>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<scm>
<connection>https://github.com/Yunlingfly/qiniu-starter</connection>
<url>https://github.com/Yunlingfly/qiniu-starter.git</url>
<developerConnection>https://github.com/Yunlingfly</developerConnection>
</scm>
<developers>
<developer>
<name>yunlingfly</name>
<email>yunlingfly@csdn.com</email>
<url>https://github.com/Yunlingfly</url>
</developer>
</developers>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- sonatype提供了自动release的插件,这意味着运行mvn clean deploy后不用手动去close-> release了,此插件会自动release我们的项目到Maven中央仓库。 -->
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.7</version>
<extensions>true</extensions>
<configuration>
<serverId>oss</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
</plugins>
</build>
</project>
上传到中央仓库:(本来是上传到暂存仓库,然后需要手动close、release等等操作的,我这里使用了一个自动close、release的插件nexus-staging-maven-plugin,省略了那些步骤)
运行以下命令进行deploy:
mvn clean deploy -P release
然后maven会自动下载和上传文件,自动close、release,最后成功的话出现下图:
如何发布快照版本snapshots?
在pom.xml中的项目版本号后面加上 -snapshot 就行,上传使用mvn clean deploy
快照版到这里就发布好了,不需要执行上面的关闭、发布构建步骤,构建列表里也找不到快照版的构建,快照版发布后就可以直接引用了(我测试的使用快照版本发布出去了,但引用不了,不知道什么错....)
maven中snapshot快照库和release发布库的区别和作用
可参考 maven中snapshot快照库和release发布库的区别和作用
在使用maven过程中,我们在开发阶段经常性的会有很多公共库处于不稳定状态,随时需要修改并发布,可能一天就要发布一次,遇到bug时,甚至一天要发布N次。我们知道,maven的依赖管理是基于版本管理的,对于发布状态的artifact,如果版本号相同,即使我们内部的镜像服务器上的组件比本地新,maven也不会主动下载的。如果我们在开发阶段都是基于正式发布版本来做依赖管理,那么遇到这个问题,就需要升级组件的版本号,可这样就明显不符合要求和实际情况了。但是,如果是基于快照版本,那么问题就自热而然的解决了,而maven已经为我们准备好了这一切。
maven中的仓库分为两种,snapshot快照仓库和release发布仓库。snapshot快照仓库用于保存开发过程中的不稳定版本,release正式仓库则是用来保存稳定的发行版本。定义一个组件/模块为快照版本,只需要在pom文件中在该模块的版本号后加上-snapshot
即可,如下:
<groupId>cn.yunlingfly</groupId>
<artifactId>qiniu-spring-boot-starter</artifactId>
<version>0.0.1-snapshot</version>
<packaging>jar</packaging>
maven2会根据模块的版本号(pom文件中的version)中是否带有-snapshot
来判断是快照版本还是正式版本。如果是快照版本,那么在mvn deploy时会自动发布到快照版本库中,而使用快照版本的模块,在不更改版本号的情况下,直接编译打包时,maven会自动从镜像服务器上下载最新的快照版本。如果是正式发布版本,那么在mvn deploy时会自动发布到正式版本库中,而使用正式版本的模块,在不更改版本号的情况下,编译打包时如果本地已经存在该版本的模块则不会主动去镜像服务器上下载。
所以,我们在开发阶段,可以将公用库的版本设置为快照版本,而被依赖组件则引用快照版本进行开发,在公用库的快照版本更新后,我们也不需要修改pom文件提示版本号来下载新的版本,直接mvn执行相关编译、打包命令即可重新下载最新的快照库了,从而也方便了我们进行开发。
5 通知Sonatype 已经成功发布
在Issue中通过审核的官方回复中,通常会让你在发布成功后再次回复告知他们,在刚才那个Issue中回复已经成功发布,官方会回复你大概需要等多久才能在中央仓库中找到你的项目(10分钟左右)以及要多久才能在搜索中搜到(2个小时左右)
几小时之后就可以在https://search.maven.org/搜到自己的项目啦~
如果是在http://mvnrepository.com/搜索的话得再多等几小时,因为这个仓库同步更新中央仓库也需要时间
点进去右边就有maven的引入,下面还有好几种引入方式,知道的就有maven和gradle...
6 以后的提交过程
第一次提交才这么麻烦,以后提交只用重复maven发布,OSS中Close,Release的过程就可以了,当然需要等待的时间还是10分钟和2小时.
如果要发布新的项目,在使用相同GroupId的情况下,与上面的过程一样.只有使用不同的GroupId的时候,才会需要再去提交Issue申请.
当然如果你没有换电脑的话 GPG 的过程只需要一次就行
参考资料:
https://www.jianshu.com/p/5f6135e1925f
https://www.jianshu.com/p/8c3d7fb09bce
https://www.cnblogs.com/binarylei/p/8628245.html
https://www.cnblogs.com/rwxwsblog/p/6029636.html
https://blog.csdn.net/cc_want/article/details/77944753
https://central.sonatype.org/pages/apache-maven.html
最后
以上就是明理寒风为你收集整理的SpringBoot项目发布到Maven中央仓库的全部内容,希望文章能够帮你解决SpringBoot项目发布到Maven中央仓库所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复