logo头像

学如逆水行舟,不进则退!!!

文章目录

Maven发布(详细版)

[TOC]

maven项目的发布

平时开发中都是使用别人的maven项目,作为一个标准的程序员发布个自己的程序也是必要的。

工单申请

  • 在发布前,您需要有自己的项目主页并开源的代码,您可以使用GitHub或者码云,下面的内容以Oschina为例,换句话说我们需要将我们的项目源码发布到码云平台上。毕竟maven是开源精神。所以必须需要将你的源码提供给maven

注册Sonatype OSSRH

  • 其次,我们需要在sonatype平台申请,如果有账号就直接登录sonatype登录,没有的话在登录界面也可以点击注册

  • 注册完账号之后我们可以登录sonatype平台,开始创建工单

创建工单

  • 现在我创建好了本地项目,坐标是
<groupId>com.github.zxhTom</groupId>
<artifactId>csdn-sdk</artifactId>
<version>1.0.0</version>
  • 本地项目放在码云平台,地址是 https://gitee.com/zxhTom/csdnSdk.git

  • 那么我创建的工单信息如下
    工单详情
    工单成功

  • 创建完工单我们需要等待3~5分钟,我们就会收到邮件告诉我们工单创建成功!这里的邮箱是在注册的时候填写的,这里就不多说了。创建完工单我们可以在自己账号中查找也可以去首页查找,应为是刚创建的在首页中最近的几条工单信息中会出现我们的工单列表(首页是按时间倒叙的)。所以在查找以前创建的工单是我们只能去自己工单列表中查找。

工单列表

工单参数

属性值属性解释
Summary这就是项目说明,你直接可以写个人项目,搞个统称就行
Project URL你就填写你的github或者git.oschina.net 的,或者个人主页也行
SCM URL写成和Project URL 一样也没啥事
username用户名

这里需要特别说明的是 Group Id,如果你是托管在 Github 或者 Git@OSC 可以使用 com.github.binarylei 或者 net.oschina.XXX,剩下的可以依照实际情况填写,例如托管的地址等等(托管地址等信息会在用去 maven 仓库搜索的时候显示,用来帮助用户找到你的项目地址寻求帮助)。另外此处填写的 groupId 必须和你要发布的组件的 pom 中的 groupIdd 一样,必须一样!!!

工单等待

  • 上面我们已经成功创建了工单,但是审核还是需要等待一会的。正常等待1~5小时。这个看个人运气。我的现在仍在等待中。等待的过程一切工单的状态客服人员都会在你的工单下comments下进行评论的,我们也可以(必须)在下面对客服人员的问题进行回复。

comments

———————————–漫长的等待———————————–

  • 好了经过漫长的等待,我们创建的工单终于得到了回复。因为com.github.zxhTom这个groupid我之前注册申请过,所以这里sonatype回复我不会再次给我创建工单,让我使用之前那个工单。下面来看看两张工单

![./maven发布/005.png]

![./maven发布/006.png]

  • 上面的是我之前创建的工单,可以看到我在评论去的评论。这是我在和sonatype沟通。其中出现如下回复说明我们的创建没有问题

![./maven发布/007.png]

  • 我们就可以发布我们的项目了,发布成功后工单会自动回复信息,告诉我们其他仓库同步的事情。然后你可以礼貌性回复下

![./maven发布/008.png]

gpg2加解密

  • 点我下载

  • 下载好gpg之后我们就傻瓜式安装,这里不细说

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

gpg版本

  • gpg --gen-key 生成公钥密钥

gpg生成

  • gpg --list-keys 查看公钥 ; 其中pub那一长串就是我们的就是我们需要上传的公钥id,gpg的版本不同所生成的pub id 格式和 长度不同。我们不用担心
  • 生成公钥秘钥的过程需要我们输入passphrase,这个passphrase就是我们的凭证,一定要记住
  • ps :
    • Real name: 名字
    • Email address: email地址
    • Comment: 描述评论

查看

  • gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 公钥ID
  • 将公钥发布外网,下图中gpg –list-keys 是在另外一台电脑上执行的。版本和上一步那台电脑版本不一样。这里是给大家看看斑斑不一样导致的pub id .这里我们只需选择后面字符

发布

  • gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 公钥ID 查看公网公钥

查看公钥

maven配置

  • 在pom中需要配置doc compile等必须插件

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.7</source>
        <target>1.7</target>
        <encoding>UTF-8</encoding>
        <showDeprecation>true</showDeprecation>
        <showWarnings>true</showWarnings>
        <optimize>true</optimize>
        <compilerArguments>
            <verbose/>
            <!-- 如果是linux构建需要将分号缓存冒号:, 如果是windows下则用分号 -->
            <bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar</bootclasspath>
        </compilerArguments>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <version>2.1.2</version>
    <configuration>
    </configuration>
    <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.7</version>
    <configuration>
        <charset>UTF-8</charset>
        <docencoding>UTF-8</docencoding>
        <!-- 允许子项目也是用该插件 -->
        <aggregate>true</aggregate>
        <!-- 由于现在该插件比较严谨,该标签是忽略严格验证。比如没有的标签注解可以忽略错误 -->
        <additionalparam>-Xdoclint:none</additionalparam>
    </configuration>
    <executions>
        <execution>
            <id>attach-javadocs</id>
            <goals>
                <goal>jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

  • 上面的过程是硬性的条件准备。准备好了我们这一步要做的就是配置这些信息。
  • maven为我们提供了发布的工程,我们只需要继承就可以了,但是实际中我们有自己的基础工程要继承,所以继承只是一种方法。实际上我们可以自己重新配置。下面分别实现两种方式的配置。读者只需选择其中一种配置 ps :两种方式选择一中即可>

继承oss-parent

  • 在我们的项目的pom文件中继承oss-parent
<parent>
    <groupId>org.sonatype.oss</groupId>
    <artifactId>oss-parent</artifactId>
    <version>7</version>
</parent>
  • 然后在pom中增加如下配置 , 具体的配置信息改成自己项目的信息就行了。也是通俗易懂的
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-gpg-plugin</artifactId>
        <version>1.1</version>
        <executions>
            <execution>
                <id>sign-artifacts</id>
                <phase>verify</phase>
                <goals>
                    <goal>sign</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    </plugins>
    <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>
        <connection>scm:git:https://gitee.com/zxhTom/csdnSdk.git</connection>
        <developerConnection>scm:git:https://gitee.com/zxhTom/csdnSdk.git</developerConnection>
        <url>https://gitee.com/zxhTom/csdnSdk</url>
        <tag>${project.version}</tag>
    </scm>
    <developers>
        <developer>
            <name>zxhTom</name>
            <email>870775401@qq.com</email>
            <roles>
                <role>developer</role>
            </roles>
            <timezone>+8</timezone>
        </developer>
    </developers>


  • 然后在maven settings中加上如下配置

<servers>
    <server>
      <id>sonatype-nexus-snapshots</id>
      <username>Sonatype 账号</username>
      <password>Sonatype 密码</password>
    </server>
    <server>
      <id>sonatype-nexus-staging</id>
      <username>Sonatype 账号</username>
      <password>Sonatype 密码</password>
    </server>
  </servers>


ps : 这种方式笔者一开始没有采纳,所以没有亲测,但是下面一种方法是我按照第一种变形的。所以这一种应该是可以的。 剩下的我们就可以mvn clean deploy 进行发布了。发布的过程需要输入gpg passphrase验证。这里只是配置。真正发布下面继续。

![./maven发布/019.png]

只用配置maven 仓库(全局)和项目pom (项目)。

settings.xml配置

  • 在settings.xml的servers节点中添加一个server。在其中加入 server 信息,包含 Sonatype 账号的用户名与密码

sonatype账号密码

  • 然后就是maven的远程仓库了。这里配置远程的仓库就是自己选择了。这里不多说给一份默认的远程地址配置
<profile>
      <id>default_maven</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <repositories>
        <repository>
          <id>central</id>  
          <name>Central Repository</name>  
          <url>http://repo.maven.apache.org/maven2</url>  
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
            <id>central</id>
            <name>CentralRepository</name>
            <url>https://repo.maven.apache.org/maven2</url>
            <layout>default</layout>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <releases>
                <updatePolicy>never</updatePolicy>
            </releases>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>

  • 到这里基本结束了。因为maven发布需要加解密,上面我们使用gpg加密,这里需要将gpg的信息配置成一个profile,这样mvn deploy的时候就知道gpg了。这时候配置需要用到之前在发布gpg公钥的时候我让大家记住的东西了passphrase。下图被打马赛克的就是我的passphrase

![./maven发布/019.png]

  • 这里配置了,根据版本不一样 有的是gpg , 有的是gpg2 . 读者两个分别试试就知道自己版本适合哪一个了

项目pom配置

  • 和第一种一样需要增加Licenses、SCM、Developers信息。 下面多了一个repository这是多余的。读者可以自行去掉。因为这个已经在settings.xml全局中profile中配置了,并且是默认激活的。就算settings中没有配置
    maven也是默认读取这个地址的(远程中央仓库)

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-gpg-plugin</artifactId>
    <version>1.1</version>
    <executions>
        <execution>
            <id>sign-artifacts</id>
            <phase>verify</phase>
            <goals>
                <goal>sign</goal>
            </goals>
        </execution>
    </executions>
  </plugin>
</plugins>
<licenses>
    <license>
        <name>The Apache License, Version 2.0</name>
        <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
    </license>
</licenses>
<developers>
    <developer>
        <name>zxhTom</name>
        <email>870775401@qq.com</email>
        <roles>
            <role>developer</role>
        </roles>
        <timezone>+8</timezone>
    </developer>
</developers>
<scm>
    <connection>scm:git:https://gitee.com/zxhTom/csdnSdk.git</connection>
    <developerConnection>scm:git:https://gitee.com/zxhTom/csdnSdk.git</developerConnection>
    <url>https://gitee.com/zxhTom/csdnSdk</url>
    <tag>${project.version}</tag>
</scm>
<repositories>
    <repository>
        <id>maven-central</id>
        <name>maven-central</name>
        <url>https://repo.maven.apache.org/maven2</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        <releases>
            <enabled>true</enabled>
        </releases>
    </repository>
</repositories>

  • 唯一不同的是,此种方法多了distributionManagement。distributionManagement中的repository和snapshotRepository中的id一定要和settings中server的id保持一致

  • 这也是为什么第一种方法中server需要配置两条,因为oss-parent中的distributionManagement两个id不同。而我们自定义的就可以定义一致。我们的settings中就可以只配置一个server了。


<distributionManagement>
    <snapshotRepository>
        <id>ossrh</id>
        <url>https://oss.sonatype.org/content/repositories/snapshots</url>
    </snapshotRepository>
    <repository>
        <id>ossrh</id>
        <name>Maven Central Staging
            Repository
        </name>
        <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
</distributionManagement>

  • ps : 两种方法基本是一样的。只不过一个是maven提供。另一个自定义而已

发布jar

  • 好了,前期的准备工作已经完成了。那么现在我们开始配置我们项目和maven就可以发布到中央仓库了。

  • 执行mvn clean deploy 。 我是在idea中执行的 因为gpg已经配置在settings.xml中了,所以后面不用跟gpg信息了。

  • 执行完我们就可以在https://oss.sonatype.org中查看我们刚发布的项目了,此时还没有发布到中央仓库;登录此网站账号密码就是sonatype的。左侧build promotion->staging repositories中列表最底下就是应该是我们发布的项目

  • 我们查看到的信息是open状态,我们需要注意这个状态,需要open–>close–>relese 。 最后才会发布到中央仓库,然后同步到其他maven需要一定时间可能需要几天
    close的时候需要看信息,close失败会在activity中提示你哪些错误的。还有些pom细节这里不能细说了,时间问题

    点我查看我的pom项目(sonatype分支)

    • release成功之后再staging repositories就消失了。在左侧搜索 , 搜索到就表示成功,我们等待就会在中央仓库搜索到我们项目

更新项目

  • 出于使用安全的角度考虑,我们发布过的构建是不能够修改的。即相同GAV是禁止上传发布的。GAV(maven坐标)
  • 但是我们可以发布snapshot快照版本给团队开发,因为开发期间项目肯定是不断的变化的。发布snapshots和发布releas一样就是版本号后面多snapshots
  • 而且是发布之后没有close–release这个操作,直接mvn deploy就可以了,但是snapshot在中央仓库和其他任何仓库都搜索不到。搜索不到不代表没有,在中央仓库的snapshot仓库其实是已经有我们的构件,只是通过页面搜索不到。我们团队内部自己知道就行了。
  • 换句话说我们发布快照对别人来说是隐藏的。但是只要知道你快照的GAV就可以使用。

再次发布其他项目

  • 再次发布只需要执行配置和发布那两块 。 其实就是项目的pom配置 。 之前的工单啥的不需要了。同一个groupid 只需要一个工单, 而且以后都不用关心了。

  • 中央仓库地址

  • mvn地址

具体发布细节

细节

上一篇
坚持原创技术分享,您的支持将鼓励我继续创作!