如何从头搭建一个自己的java库并上传到maven官方仓库

创建代码

在代码库根目录执行maven命令,用于快速生成一个基础的Maven项目

mvn archetype:generate \
  -DgroupId=com.mycompany \
  -DartifactId=my-maven-project \
  -Dversion=1.0.0 \
  -DarchetypeArtifactId=maven-archetype-quickstart \
  -DinteractiveMode=false

这个命令会创建一个名为 my-maven-project 的简单的Maven项目,其中包含了一个pom.xml文件,和一个 src/main/java/com/mycompany 目录、其中有一个简单的 App.java 文件。

*注意,如果是为了发布到中央仓库,version不能标识为SNAPSHOT版本,因为maven不能发布SNAPSHOT版本,如果此处创建为SNAPSHOT,后面pom.xml里必须在发布前去掉SNAPSHOT

现在开始把你的代码搬到这个目录里,把你项目的依赖加到pom.xml里,此处过程省略

开始

网上有很多过时的文章,都是说要到sonatype的jira平台上提交的,就类似这篇:

手把手教你如何上传自己的组建到maven中央仓库_java怎么推送自己的库到maven仓库-CSDN博客

但是!2024年的流程已经变化了,最新的流程是只需要在sonatype网站注册一个账号,并且申请一个自己的namespace,就可以推送了,但是好像需要有自己的域名。或者更简单的方式是,使用第三方登录,授权登录自己在github、bitbucket等老牌git托管商的账号,这样连namespace都不用申请了,sonatype会直接给你分配一个根据你的托管商账号名字的namespace。

参考官方文档:

Register to Publish Via the Central Portal - The Central Repository Documentation

本文为了方便,我就直接使用github账号授权方式了

注册中央仓库账户

打开网址:

Maven Central

点击右上角的“登录”链接:

中央门户支持通过 Google 或 GitHub 进行社交登录。您还可以选择自己的用户名和密码。如果您选择使用社交登录帐户进行注册,Sonatype 将有权访问与您的社交登录帐户关联的电子邮件地址。

成功授权登录github账号后,就直接登录了,点击右上角账户下拉菜单里的“View Namespaces”,能查看到自己的namespace,就像这样

然后再点击右上角账户下拉菜单里的“View Account”,进入创建token页面,点击右侧的“Generate User Token”按钮,会弹出你的token,只显示一分钟,快速将内容复制下来

这个弹窗内部往下拉一点,是maven配置样例

这个配置内容可以直接拷贝到maven配置文件settings.xml的servers段配置里,但是请注意“${server}”必须替换为字符串“central”表示中央仓库

创建gpg密钥

确保您已经安装了GPG工具。如果没有,请访问GnuPG官方网站下载并安装。

生成GPG密钥对

gpg --gen-key

按照提示操作,创建一个密钥对,可能会要你输入密钥密码passphrase,这个密码后面也要配置到maven配置文件settings.xml里。记下本次生成的密钥ID,或者用这个命令查看,

gpg --list-keys

将公钥上传到公钥服务器,将YOUR_KEY_ID替换为您在第2步中生成的密钥ID,就是上面的生成结果里pub下长的那一串hash值

gpg --keyserver keyserver.ubuntu.com --send-keys YOUR_KEY_ID

如果您有多个密钥,本地 gpg 将使用第一个列出的签名密钥,如果您需要使用特定密钥,您可以在一个<configuration>部分内添加 gpg 密钥的详细信息,并使用本地settings.xml通过签名密钥名发现密码。举例:

pom.xml

<build>
  <plugins>
    <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>
          <configuration>
            <keyname>${gpg.keyname}</keyname>
            <passphraseServerId>${gpg.keyname}</passphraseServerId>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

settings.xml

<profiles>
  <profile>
    <id>central</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
      <gpg.executable>gpg</gpg.executable>
      <gpg.keyname>YOUR_KEY_ID</gpg.keyname>
      <gpg.passphrase>YOUR_KEY_PASSWORD</gpg.passphrase>
    </properties>
  </profile>
</profiles>

pom.xml修改

pom.xml需要做发布配置

<developers>
  <developer>
    <name>xxx</name>
    <email>xxx@zzz.com</email>
    <url>https://github.com/xxx</url>
  </developer>
</developers>

<licenses>
  <license>
    <name>The Apache Software License, Version 2.0</name>
    <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
    <distribution>repo</distribution>
    <comments>The Apache Software License, Version 2.0</comments>
  </license>
</licenses>

<scm>
  <connection>scm:git:https://github.com/xxx/yyy.git</connection>
  <developerConnection>scm:git:https://github.com/xxx/yyy.git</developerConnection>
  <url>https://github.com/xxx/yyy</url>
</scm>

<distributionManagement>
  <snapshotRepository>
    <id>central</id>
    <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
  </snapshotRepository>
  <repository>
    <id>central</id>
    <url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
  </repository>
</distributionManagement>

<build>
  <plugins>
    <plugin>
      <groupId>org.sonatype.central</groupId>
      <artifactId>central-publishing-maven-plugin</artifactId>
      <version>0.4.0</version>
      <extensions>true</extensions>
      <configuration>
        <publishingServerId>central</publishingServerId>
        <tokenAuth>true</tokenAuth>
        <autoPublish>true</autoPublish>
      </configuration>
    </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>
          <configuration>
            <keyname>${gpg.keyname}</keyname>
            <passphraseServerId>${gpg.keyname}</passphraseServerId>
          </configuration>
          <gpgArguments>
            <arg>--pinentry-mode</arg>
            <arg>loopback</arg>
          </gpgArguments>
        </execution>
      </executions>
    </plugin>
    <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>
  </plugins>
</build>



maven配置修改

修改settings.xml

<settings>
  <servers>
    <server>
      <id>central</id>
      <username>token-username</username>
      <password>token-password</password>
    </server>
  </servers>
<profiles>
  <profile>
    <id>central</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
      <gpg.executable>gpg</gpg.executable>
      <gpg.keyname>YOUR_KEY_ID</gpg.keyname>
      <gpg.passphrase>YOUR_KEY_phrase</gpg.passphrase>
    </properties>
  </profile>
</profiles>
</settings>

开始发版

命令行下进入你的本地项目目录,执行命令

mvn deploy

maven会执行一系列的操作,比如运行测试用例、检查代码合规等,最后会报出有哪些问题需要整改,按照问题提示逐一百度改之即可

查看发布进展

本地命令执行成功的话,可以到这个网址看看publish情况

Maven Central: Publishing

可能会显示你的版本“PUBLISHING”,时间不应超过几分钟。单击“REFRESG”按钮可查看最新过程的状态。如果您的组件不满足所有要求,您的部署将失败,部署卡的右侧列(标记为“验证结果”)将详细说明哪些验证失败。

发布成功

发布成功后,可以到官方仓库首页搜索你的项目名字试试:

Maven Central

gpg密钥的导入、导出

由于主机上可以保存多对GPG秘钥对,因此我们需要注意公钥和私钥是成对匹配的

查看主机上的公钥
gpg --list-keys
查看主机上的私钥
gpg --list-secret-keys

我们假定公钥的hash是81451E9950A283EC93FC270736C7920BBBAF1229

导出公钥
gpg --armor --output gpg.pub --export 81451E9950A283EC93FC270736C7920BBBAF1229
导出私钥
gpg --armor --output gpg.key --export-secret-keys 81451E9950A283EC93FC270736C7920BBBAF1229

先删除私钥
gpg --batch --yes --delete-secret-keys  81451E9950A283EC93FC270736C7920BBBAF1229
后删除公钥
gpg --batch --yes --delete-keys  81451E9950A283EC93FC270736C7920BBBAF1229

导入公钥
gpg --import  --pinentry-mode loopback --batch gpg.pub
导入私钥
gpg --import  --pinentry-mode loopback --batch gpg.key

处理过期的密钥

生成密钥时,密钥会生成有效期限。在此期限之后,您可以编辑现有密钥以延长其有效时间。

编辑密钥,进入编辑对话
$ gpg --edit-key CA925CD6C9E8D064FF05B4728190C4130ABA0F98
gpg (GnuPG) 2.2.19; Copyright (C) 2019 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

sec  rsa3072/8190C4130ABA0F98
     created: 2021-06-23  expires: 2023-06-23  usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa3072/4656B4857C17C93B
     created: 2021-06-23  expires: 2023-06-23  usage: E   
[ultimate] (1). Central Repo Test <central@example.com>

只有一个键可以编辑,直接选择它,输入1:
gpg> 1

sec  rsa3072/8190C4130ABA0F98
     created: 2021-06-23  expires: 2023-06-23  usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa3072/4656B4857C17C93B
     created: 2021-06-23  expires: 2023-06-23  usage: E   
[ultimate] (1)* Central Repo Test <central@example.com>

您将看到*后面的 (1),这表示您已选择此密钥进行编辑。要编辑密钥过期时间,请输入以下命令:
gpg> expire
Changing expiration time for the primary key.
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 

输入您需要的内容,例如9m(9 个月),然后确认。系统会要求您提供该密钥的密码。关于编辑的最后一步是保存您所做的事情:
gpg> save

现在您可以看到密钥的过期时间已更新:
$ gpg --list-keys
/home/mylocaluser/.gnupg/pubring.kbx
---------------------------------
pub   rsa3072 2021-06-23 [SC] [expires: 2022-03-21]
      CA925CD6C9E8D064FF05B4728190C4130ABA0F98
uid           [ultimate] Central Repo Test <central@example.com>
sub   rsa3072 2021-06-23 [E] [expires: 2023-06-23]

最后,再次分发你的公钥:
gpg --keyserver keyserver.ubuntu.com --send-keys CA925CD6C9E8D064FF05B4728190C4130ABA0F98

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/646066.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OS复习笔记ch6-2

死锁的解决 死锁的预防&#xff08;打疫苗&#xff09;死锁的避免&#xff08;戴口罩&#xff09;死锁的检测&#xff08;做核酸&#xff09; 死锁的预防 前面我们提到了死锁的四个必要条件 防止前三个必要条件&#xff0c;就是间接预防防止最后一个必要条件–循环等待&…

【NumPy】关于numpy.median()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

9.Redis之list类型

list相当于链表、数据表 1.list类型基本介绍 列表中的元素是有序的"有序"的含义,要根据上下文区分~~有的时候,谈到有序,指的是"升序","降序”有的时候,谈到的有序,指的是, 顺序很关键~~如果把元素位置颠倒,顺序调换.此时得到的新的 List 和之前的 Li…

Linux(六)

Linux&#xff08;六&#xff09; 自定义头文件自定义头文件中写什么如何引入头文件条件编译条件编译作用 gcc工作原理Make 工作管理器什么是Make什么是Makefile/makefileMakefile假目标Makefile中的变量自定义变量预定义变量自动变量 Makefile中变量展开方式递归展开方式简单展…

【C++】二分查找算法

1.题目 2.算法思路 暴力解法&#xff1a;可以将数组遍历一遍&#xff0c;就可以找到。时间复杂度为O(n)。不算太差&#xff0c;可以接受。 但是有更优秀的解法&#xff1a; 就是二分查找算法。 算法的特点&#xff1a;我们所查找的“数组”具有二段性。这里的二段性不一定有…

Vue 安装vue

1、官网安装下载安装nodejs 2、安装完成后&#xff0c;通过命令查看版本,可以查看到版本 node -v npm -v 3、安装Vue CLi npm install -g vue/cli 4、创建项目,vue create test 如果遇到报错&#xff1a; ERROR Error: spawn yarn ENOENT Error: spawn yarn ENOENT at ChildP…

人工智能+跨癌种分析,能否解决医学数据样本量小的问题?【医学AI|顶刊速递|05-26】

小罗碎碎念 先说明&#xff0c;目前小罗只是硕士&#xff0c;以下个人观点很有可能不准确&#xff0c;欢迎批评指正&#xff01;&#xff01;小罗虚心听取有益建议&#xff01;&#xff01; 众所周知&#xff0c;医学数据相比于其他领域的数据来说&#xff0c;属于小样本数据。…

【仿RabbitMQ消息队列项目day4】GTest测试框架使用

一.什么是GTest? GTest是一个跨平台的 C单元测试框架&#xff0c;由google公司发布。gtest是为了在不同平台上为编写C单 元测试而生成的。 二.使用 TEST(test_case_name, test_name)&#xff1a;主要用来创建⼀个简单测试&#xff0c; 它定义了一个测试函数&#xff0c; 在这个…

【NumPy】关于numpy.sum()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

安卓自定义控件(视图、改造控件、通知Notification、界面绘制)

视图的构建过程 此节介绍一个视图的构建过程&#xff0c;包括&#xff1a;如何编写视图的构造方法&#xff0c;4个构造方法之间有什么区别&#xff1b;如何测量实体的实际尺寸&#xff0c;包含文本、图像、线性视图的测量方法&#xff1b;如何利用画笔绘制视图的界面&#xff…

Ubuntu22.04设置程序崩溃产生Core文件

Ubuntu22.04设置程序崩溃产生Core文件 文章目录 Ubuntu22.04设置程序崩溃产生Core文件摘要Ubuntu 生成Core文件配置1. 检查 core 文件大小限制2. 设置 core 文件大小限制3. 配置 core 文件命名和存储路径4. 重启系统或重新加载配置5. 测试配置 关键字&#xff1a; Ubuntu、 C…

跨平台之用VisualStudio开发APK嵌入OpenCV(一)

序 本篇是杂谈以及准备工作&#xff08;此处应无掌声&#xff09; 暂时不管iOS&#xff08;因为开发hello world都要年费&#xff09; 软件&#xff1a; Visual Studio 2019&#xff08;含Android SDK和NDK编译器等&#xff09; OpenCV 这是一个女仆级的系列文章&#xf…

代码随想录|Day56|动态规划 part16|● 583. 两个字符串的删除操作 ● 72. 编辑距离

583. 两个字符串的删除操作 class Solution: def minDistance(self, word1: str, word2: str) -> int: dp [[0] * (len(word2) 1) for _ in range(len(word1) 1)] for i in range(len(word1) 1): dp[i][0] i for j in range(len(word2) 1): dp[0][j] j for i in rang…

OpenStack平台Nova管理

1. 规划节点 使用OpenStack平台节点规划 IP主机名节点192.168.100.10controller控制节点192.168.100.20compute计算节点 2. 基础准备 部署的OpenStack平台 1. Nova运维命令 &#xff08;1&#xff09;Nova管理安全组规划 安全组&#xff08;security group&#xff09;是…

网上比较受认可的赚钱软件有哪些?众多兼职选择中总有一个适合你

在这个互联网高速发展的时代&#xff0c;网上赚钱似乎成了一种潮流。但是&#xff0c;你是否还在靠运气寻找赚钱的机会&#xff1f;是否还在为找不到靠谱的兼职平台而苦恼&#xff1f; 今天&#xff0c;就为你揭秘那些真正靠谱的网上赚钱平台&#xff0c;让你的赚钱之路不再迷…

1107 老鼠爱大米

solution 记录每组的最大值&#xff0c;并比较组间的最大值胖胖鼠~ #include<iostream> using namespace std; int main(){int n, m, ans, fat -1, x;scanf("%d%d", &n, &m);for(int i 0; i < n; i){ans -1;for(int j 0; j < m; j){scanf(…

Docker compose 的方式一键部署夜莺

官方安装文档&#xff1a;https://flashcat.cloud/docs/content/flashcat-monitor/nightingale-v7/install/docker-compose/ 介绍&#xff1a;夜莺监控是一款开源云原生观测分析工具&#xff0c;采用 All-in-One 的设计理念&#xff0c;集数据采集、可视化、监控告警、数据分析…

python列表元素的增减之道:删除篇

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、前言 二、删除元素的基本方法 1. 使用remove()方法 2. 使用pop()方法 3. 使用del语句…

ICML 2024 | 北大、字节提出新型双层位置编码方案,有效改善长度外推效果

在这项工作中&#xff0c;我们利用语言序列的内在分段特性&#xff0c;设计了一种新的位置编码方法来达到更好的长度外推效果&#xff0c;称为双层位置编码&#xff08;BiPE&#xff09;。对于每个位置&#xff0c;我们的 BiPE 融合了段内编码和段间编码。段内编码通过绝对位置…

从用法到源码再到应用场景:全方位了解CompletableFuture及其线程池

文章目录 文章导图什么是CompletableFutureCompletableFuture用法总结API总结 为什么使用CompletableFuture场景总结 CompletableFuture默认线程池解析&#xff1a;ForkJoinPool or ThreadPerTaskExecutor&#xff1f;ForkJoinPool 线程池ThreadPerTaskExecutor线程池Completab…