001-将自己的jar提交maven中央仓
一、Maven中央仓库提交过程
① https://issues.sonatype.org 工单管理地址,就是申请上传资格和groupId
的地方。
② https://oss.sonatype.org/#welcome 构件仓库,把jar包上传到这里,Release
之后就会同步到maven中央仓库。
③ http://search.maven.org/ 最终表现在可以在这里搜索到。
利用Sonatype OSSRH可以把jar等资源提交给Maven的中央仓库。
二、Sonatype OSSRH介绍
Sonatype OSSRH使用Nexus 为开源项目提供仓库管理服务,该仓库就是所谓maven的中央仓库,OSSRH允许我们向Maven中央仓库提交二进制文件。
1:提交(deploy)开发版本的二进制文件(snapshorts)
2: 阶段性的发布版本
3:发布一个release,然后同步他们到中央仓库。
三、工单使用
3.1、注册账号
从https://issues.sonatype.org 注册一个帐号,注册地址,登录账号密码后续还要配置 maven 的setting.xml
中,然后创建一个工单,如下图(记住是先注册,下面是创建工单的图)。
3.2、创建工单
注意:
推荐设置方式
- Group Id:com.github.bjlhx15
- Project URL:https://github.com/bjlhx15/common/issues
①Group Id
,唯一标识,推荐使用com.github.xxxxx
,xxxx要与github 用户名一致,会大概5分钟通过
如果用的是其他的比如:com.sojson.core
之类的,管理员会问你这个是不是属于你的网站等等,官方文档:http://central.sonatype.org/pages/choosing-your-coordinates.html
② ProjectURL
,填项目源码的地址,如果不想公布源码,那么填写一个只含README
的项目的地址就可以了。
*其实管理员主要就是审核Group Id,其他的不重要
然后点击左侧列表中的Resolved recently
可以找到你刚创建的工单。
这时你的工单的状态Status
是Open
,等到审核通过状态会变为RESOLVED
审查要求:
- 1、提供JavaDoc和source
- 2、使用gpg或者pgp对文件进行签名
- 3、正确的坐标:groupId、artifactId、version
- 4、projectName、description、url、license、developers、scm等信息
四、项目中的 pom.xml的基本
配置
1、正确的坐标
<groupId>com.github.bjlhx15</groupId>
<artifactId>xgen</artifactId>
<version>1.0-SNAPSHOT</version>
2、项目信息描述、liscens、开发者、scm软件配置管理
<!-- 基础信息-->
<name>${project.groupId}:${project.artifactId}</name>
<description>mybatis plugins</description>
<url>https://github.com/bjlhx15/xgen</url>
<!--开源协议-->
<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>
</license>
</licenses>
<!--开发者信息-->
<developers>
<developer>
<name>lihongxu</name>
<email>bjlhx15@163.com</email>
<url>https://github.com/bjlhx15/</url>
</developer>
</developers>
<!-- 软件配置管理-->
<scm>
<url>https://github.com/bjlhx15/xgen</url>
<connection>scm:git:https://github.com/bjlhx15/xgen.git</connection>
<developerConnection>scm:git:https://github.com/bjlhx15/xgen.git</developerConnection>
</scm>
五、打包部署
方式一、maven的方式
5.1、POM配置要上传的仓库地址
<!--定义snapshots库和releases库的nexus地址-->
<distributionManagement>
<snapshotRepository>
<id>sonatype-nexus-snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<id>sonatype-nexus-staging</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
5.2、配置上传中央仓库的用户名密码
配置到 户密码配置 需要在maven_home/conf/settings.xml配置jira的账号和密码【上文注册的】
与pom中的
<!--定义snapshots库和releases库的nexus地址-->
<distributionManagement>
对应
<server>
<id>sonatype-nexus-snapshots</id>
<username>https://issues.sonatype.org的账号</username>
<password>https://issues.sonatype.org的密码</password>
</server>
<server>
<id>sonatype-nexus-staging</id>
<username>https://issues.sonatype.org的账号</username>
<password>https://issues.sonatype.org的密码</password>
</server>
5.3、POM 配置生成javadoc和sources包的插件【使用第五部分的profiles】
新建组件的时候,必须发布javadoc和sources上去中央仓库,具体命名是通过你在 pom中定义的 groupId,artifactId和version,这个java开发者一般都很熟悉了,不再说明。
最终打包的要求满足以下格式:artifactId-version-classifier.packaging
其中, artifactId 和 version 就不说了;关于classifier就是对这个包的说明,比如javadoc,或是sources, packaging表示包的形式,比如war、jar等
5.4、GPG加密和自动签名的插件
a》基础密钥生成
使用gpg或者pgp对文件进行签名,发布到Maven仓库中的所有文件都要使用GPG签名,以保障完整性。因此,我们需要在本地安装并配置GPG。
一般的发布文件都有一个对应的签名文件,即 .asc 文件
注、使用gpg生成密钥,关于GPG的安装使用:https://www.cnblogs.com/bjlhx/p/9956706.html
mac安装:brew install gpg
基本使用:gpg --version
生成密钥对:gpg --gen-key
期间会提示用户名,邮箱 输入密码等,可以看到生成了并放到用户的文件夹下,包含公钥和私钥,最下面那部分就是生成的结果。其中输入密码是乱码,因为是中文系统元婴
查看本机包含的密钥对: gpg --list-keys ;pub表示是公钥,而sub表示私钥。
发布公钥到GPG key-servers,非常的关键的,Sonatype 公司需要一个公钥来验证你deploy的文件,默认发送send-keys 应该是pub_key_id , D17AD4F314772283A415624……
gpg --keyserver hkp://pool.sks-keyservers.net:11371 --send-keys D17AD4F314772283A41562431AF7567……
gpg --keyserver hkp://pgp.mit.edu:11371 --send-keys D17AD4F314772283A41562431AF7567……
gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys D17AD4F314772283A41562431AF7567……
上传时候总是报错
尝试使用以下上传
gpg --keyserver hkp://keyserver.ubuntu.com:80 --send-keys D17AD4F314772283A41562431AF7567……
使用查看命令查看
gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys D17AD4F314772283A41562431AF7567……
b》POM 配置【使用第五部分的profiles】
5.5、使用Profile修改pom文件
应该javadoc和source的jar包生成也需要使用gpg来签名,所以很浪费时间,而且这些执行通常都独立于标准构建流程,所以把他们移动到一个profile.
因为插件也需要下载,可以使用pom中的dependencies下载后 在删除掉
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils-core</artifactId>
<version>1.8.3</version>
</dependency> <!--打包插件-->
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.8</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9.1</version>
<scope>provided</scope>
</dependency>
以下是环境配置
<!--综合打包信息-->
<profiles>
<!--快照版本-->
<!--mvn clean deploy -P snapshots -Dmaven.test.skip=true -->
<profile>
<id>snapshots</id>
<build>
<plugins>
<!--用来将工程发布到中央仓库-->
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.8</version>
<extensions>true</extensions>
<configuration>
<serverId>sonatype-nexus-snapshots</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
<!-- maven relaese-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5</version>
<configuration>
<autoVersionSubmodules>true</autoVersionSubmodules>
<useReleaseProfile>false</useReleaseProfile>
<releaseProfiles>release</releaseProfiles>
<goals>deploy</goals>
</configuration>
</plugin>
<!-- maven 编译-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</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>
<!--生成Javadoc,关闭doclint,避免注解检查不通过-->
<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>
<configuration>
<!-- 解决 java8 下发布到 maven 中心库时,生成 doc 的异常 -->
<additionalparam>-Xdoclint:none</additionalparam>
<encoding>${project.build.sourceEncoding}</encoding>
<outputDirectory>${basedir}</outputDirectory>
<reportOutputDirectory>${basedir}</reportOutputDirectory>
</configuration>
</plugin> <!-- GPG自动签名的插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile> <!--release-->
<!--mvn clean deploy -P release -Dmaven.test.skip=true -->
<profile>
<id>release</id>
<build>
<plugins>
<!--用来将工程发布到中央仓库-->
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.8</version>
<extensions>true</extensions>
<configuration>
<serverId>sonatype-nexus-staging</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
<!-- maven relaese-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5</version>
<configuration>
<autoVersionSubmodules>true</autoVersionSubmodules>
<useReleaseProfile>false</useReleaseProfile>
<releaseProfiles>release</releaseProfiles>
<goals>deploy</goals>
</configuration>
</plugin>
<!-- maven 编译-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</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>
<!--生成Javadoc,关闭doclint,避免注解检查不通过-->
<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>
<configuration>
<!-- 解决 java8 下发布到 maven 中心库时,生成 doc 的异常 -->
<additionalparam>-Xdoclint:none</additionalparam>
<encoding>${project.build.sourceEncoding}</encoding>
<outputDirectory>${basedir}</outputDirectory>
<reportOutputDirectory>${basedir}</reportOutputDirectory>
</configuration>
</plugin> <!-- GPG自动签名的插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
5.6、编译打包上传
5.6.1、快照版本【上传后即可使用】
mvn clean deploy -P snapshots -Dmaven.test.skip=true
测试在pom上配置
<repositories>
<repository>
<id>sonatype-snapshots</id>
<name>snapshot</name>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
<snapshots>
<enabled>true</enabled>
<!-- 4种频率类型。如果配置间隔时间更新,可以写作 interval:XX (XX是间隔分钟数)。daily配置是默认值。-->
<!-- A. always是每次都去远程仓库查看是否有更新,-->
<!-- B. daily是只在每天第一次的时候查看是否有更新,当天的其它时候则不会查看;-->
<!-- C .interval允许设置一个分钟为单位的间隔时间,在这个间隔时间内只会去远程仓库中查找一次;-->
<!-- D .never是不会去远程仓库中查找(这种就和正式版本的行为一样了)。-->
<updatePolicy>interval:5</updatePolicy>
</snapshots>
</repository>
</repositories>
5.6.2、release版本
可以继续增加一个profile配置
mvn clean deploy -P release -Dmaven.test.skip=true
注意修改nexus-staging-maven-plugin的configuration地址serverId
使用时候直接配置依赖即可
5.6.3、注意事项问题点
问题一、针对上述,出现问题:
gpg: signing failed: Inappropriate ioctl for device
Failed to execute goal org.apache.maven.plugins:maven-gpg-plugin:1.6:sign (sign-artifacts) on project xgen: Exit code: 2 -> [Help 1]
解决方案:
尝试一、使用的版本是maven3.X,其执行maven-ant-plugin的行为和maven2.x有一定的不同,需要引入pluginManagement
<build> <plugins> <plugin></plugin>增加节点 <build> <pluginManagement> <plugins> <plugin></plugin>
尝试二、增加跳过test处理
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
尝试三、在运行上述命令窗口:export GPG_TTY=$(tty),再次运行,可以弹出输入密码窗口
问题二、Return code is: 401, ReasonPhrase: Unauthorized. -> [Help 1]
注意修改本机maven的指向setting ,可以通过mvn -X 查看
maven-help-plugin是一个小巧的辅助工具,最简单的help:system可以打印所有可用的环境变量和Java系统属性。help:effective-pom和help:effective-settings最为有用。
help:effective-pom用于查看当前生效的POM内容,指合并了所有父POM(包括Super POM)后的XML,所以可用于检测POM中某个配置是否生效
effective-settings可用于查看当前生效的settings.xml文件内容,所以可用于判断某个settings配置是否生效
由于release版本是必须要签名的,所以需要测试签名,
方法一、在maven的settings.xml中配置gpg的签名 :(需要先用gpg来生成 a 步骤)
<!-- 环境变量预POM对应 -->
<profile>
<id>sonatype-nexus-snapshots</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- 此处根据GPG版本填写,<2.0的填写GPG,2.0以上的填写gpg2 -->
<gpg.executable>gpg2</gpg.executable>
<gpg.passphrase>密码</gpg.passphrase>
</properties>
</profile>
方法二、增加编译参数
mvn clean deploy -Prelease -Dmaven.test.skip=true -Dgpg.passphrase=<输入你的密码>
问题:zsh: no matches found: -Dgpg.passphrase=密码
具体原因:因为zsh缺省情况下始终自己解释这个 *.h,而不会传递给 find 来解释。
解决办法:在~/.zshrc
中加入:setopt no_nomatch
, 然后进行source .zshrc
命令
5.7、登录https://oss.sonatype.org/#welcome,使用上述账号即可,在 OSS 中发布构件
会在中间仓库中Staging Repositories
菜单中看到自己刚刚上传的jar
包,
如果没有错的话,选中它,close关闭后,然后点Release
就可以同步到中央仓库了,一般过十分钟左右就能在http://search.maven.org/上边搜到了。
如果在配置中有配置:<autoReleaseAfterClose>true</autoReleaseAfterClose>,那么会自动关闭,自动发布。可能就不需要上述操作了。然后也搜索不到的。
5.8、通知 Sonatype 构件已成功发布
1、 在之前的在Issue下面回复
在 Issue 下面回复一条“构件已成功发布”的评论,这是为了通知 Sonatype 的工作人员为需要发布的构件做审批,发布后会关闭该 Issue。
这个前面的 Sonatype 工作人员其实在审核 Issue 时,在 comment 中已经提示了.https://issues.sonatype.org
2、等待构件审批通过
当审批通过后,将会收到邮件通知。一般一天左右
3、从中央仓库中搜索构件
这时,就可以在 maven 的中央仓库中搜索到自己发布的构件了,以后可以直接在 pom.xml 中使用了!
中央仓库搜索网站:http://search.maven.org/
第一次成功发布之后,以后就不用这么麻烦了,可以直接使用 groupId 发布任何的构件,当然前提是 groupId 没有变。
4、后续其他jar的发布流程
a)构件完成后直接使用 maven 在命令行上传构建;当然groupId 没有变的情况下,如果变动就需要重新申请工单
b)在 https://oss.sonatype.org/ close 并 release 构件;
c) 等待同步好(大约2小时多)之后,就可以使用了
001-将自己的jar提交maven中央仓的更多相关文章
- 使用CI/CD工具Github Action发布jar到Maven中央仓库
之前发布开源项目Payment Spring Boot到Maven中央仓库我都是手动执行mvn deploy,在CI/CD大行其道的今天使用这种方式有点"原始".于是我一直在寻求一 ...
- 上传自己的构件(Jar)到Maven中央仓库
背景: 用了Maven之后,你有没有这样的想法,自己一直在使用别人贡献的代码,自己能不能把自己觉得好的代码也贡献出来让大家方便. 还有如果你也是一名程序员,你会不会觉得要是把自己积累起来日常常用的代码 ...
- 向maven中央仓库提交jar
从来都是从中央仓库下载jar,这次需要向中央仓库提交jar, 利用Sonatype OSSRH可以把jar等资源提交给Maven的中央仓库. Sonatype OSSRH介绍: Sonatype OS ...
- 记一次向maven中央仓库提交依赖包
Maven是Java中最常用的依赖管理工具,Maven的中央仓库保罗万象,涵盖了各个领域的框架.工具和文档,也是Java生态强大生命力的体现.我们自己开发的一些有用有趣的代码也可以通过打包上传到mav ...
- 如何发布jar包到maven中央仓库
自使用maven以来,没少使用maven中央仓库中的各种jar包,方便有效,但是咱们也不能总是只取不予,也应该懂得奉献,当你写好了一个十分好用的jar包,想贡献出去给大家使用的时候,应该怎么做呢?当然 ...
- Dev 日志 | 如何将 jar 包发布到 Maven 中央仓库
摘要 Maven 中央仓库并不支持直接上传 jar 包,因此需要将 jar 包发布到一些指定的第三方 Maven 仓库,比如:Sonatype OSSRH 仓库,然后该仓库再将 jar 包同步到 Ma ...
- 将自己的项目作为jar包发布到maven中央仓库
maven版本是3.5.0,jdk是1.8(注意,不是说项目是1.8就行,必须是环境变量里的也是,不能超过1.8,否则一大堆问题,执行mvn前用javac -version看下版本) 一:先在sona ...
- maven插件上传本地jar包到maven中央仓库
settings配置(如果设置后有问题,可以重启idea,保证重新加载settings文件): <!-- 上传jar包到maven中央仓库配置start --> <server> ...
- 将jar包发布到maven中央仓库
将jar包发布到maven中央仓库 最近做了一个swagger-ui的开源项目,因为是采用vue进行解析swagger-json,需要前端支持,为了后端也能方便的使用此功能,所以将vue项目编译后的结 ...
随机推荐
- Java EE发展史
前言 最近的这段时间一直在学习Java EE,刚刚完成了从0到1的蜕变,所以顺便整理一下我所了解到的Java EE,给刚入门学习的新人一些头绪,而所谓“启示录”,就是这个意思. 一.Java EE是什 ...
- jQuery给动态添加生成的元素绑定事件的方法
<div id="testdiv"> <ul></ul> </div> 需要给<ul>里面动态添加的<li&g ...
- 【C#新特性】不用out ref同时返回多个值-元组Tuple
元组Tuple,它是一种固定成员的泛型集合 下面先看看官方的一个使用例子: 创建一个包含7个元素的Tuple数组 // Create a 7-tuple. , , , , , );// Display ...
- 【cs229-Lecture4】GLMS:选定指数分布族,如何用它来推导出GLM?
在Lecture4中有3部分内容: Newton’s method 牛顿方法 Exceponential Family 指数分布族 Generalized Linear M ...
- 【转】strlen源码
strlen源码剖析 学习高效编程的有效途径之一就是阅读高手写的源代码,CRT(C/C++ Runtime Library)作为底层的函数库,实现必然高效.恰好手中就有glibc和VC的CRT源代码, ...
- Linux(Ubuntu)下也能用搜狗输入法了!!!
Ubuntu原生的中文输入法是不是总有点别扭? 不用再别扭了. 告诉你一个好消息:Linux(Ubuntu)下也能用搜狗输入法了!!! 下载地址:http://pinyin.sogou.com/lin ...
- initializer element is not constant 问题
在Ubuntu下,比葫芦画瓢,写了一个程序,居然报错!!!! #include <stdio.h> ; int j = *(int *)(&i) ; int main (int a ...
- junit4 详解
转:http://www.cnblogs.com/eggbucket/archive/2012/02/02/2335697.html JUnit4概述 JUnit4是JUnit框架有史以来的最大改进, ...
- POJ 1117 Pairs of Integers
Pairs of Integers Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4133 Accepted: 1062 Des ...
- docker 参数
-a, --attach=[] Attach to STDIN, STDOUT or STDERR 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项 --add-host= ...