Maven - 发布JAR包到Maven远程中央仓库(五)

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: Maven - 发布JAR包到Maven远程中央仓库(五)

四、上传构件到 OSS 中

这步就简单了,就是一套命令:

mvn clean deploy -P sonatype-oss-release -Darguments="gpg.passphrase=密钥密码"

如果使用eclipse的mvn插件发布的话,配置如下(IDEA类似):

image.png


如果发布成功,就可以到构件仓库中查看了。

或者

先通过 cmd 进入到项目的这个目录下。

image.png


再执行下面命令。

mvn clean deploy -P release

当执行以上 Maven 命令时,会自动弹出一个对话框,需要输入上面提到的 Passphase,它就是通过 GPG 密钥对的密码,只有自己才知道。随后会看到大量的 upload 信息,而且速度比较慢,经常会 timeout,需要反复尝试。


注意:此时上传的构件并未正式发布到中央仓库中,只是部署到 OSS 中了,下面才是真正的发布。


五、在 OSS 中发布构件

进入https://oss.sonatype.org/#stagingRepositories查看发布好的构件,点击左侧的Staging Repositories,一般最后一个就是刚刚发布的jar了,此时的构件状态为open。


打开命令行窗口,查看gpg key并上传到第三方的key验证库:

E:\98_code\workSpace\marathon-client>gpg --list-keys
C:/Users/VF/AppData/Roaming/gnupg/pubring.gpg
---------------------------------------------
pub   2048R/824B4D7A 2016-01-06
uid       [ultimate] cloudnil <cloudnil@126.com>
sub   2048R/7A10AD69 2016-01-06
E:\98_code\workSpace\marathon-client>gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys 824B4D7A
gpg: sending key 824B4D7A to hkp server keyserver.ubuntu.com
E:\98_code\workSpace\marathon-client>

回到 https://oss.sonatype.org/#stagingRepositories,选中刚才发布的构件,并点击上方的close–>Confirm,在下边的Activity选项卡中查看状态,当状态变成closed后,执行Release–>Confirm,并在下边的Activity选项卡中查看状态,成功后构件自动删除。


需要在曾经创建的 Issue 下面回复一条“构件已成功发布”的评论,这是为了通知 Sonatype 的工作人员为需要发布的构件做审批,发布后会关闭该 Issue。


一小段时间(约1-2个小时)后即可同步到https://search.maven.org中央仓库(Maven中央仓库可能需要24-48小时:https://mvnrepository.com)。


image.png


Ps:注意这里有个大坑,之前很多教程都会把这个步骤提前到最开始(我不是说生成密钥这个环节,这个密钥生成环节的确是一开始就可以弄了的),但下面这句解析需要到这一步再开始搞,之前一直在https://oss.sonatype.org/#stagingRepositories这里审核一直失败,大坑呀~


最后,想说一句:第一次都是很痛的,以后就舒服了。没错,只有第一次发布才如此痛苦,以后 deploy 的构件会自动部发布到中央仓库,无需再这样折腾了。(附加:成功效果图)


image.png


附:

在编码过程中,有些通用的代码模块,有时候我们不想通过复制拷贝来粗暴地复用,因为这样不仅体现不了变化,也不利于统一管理。这里我们使用maven deploy的方式,将通用的模块打成jar包,发布到nexus,让其他的项目来引用,以更简洁高效的方式来实现复用和管理。


第一:maven的settings.xml文件中设置<server>标签


<server>
  <id>my-deploy-release</id>
  <username>admin</username>
  <password>admin123</password>
</server>
<server>
  <id>my-deploy-snapshot</id>
  <username>admin</username>
  <password>admin123</password>
</server>

此处设置的用户名和密码都是nexus的登陆配置。

 

第二:在项目的pom.xml文件中设置

<distributionManagement>
    <repository>
        <id>my-deploy-release</id>
        <url>http://192.168.1.123:8081/nexus/content/repositories/releases/</url>
    </repository>
    <snapshotRepository>
        <id>my-deploy-snapshot</id>
        <url>http://192.168.1.123:8081/nexus/content/repositories/snapshots/</url>
    </snapshotRepository>
</distributionManagement>

在此,url都是nexus相应仓库的链接地址,这一步做完之后,已经完成了发布所需要的基本配置。【试试命令:mvn deploy】


注意:<server>中的<id>要和<repository>、<snapshotRepository>的<id>一致,maven在发布时,会根据此id来查找相应的用户名密码进行登录验证并上传文件。



第三:发布的灵活性配置


maven会判断版本后面是否带了-SNAPSHOT,如果带了就发布到snapshots仓库,否则发布到release仓库。这里我们可以在pom.xml文件中,设置。


<groupId>com.test</groupId>
<artifactId>my-test</artifactId>
<packaging>jar</packaging>
<version>${project.release.version}</version>
<properties>
    <java.version>1.8</java.version>
    <project.release.version>1.0-SNAPSHOT</project.release.version>
</properties>
<profiles>
    <profile>
        <id>product</id>
        <properties>
            <project.release.version>1.0</project.release.version>
        </properties>
    </profile>
</profiles>

说明:通过占位符${project.release.version}来控制需要发布的版本,用命令mvn deploy -P product,发布my-test的1.0版本到releases库。如果使用命令mvn deploy,则默认使用 1.0-SNAPSHOT版本号,将发布my-test的1.0-SNAPSHOT版本到snapshots库。



第四:发布时遇到的一些问题


部署到snapshot仓库时,jar包会带上时间戳,这没关系,maven会自动取相应版本最新的jar包;

Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy (default-deploy) on project my-test: Failed to deploy artifacts: Could not transfer artifact...from/to release...

部署到release仓库时,相同版本的jar包不能提交。


原因:因为release的部署策略是【disable redeploy】,不允许覆盖更新组件。


解决办法:修改一下版本号,再提交即可。之前其实还可以通过人工客服聊天帮忙删除不想要的Jar包,但是现在不行了,只能通过上传新版本,所以有些童鞋想做测试的需要注意这一点。


打包指定的文件/文件夹在代码中也有体现(含:doc、sources、class)。


Maven deploy 时,为什么没有生成对应的 javadoc 和 sources (前提已经有插件部署好)?


image.png


  1. Ps:也许是图上的 id = “release” 没有打勾造成没有执行 javadoc 和 sources 的插件。
  2. 待更新...
相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
16天前
|
Java Maven 容器
java依赖冲突解决问题之Maven在编译打包过程中对依赖的jar包如何解决
java依赖冲突解决问题之Maven在编译打包过程中对依赖的jar包如何解决
|
10天前
|
Java Linux Maven
Maven 仓库
Maven 仓库
|
2天前
|
Java Linux Maven
|
18小时前
|
Java Linux Maven
|
7天前
|
Java Linux Maven
|
4天前
|
Java Linux Maven
|
8天前
|
Java Linux Maven
|
12天前
|
存储 Java Linux
Maven 仓库
Maven仓库是存储项目依赖库的位置,用于管理各种构件如JAR文件。Maven支持三种类型的仓库:本地、中央和远程。本地仓库默认位于用户目录下的`.m2/repository/`,首次运行Maven命令时自动创建,也可通过settings.xml文件自定义路径。中央仓库由Maven社区维护,包含大量常用开源Java库及其相关信息,无需配置即可通过网络访问,适用于大多数Java项目的依赖需求,可通过http://search.maven.org/#browse浏览和搜索构件。
|
14天前
|
存储 缓存 Java
Maven 仓库
Maven仓库是存储项目依赖的第三方库的位置,用于管理这些库(主要为JAR文件,也包括WAR、ZIP、POM等)。Maven支持三种类型的仓库:本地、远程和中央。本地仓库默认位于用户目录下的`.m2/repository/`,首次执行Maven命令时创建,用于缓存和提供构建所需的构件;中央仓库由Maven社区维护,包含大量常用开源Java库及其相关信息,无需额外配置,但需联网访问,可通过`http://search.maven.org/#browse`浏览其内容。
|
11天前
|
敏捷开发 JavaScript Java
阿里云云效产品使用合集之如何进行Maven私有仓库迁移
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。

推荐镜像

更多