写代码久了,一直在用别人提供的第三方包依赖,有时是不是也会想着有一天别人能够使用自己的开源出去的项目。让我们从最简单的开始,提取一个小项目,将其开源并发布到中央仓库让大伙可以直接通过配置 Maven 依赖来使用。
寻找项目方案
我相信应该是有不少人都有过开源并发布自己项目的想法的,但是其中最大的一个问题可能就是不知道该写点什么了、不知道有什么东西可以开源出去让别人使用的。没有关系,这边带你慢慢来提取出一个可行的项目方案。
开源项目的种类多种多样,来源更是不用多说,我们这里不整这些这么广泛复杂的项目,我们就是想体验下将自己的项目构建发布到 Maven 中央仓库的快感。那么其实有一个特别容易的项目可以立马自己就着手设计的:实现 API。
目前很多大平台都有开放自己的 API 接口,不少都是 HTTP 协议的接口,但是并不是所有的都有提供对应的 Java 客户端,那么这就是我们的机会啦,我们可以封装这些接口,提供对应的客户端,让其他用户可以开箱即用。目前一些开放接口的平台有:
可以参考:国内外 API 总结。选一个 GitHub 上还没人实现的,或者觉得实现的不好的,或者自己感兴趣的就可以了。
GitHub 开源、版本管理
版本号命名规则
项目选好后直接实现就好了。不过这肯定是一个持续的过程,过程中会有代码变更,会有版本变更,那么我们如何定义这个项目的版本号呢?这里给出一个版本号命名规则。
版本号的格式为一般遵循 A.B.C(又称 Major.Minor.Patch)这样的定义,其含义如下:
- A:主版本号,当实现有大改动,其兼容性发生变化时,A 需要递增。
- B:次版本号,当增加新功能,但兼容性不变时,B 需要递增。
- C:修订号,当进行了 Bug 修复时,C 需要递增。
除了版本号之外还会有一些修饰的词,比如:
- Alpha:内部版本
- Beta:测试版
- Rc:即将作为正式版发布
- Lts:长期维护
参考:Semantic Versioning 2.0.0
GitHub 项目版本控制
个人简单项目的话,这边推荐直接使用的 GitHub 的 Tag 来进行控制,每当我发布一个版本的 Jar 到 Maven 仓库时,我就对该稳定版本进行 Tag 设置。这样用户可以在 Tag 中找到对应的版本设置和说明。
设置 Tag:
1
| git tag -a [version] -m [commit message]
|
推送到服务器:
1
| git push origin [version]
|
打包、发布到中央仓库
代码完成实现并开源到 GitHub 后,进行 Maven 发布管理。发布到中央仓库的话,我们需要使用 Sonatype 为开源项目提供托管服务。可以通过它发布快照或是稳定版到 Maven 中央仓库。我们只要注册一个 Sonatype 的 JIRA 账号、创建一个 Jira 任务,然后添加对应的 pom.xml 配置。
OSSRH 发布准备
1. 注册账号:注册地址
2. 创建 Jira 工单
这里有两个注意点:
- 填写 groupId 的时候,如果需要对应的域名真实且属于你,不过我们可以使用 GitHub 的 com.github.username 或 io.github.username。
- 当你发布了你的第一个 release 版本的时候,记得要在这个任务上回复 comment 告知 OSSRH。
- 工单进程可以看工单的状态和对应的 comment 信息,按照他们的说明走即可,工单状态变为 RESOLVED 时可提交 Jar。
生成密钥
创建流程如下:
文件 -> 新建密钥对 -> 创建个人 OpenPGP 密钥对 -> 填写个人信息 -> 输入密码密码 -> 上传到目录服务
Maven 项目调整
1. 修改 pom.xml
添加项目已经开发者信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <licenses> <license> <name>The Apache Software License, Version 2.0</name> <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url> </license> </licenses> <scm> <url>https://github.com/vioao/wechat-sdk.git</url> <connection>scm:https://github.com/vioao/wechat-sdk.git</connection> </scm> <developers> <developer> <name>vioao</name> <email>vioao91@gmail.com</email> <url>http://blog.vioao.site</url> </developer>
|
添加打包构建相关信息
1 2 3 4 5 6 7 8 9 10 11
| <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>${maven-resources-plugin.version}</version> </plugin> </plugins> </build>
|
添加发布相关配置信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| <profiles> <profile> <id>release</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>${maven-source-plugin.version}</version> <executions> <execution> <phase>package</phase> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <version>${maven-javadoc-plugin.version}</version> <executions> <execution> <phase>package</phase> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.sonatype.plugins</groupId> <artifactId>nexus-staging-maven-plugin</artifactId> <version>${nexus-staging-maven-plugin.version}</version> <extensions>true</extensions> <configuration> <serverId>oss</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>${maven-release-plugin.version}</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-gpg-plugin</artifactId> <version>${maven-gpg-plugin.version}</version> <executions> <execution> <id>sign-artifacts</id> <phase>verify</phase> <goals> <goal>sign</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>
<distributionManagement> <snapshotRepository> <id>oss</id> <url>https://oss.sonatype.org/content/repositories/snapshots/</url> </snapshotRepository> <repository> <id>oss</id> <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url> </repository> </distributionManagement>
|
添加 settings.xml 配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <servers> <server> <id>oss</id> <username> Jira 用户名</username> <password> Jira 密码</password> </server> </servers>
<profiles> <profile> <id>oss</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <gpg.executable>gpg</gpg.executable> <gpg.passphrase>${ 上一步的密钥密码 }</gpg.passphrase> </properties> </profile> </profiles>
|
发布
发布 Snapshot 版本:
1. 修改 pom.xml 的 version 添加 -SNAPSHOT 后缀
1
| <version>1.2.0-SNAPSHOT</version>
|
2. mvn clean deploy
3. 发布后可以上该地址查找你发布的 Jar
发布 Release 版本:
1. 修改 pom.xml 的 version 移除 -SNAPSHOT 后缀,或手动设置版本号 mvn versions:set -DnewVersion=1.2.0
1
| <version>1.2.0</version>
|
2. mvn clean deploy -P release
3. 正式版发布后就可以在中央仓库查找到了
参考:
本文首发于 GitChat,在 Maven 中央仓库发布自己的开源项目