首发于 元人部落
如何发布自己的项目到中央仓库

如何发布自己的项目到中央仓库

1

以前在github发开源项目,都因为懒,从来不构建到中央仓库。最近因为其他人要用,联系我。希望可以发到中央仓库。我想,不就是mvn deploy嘛,开搞。一圈弄下来,发现真没那么简单。当中遇到了无数的坑,让我每一次都心里默默念到,发个项目,为何如此痛苦。


现将痛苦的过程详细记录下来。希望可以帮助到其他小伙伴少踩点坑。


首先,你需要到 sonatype 这个站点上去注册一个账号。这个页面长这个样子:





我当时以为我进错地方了,这不是jira吗。好吧。看url还是提issue的地方,这和发布项目有毛的关系...


好吧,点新建,项目选 Community Support - Open Source ,问题类型选 New Project





填就是了。注意的是Group Id这里要填你自己的拥有的域名,比如com.xxxx,没有的话,自己去注册域名去。填好之后就是等待审核。我搜了下,网上小伙伴说要等待3,5天。


3个小时后,我上去再去看,管理员给我回复了:





大致意思就是要你证明这个域名是属于你自己的。有2种方法,加一个txt类型的解析到你的域名里是最快的方法。


我的域名申请在腾讯云。登陆进去。找到域名解析设置。加进去txt类型的解析。主机记录填那个jira ticket名字,记录值是你这个ticket的链接url。





设置完了后,去回复管理员。然后继续等待。


管理员大概很快就回复了我。并通过了验证。接下来,就要捣鼓项目了。


2

要上传中央仓库,你的项目必须要符合一些规范才行。


首先pom文件是有要求的,在你的项目顶层pom文件里一定要有以下标签:


  • name


  • description


  • url


  • licenses


  • developers


  • issueManagement


  • scm



照着一个个填,我参考了一个开源项目的pom,例子如下:


<modelVersion>4.0.0</modelVersion>
<groupId>com.yomahub</groupId>
<artifactId>liteflow</artifactId>
<packaging>pom</packaging>
<version>2.2.0</version>
<name>liteflow</name>
<description>a lightweight and practical micro-process framework</description>
<url>https://github.com/bryan31/liteflow</url>
<licenses>
    <license>
        <name>MIT License</name>
        <url>https://opensource.org/licenses/MIT</url>
        <distribution>repo</distribution>
    </license>
</licenses>
<developers>
    <developer>
        <email>weenyc31@163.com</email>
        <name>bryan.zhang</name>
        <url>https://github.com/bryan31</url>
        <id>bryan31</id>
    </developer>
</developers>
<issueManagement>
    <system>Github Issue</system>
    <url>https://github.com/bryan31/liteflow/issues</url>
</issueManagement>
    <connection>scm:git@github.com:bryan31/liteflow.git</connection>
    <developerConnection>scm:git@github.com:bryan31/liteflow.git</developerConnection>
    <url>git@github.com:bryan31/liteflow.git</url>
</scm>


补全了pom的信息后,还需要补全一些maven插件,主要有:


  • maven-source-plugin


  • maven-site-plugin


  • maven-javadoc-plugin


  • maven-gpg-plugin



例子如下:


<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <encoding>UTF-8</encoding>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.18.1</version>
            <configuration>
                <skipTests>true</skipTests>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <attach>true</attach>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>jar-no-fork</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-site-plugin</artifactId>
            <version>3.7.1</version>
        </plugin>
        <!-- Javadoc -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>3.0.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <!-- Gpg Signature -->
        <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>


当然还需要加上 distributionManagement


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


你的sonatype的用户名和密码当然不能写在项目pom里,你得在maven的 setting.xml 里添加server


<server>
    <id>sonatype</id>
    <username>your username</username>
    <password>your password</password>
</server>



3

补全了pom的一些规定信息和插件后。可以试下是否可以正确无误的生成javadoc,在项目根目录下运行


mvn site

接下去就是无尽的等待,等待从中央仓库下载各种插件。这里最好搭个梯子翻墙,速度会快点。我全程用梯子,也等了40分钟,这时候可以去干点别的事情。。40分钟后,终于build成功了:





接下去就是签名了。想要上传到仓库,jar包必须被正确签名。


用gpg来进行签名,网上搜了下,windows的用户可下载gpg4win,我这里用的是mac,不能用这个软件。只能自己安装个命令行gpg工具了


brew install gpg


安装成功后,执行命令生成秘钥对:


gpg --gen-key


根据提示,填写用户名和邮件地址。然后确认。


我mac上用的是iterm2,确认后一直卡着,提示正在生成字节。然后等了很久也没有反应。我一直以为这就是正常现象,已经生成秘钥对了。只不过命令行不友好,没有告诉我。。。导致了我后面签名一直签不成功。


后来我换了一个ssh工具,electerm,才正确生成。最后是要让你输入passphase。以下是正确生成秘钥对的界面





接下去就是要利用 maven-gpg-plugin 对jar包进行签名了。在进行之前,需要在 setting.xml 文件的当前profile里加上


<properties>