发布项目到Nexus Maven中央仓库(整合版+坑)

1 篇文章 0 订阅
1 篇文章 0 订阅

       本来不打算写这篇文章,因为看到了很多这样的文章,本想着按照网上的做一遍,发现遇到的坑是找遍各个博客论坛也没有解决,所以还是打算也弄一篇这样的教程,记录下自己走过的坑。本文主要是整合,也是借鉴了许多优秀的文章。

       这是我第一次尝试去开源自己封装的一个小工具,虽然不起眼。但是还是千里之行的第一步,还是让自己狠狠的高兴了一番。

       首先我要先感谢一些博主的博客,真的是分享才是硬道理。

       第一次主要参考这篇博客       如何提交项目到Maven中央仓库(图文详解) 

      参考了这篇文章 jdk8使用maven-javadoc-plugin插件报错的处理   

      如何上传自己的jar包到maven公共远程中央仓库(终)

     整个操作的流程:

  •     注册Nexus 账号
  •     Nexus 创建项目
  •     GPG秘钥安装
  •     项目POM文件配置

一、注册Nexus账号

      Nexus账号注册地址  注意密码的复杂度

二、创建项目

     1、新建 —> issue

     2、项目 —> Community Support - Open Source Project Repository Hosting

     3、类型 —> New Project

4、概要—> 自己看着写

5、以下步骤参考图片(其实下面的英文提示很清晰了)

6、创建 Issue 后,等待审核即可。一般会在一个工作日内审核完成。当Issue的Status变为RESOLVED 或 FIXED 后,即可进行下一步操作。

三、GPG秘钥安装

   1、下载地址 :https://www.gpg4win.org/download.html   红框标注分别是Windows和Mac的

 GPG常用命令(直接复制之前博主的,写的很棒)

  

查看是否安装成功
gpg --version

生成密钥对
gpg --gen-key

查看公钥
gpg --list-keys

将公钥发布到PGP密钥服务器
gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys 公钥ID

查询公钥是否发布成功
gpg --keyserver hkp://keyserver.ubuntu.com:11371 --recv-keys

2、在安装完成后,执行以下命令生成密钥对,按照提示输入账号、邮箱、密码 (PS: 此处的密码在后面发布会用到,请务必记住

生成秘钥
gpg2 --gen-key 

3、执行命令查看密钥, 此时控制台会输出类似下面的内容

4、执行以下命令将公钥发布到服务器中(如果失败就在重新发送一次)

将公钥发布到PGP密钥服务器
gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys 公钥ID

查询公钥是否发布成功
gpg --keyserver hkp://keyserver.ubuntu.com:11371 --recv-keys

四、Maven配置

    我们要做一个Maven的配置,把上传的用户名和密码放在里边

<!-- sonaty的账号和密码 两个sever是一样的。只是为了区分不同功能配置-->
    <server>    
      <id>releases</id>
      <username>your user name</username>
      <password>your password</password>
    </server>

    <server>
      <id>snapshots</id>
      <username>your user name</username>
      <password>your password</password>
    </server>

五、项目POM文件配置

下面是本人的项目pom文件,全部。之后会去细说需要注意的配置

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.9.RELEASE</version>
        <relativePath/>
    </parent>
    <groupId>com.github.DDLoveWorld</groupId>
    <artifactId>common-query</artifactId>
    <packaging>jar</packaging>
    <version>1.0.1-SNAPHOST</version>
    <description>Common query demo project for Spring Boot</description>

    <properties>
        <global.version>1.0.1</global.version>
        <chartset.UTF8>UTF-8</chartset.UTF8>
        <mybatis.plus.version>3.1.2</mybatis.plus.version>
        <lombok.version>1.18.10</lombok.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>${mybatis.plus.version}</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis.plus.version}</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <!--发布到maven仓库-->

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

    <profiles>

        <profile>
            <id>release</id>
            <!-- 指定profile只在JDK版本大于等于1.8时有效-->
            <activation>
                <jdk>[1.8,)</jdk>
            </activation>
            <build>
                <pluginManagement>
                    <plugins>
                        <!--这是自动发布的插件-->
                        <plugin>
                            <groupId>org.sonatype.plugins</groupId>
                            <artifactId>nexus-staging-maven-plugin</artifactId>
                            <version>1.6.3</version>
                            <extensions>true</extensions>
                            <configuration>
                                <serverId>releases</serverId>
                                <nexusUrl>https://oss.sonatype.org/</nexusUrl>
                                <autoReleaseAfterClose>true</autoReleaseAfterClose>
                            </configuration>
                        </plugin>

                        <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-release-plugin</artifactId>
                            <version>2.4.2</version>
                            <configuration>
                                <autoVersionSubmodules>true</autoVersionSubmodules>
                                <useReleaseProfile>false</useReleaseProfile>
                                <releaseProfiles>release</releaseProfiles>
                                <goals>deploy</goals>
                            </configuration>
                        </plugin>
                        <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-compiler-plugin</artifactId>
                            <version>3.1</version>
                            <configuration>
                                <source>1.8</source>
                                <target>1.8</target>
                            </configuration>
                        </plugin>
                        <!-- gpg加密 -->
                        <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-gpg-plugin</artifactId>
                            <executions>
                                <execution>
                                    <id>sign-artifacts</id>
                                    <phase>verify</phase>
                                    <goals>
                                        <goal>sign</goal>
                                    </goals>
                                </execution>
                            </executions>
                        </plugin>
                        <!-- 打包源码为jar -->
                        <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-source-plugin</artifactId>
                            <version>3.0.1</version>
                            <executions>
                                <execution>
                                    <id>attach-sources</id>
                                    <goals>
                                        <goal>jar-no-fork</goal>
                                    </goals>
                                </execution>
                            </executions>
                        </plugin>
                        <!-- 打包javadoc文档 -->
                        <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-javadoc-plugin</artifactId>
                            <configuration>
                                <additionalOptions>
                                    <!-- 解决jdk1.8以后编译出错问题-->
                                    <additionalOption>-Xdoclint:none</additionalOption>
                                </additionalOptions>
                            </configuration>
                            <executions>
                                <execution>
                                    <id>attach-javadocs</id>
                                    <goals>
                                        <goal>jar</goal>
                                    </goals>
                                </execution>
                            </executions>
                        </plugin>
                    </plugins>
                </pluginManagement>
            </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>
            <distribution>repo</distribution>
        </license>
    </licenses>

    <scm>
        <url>https://github.com/DDLoveWorld/common-query</url>
        <connection>https://github.com/DDLoveWorld/common-query.git</connection>
        <developerConnection>https://github.com/DDLoveWorld</developerConnection>
    </scm>

    <developers>
        <developer>
            <name>hualidong</name>
            <email>869701411@qq.com</email>
            <url>https://github.com/DDLoveWorld</url>
        </developer>
    </developers>

</project>

  1、由于Maven仓库校验还是很严格的,一些描述性的配置也都是不能少的

<!-- 描述项目节点-->
<description>Common query demo project for Spring Boot</description>


<!-- 作者信息-->
<developers>
        <developer>
            <name>hualidong</name>
            <email>869701411@qq.com</email>
            <url>https://github.com/DDLoveWorld</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>
    </license>
</licenses>

2、Maven仓库的一些配置

<!-- 仓库信息 -->
 <scm>
    <url>https://github.com/DDLoveWorld/common-query</url>
    <connection>https://github.com/DDLoveWorld/common-query.git</connection>
    <developerConnection>https://github.com/DDLoveWorld</developerConnection>
 </scm>





<!-- 发布管理信息 -->
    <distributionManagement>
        <repository>
            <!-- 这里的id必须要和全局配置中的release id 一致 -->
            <id>releases</id>
            <!-- 这里就是在创建issue成功后,对方回复的release发布地址-->
            <url>https://oss.sonatype.org/service/local/staging/deploy/maven2</url>
        </repository>
        <snapshotRepository>
            <!-- 这里的id必须要和全局配置中的snapshot id 一致 -->
            <id>snapshots</id>
            <!-- 这里就是在创建issue成功后,对方回复的snapshot发布地址-->
            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
        </snapshotRepository>
    </distributionManagement>

3、打包配置

 发布到maven中央仓库会要求我们在上传项目得jar的同时,必须同步发布对应到Javadoc、source、asc(利用gpg生成到校验),所以需要在maven中添加以下构建插件(开始划重点了

(1)Javadoc

  这是个大坑啊,在jdk版本1.8之后校验规则变了,所以要动一动(注意好每个配置项所放的位置,参考这个pom)。

  Javadoc 的命令是:(我遇到的坑的关键点)

mvn javadoc:jar
<!-- 指定profile只在JDK版本大于等于1.8时有效-->
            <activation>
                <jdk>[1.8,)</jdk>
            </activation>




 <!-- 打包javadoc文档 -->
    <plugin>
       <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-javadoc-plugin</artifactId>
         <configuration>
         <additionalOptions>
           <!-- 解决jdk1.8以后编译出错问题-->
           <additionalOption>-Xdoclint:none</additionalOption>
         </additionalOptions>
         </configuration>
            <executions>
               <execution>
                  <id>attach-javadocs</id>
                  <goals>
                    <goal>jar</goal>
                  </goals>
               </execution>
            </executions>
     </plugin>

(2)Source 

   打包源码插件。附带命令

mvn source:jar
  <!-- 打包源码为jar -->
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <version>3.0.1</version>
    <executions>
      <execution>
          <id>attach-sources</id>
          <goals>
             <goal>jar-no-fork</goal>
          </goals>
      </execution>
    </executions>
  </plugin>

(3) GPG秘钥

加密工具。附带命令:

mvn gpg:sign
 <!-- gpg加密 -->
 <plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-gpg-plugin</artifactId>
   <executions>
       <execution>
         <id>sign-artifacts</id>
         <phase>verify</phase>
             <goals>
                <goal>sign</goal>
             </goals>
       </execution>
   </executions>
 </plugin>

其他的插件就不在叙述了。

六、发布项目

  到了最最关键的时刻了,这个时刻就是我遇到的坑最大了。

发布
mvn clean deploy -P release

就是这个命令啊怎么弄都不行,上传的东西是各种缺失,不是少javadoc的jar就是少source的jar。搜索了很多网上的博客也都是这样的命令。真的是纠结了老半天。分散想下,先试下各个插件的命令是否可以正常运行,参考上面各个单独命令(mvn javadoc:jar 等)。发现都是没问题的。最终命令:

<!-- 终极运行发布命令-->
mvn clean install javadoc:jar source:jar gpg:sign deploy -P release

“妈妈再也不用担心我的发布不成功了!”

解释下,命令是从左到右依次执行的  最终成功上传到仓库并校验合格,就差close 和 release了。

也可以用mvn设置版本:

mvn versions:set -DnewVersion=1.0.1-SNAPHOST

登录https://oss.sonatype.org,然后选择staging Repositories

我这是上传发布成功了,所以没有待发布了。

操作步骤就是选择要发布的列,先点close(当然release也点不了),等待检查通过后,刷新,release就可以点击了,点击release就ok了 。等待一段时间就ok了。官方的回答是十分钟左右就可以引用自己的jar了。两个小时上传到中央库

如果Release成功,并且你是首次发布组件,则需要到你创建到issue中回复 “我已经成功发布该组件”,经历大概2小时后,该组件将会同步到对应的maven仓库 。

最后说下个人感受:

1、本身我这边也是参考了网络上的各种文章去做的,也很多,不打算在写这篇文章了。但是实际操作下来还是和网上的有一定差别,还是记录下。希望能给大家一点帮助,如果有说的不对的,请留言改正

2、还有一点就是,大家应该都有过这种感受,就是玩游戏一开始都是说太难了,太难了,但是当你通关之后一次,在回过头来玩一次,你会发现so ease!无论之前多难过的关卡。技术也是一样,现在回想整个发布的过程,一头雾水的扎进去,遇到各种坑,最终完成后。只想说一句 so ease!

3、终于开源了一些自己的小工具,尽管不值一提,但是还是很开心。后期会把小工具链接加上!!

下面是本人做的一个小工具:

做了一个前后端接口的自定义查询构造。减少前后端的接口查询交流

Mybatis-plus二次开发之接口参数自定义查询

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值