向Maven仓库发布组件

一般,我们如果开发了一个工具组件,肯定想将它发布以供其他人使用。在公司内部,我们可以将其发布到私有仓库,在互联网环境,我们一般将其发布到 maven 中央仓库。以下以我们最近开发的java工具 flyRafter 进行介绍,如何将一个组件发布到 maven 中央仓库。

首先,我们先要确保组件能正确编译为 jar 包,在这个前提下,我们先提前配置我们项目的 pom.xml ,以便发布时使用。

  1. 项目基本信息配置
    <groupId>fun.mortnon</groupId>
    <artifactId>flyrafter</artifactId>
    <version>0.0.1</version>
    <packaging>jar</packaging>

    <name>${project.artifactId}</name>
    <url>https://gitee.com/mortise-and-tenon/flyrafter</url>
    <description>generate sql file from java entity class.</description>

这里配置项目的最重要的 groupIdartifactIdname等。

需要注意,按照中央库的要求,如果向 maven 中央库提交组件,你需要拥有 groupId 使用的域名,如果你没有域名,你也可以使用托管环境的域名作为 groupId。比如你项目在 github上,你的用户名叫 ME,你的 groupId 可以是 com.github.me

  1. 组件的开源协议
<licenses>
        <license>
            <name>MIT License</name>
            <url>https://opensource.org/licenses/MIT</url>
            <distribution>repo</distribution>
        </license>
    </licenses>

你用什么协议,就配置相应协议即可。

  1. 项目的源码地址及所属开发者信息
    <scm>
        <url>http://mortnon.fun</url>
        <connection>scm:git:https://gitee.com/mortise-and-tenon/flyrafter.git</connection>
        <developerConnection>scm:git:https://gitee.com/mortise-and-tenon/flyrafter.git</developerConnection>
    </scm>

    <developers>
        <developer>
            <name>mortnon</name>
            <email>mortnon@outlook.com</email>
            <organization>卯榫 mortise-and-tenon</organization>
            <organizationUrl>https://mortnon.fun</organizationUrl>
        </developer>
    </developers>

在这里填写你的项目地址、托管的SCM地址,以及所属开发者的介绍信息。

  1. 发布仓库配置
    <distributionManagement>
        <snapshotRepository>
            <id>ossrh</id>
            <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
        </snapshotRepository>
        <repository>
            <id>ossrh</id>            <url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
        </repository>
    </distributionManagement>

这里配置的仓库地址,是中央库最新的地址,新项目都将提交到这里。

注意 idossrh,这个值要与后面在本地 maven 的 setting.xml 配置的 值一致,保持与官方说明使用的 ossrh 一致最简单。

  1. 插件配置
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.sonatype.plugins</groupId>
                        <artifactId>nexus-staging-maven-plugin</artifactId>
                        <version>1.6.7</version>
                        <extensions>true</extensions>
                        <configuration>
                            <serverId>ossrh</serverId>
                            <nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
                            <autoReleaseAfterClose>true</autoReleaseAfterClose>
                        </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>
                    <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>
                            <additionalJOptions>
                                <additionalJOption>-Xdoclint:none</additionalJOption>
                            </additionalJOptions>
                        </configuration>
                    </plugin>
                    <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>

以上插件是发布到中央库所需要的,与项目本身编译没有直接关系。由于涉及到 source、doc的编译生成,如果只是本地调试,会增加编译耗时,所以官方也建议将这些与发布相关的插件通过 profile进行区分配置,将这些发布相关插件放到发布的 profile中,如:

    <profiles>
        ...
        <profile>
            <id>release</id>
            <build>
                <plugins>
                    ...
                </plugins>
            </build>
        </profile>
    </profiles>

以上为对项目的 pom.xml 进行配置的介绍。以下介绍对本地 maven 的 setting.xml进行配置介绍。打开本地 maven 工具的目录,进入 conf 目录下,就可以看到 setting.xml文件。打开此文件,按如下添加内容:

  1. profiles 节点添加内容
    <profile>
      <id>ossrh</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <gpg.executable>gpg</gpg.executable>
        <gpg.passphrase>the_pass_phrase</gpg.passphrase>
      </properties>
    </profile>

注意这里的gpg是在发布时调的命令,根据gpg的版本,这里也可以是 gpg2,而 passphrase代表你的私钥的密码,这里可不用填写,在发布时,一般还会弹窗要求输入。

  1. servers 节点添加内容
<server>
      <id>ossrh</id>
      <username>NAME</username>
      <password>PWD</password>
    </server>

注意这里的用户名和密码,是中央库 sonatype 的用户名与密码,后面将介绍相关的使用,注册地址为 sonatype

以上发布插件、maven setting.xml 中都涉及gpg配置,因为项目编译后发布前要使用gpg进行签名校验,所以我们需要先用这个工具生成公私钥。Linux 环境下这个工具很简单,此处不讨论,仅讨论 Windows 环境下。

我们先去gpg4win 官方下载 Windows 环境的安装包,地址:gpg4win。下载页面上,会让你选择是否使用 paypal 捐助,没钱选择捐 0 元,直接下载即可。下载成功后,双击安装程序,按提示不断下一步安装即可。

安装成功后,打开gpg4win(名为Kleopatra,图标头像是一个齐留海的女头),如果出现如下提示信息 “Kleopatra cannot be run as administrator without breaking file permissions in the GnuPG data folder.”。遇到这种情况,可以直接点击另一个安装时生成的快捷图标 GPA 来打开gpg应用,然后点击图标中靠右的 Keyring 来打开生成界面。

kelopatra
gpa
gpa2

在GPA界面中点击生成新的密钥,按照提示一步步操作即可,注意记住自己的密钥的密码。密钥生成成功后,右键点击密钥,然后选择“Send Keys”,将公钥发送给服务器。

以上所有配置、操作完成后,本地的配置基本完成。以下进入 sonatype 进行账号注册。

进入官网sonatype,注册一个账号,注意密码要有大小写和特殊符号。注册成功后,点击上方的“新建”,然后新建一个问题(issue),选择项目Community Support - Open Source Project Repository Hosting (OSSRH),问题类型选择 New Project

  • 概要输入自己的项目名称或者相应的描述即可。

  • Group Id输入自己项目的Group Id,注意上面提过的规则(要么用自己的域名,要么用托管网站的域名,官方文档Group Id)。

  • Project URL 输入自己的项目网站地址

  • SCM url 输入项目的git下载地址

  • 其他项保持默认为空,即可

最后,点击新建,提交问题,然后等待官方回复操作指南。

sonatype

官方会提示,你确认是否拥有相应域名所有权,只要在域名的DNS解析中,添加一条txt记录,将内容填写为自己的问题单url即可,如果是托管网站的名字,如com.github.xxx,官方会直接检查。

当DNS解析添加后,点击备注,添加一条备注,告诉已添加dns解析即可。

官方审核后,会给出上传组件的指导手册,手册中会指导如何在pom.xml中添加配置,也就是我们上面介绍的配置。在此,我们就去进行发布即可,可以先回到上面的setting.xml中添加自己的 sonatype 账号和密码。

在本地的命令行中对项目执行mvn发布命令 mvn clean deploy 即可在编译成功后,并将组件发布到中央库 stage 库中。同时,如果 artifact id 不以 -SNAPSHOT 结尾的话,mvn 的 stage 插件会自动将stage 库的组件正式发布到公开仓库中。

需要注意,如果 pom.xml 使用了 profile 对开发、发布进行了区分,发布命令中需要带上指定的 profile 名称,如 mvn clean deploy -Prelease,而更多的参数可以按照 mvn 命令的说明进行添加

发布后,我们可以在仓库中搜索发布的组件,地址:Nexus Repository Manager,并且,如果组件处于 stage 库,可以在这里管理。官方也提示,发布后可以直接在[仓库](Central Repository: (maven.org))中查看,但要在Maven Central Repository Search查看的话,需要等2小时。

sonatype

以上,就是整个组件向中央库发布的操作过程。以上示例中,我们发布了最后开发的 flyRafter 第一个预览版,这个工具是用于 java 中将 @Entity 注解的实体类自动生成建表 SQL 文件的工具,同时,它结合 flyway 使用,可以达成效果:

不用单独写sql定义表,只要建好数据库,在实体类中定义好字段名称和定义,就可以动态的对数据库表进行变化,类似于 Hibernate的 ddl-auto:update,但比它更好用。

gitee地址: FlyRafter: 实体转为SQL,并结合flyway应用的工具 (gitee.com),maven 地址:Maven FlyRafter该工具正在完善中,欢迎大家试用,并提交 issue。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容