在尝试将自己的项目推送到maven仓库时,遇到并解决了很多坑点,特此来记一下笔记
需要提前声明一下,推送maven仓库,官方有很多中方法,比如使用build插件(maven plugin, gradle plugin),API等等,我这次是直接手手动在页面上上传的。
问题:
maven publish 官网:maven
前提
首先,需要登陆这个官网。可以直接用 github 账号,这样后面会省一些事情(namespace)
必要准备:
- 你的项目build后的jar
- 你的项目build后的源码(source)jar
- 你的项目的java doc
- 你的项目maven build后的pom,并且pom中需要尽可能详细的填写一些个人信息以及描述
- 以上每一份文件,都需要附带对应的一份md5,sha1,gpg加密文件
- 将以上所有文件打包在一个zip中。文件结构需要与 groupId -> artifactId -> version 的结构相吻合
步骤
- 登陆maven官网 (建议使用github账号直登)
- 打开右上角个人信息里面的 View Deploy

- 此时会看到页面上有两个框,一个NameSpace,一个Deployment。其中,Namespace是类似域名的东西,相当于你需要有一个自己的专属域名。如果你是使用github账号登陆的话,那么这里会自动给你一个validate的github的io域名,可以直接使用。如果没有,那需要自己申请域名然后来这里验证

- 在Deployments页面,就可以看到你当前所有的deploy了
- 点击右上角的Publish Deployment

会出现一个form表单。填写完标题,description,再加上刚才打包的zip提交上去即可完成。 - deployment会经过validating的阶段。等validate完成后,就可以对当前的deployment进行发布(publish)了
一些坑点
主要坑点其实都集中在打zip包中。
zip包中文件需要按照groupId -> artifactId -> version 的结构来放置。
比如我的项目groupId是 com.baidu, artifactId 是 search_demo, version 是 0.1.0,那么,首先需要建立一个com文件夹,下面再来一个baidu文件夹,然后再来一个search_demo文件夹,最后再来个0.1.0文件夹,最后把之前提到的所有东西放在这个version文件夹中。然后,对最外面的com文件夹进行打zip包,最后可能得到一个com.zip,关于md5 sha1加密文件,没什么好说的,我是自己写了段代码来执行的:
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
43public static void main(String[] args) throws NoSuchAlgorithmException, IOException {
encryptFile("path");
}
public static void encryptFile(String fileName) throws NoSuchAlgorithmException, IOException {
// Encrypt file
MessageDigest MD5 = MessageDigest.getInstance("MD5");
MessageDigest SHA_1 = MessageDigest.getInstance("SHA-1");
File file = new File(fileName);
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File f : files) {
if (f.isFile()) {
String name = f.getName();
byte[] bytes = Files.readAllBytes(f.toPath());
MD5.update(bytes);
byte[] digest = MD5.digest();
String newFileName = fileName + File.separator + "md5" + File.separator + name + ".md5";
String md5Content = byteArrToHexStr(digest);
Files.write(new File(newFileName).toPath(), md5Content.getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING);
SHA_1.update(bytes);
digest = SHA_1.digest();
newFileName = fileName + File.separator + "sha1" + File.separator + name + ".sha1";
String sha1Content = byteArrToHexStr(digest);
Files.write(new File(newFileName).toPath(), sha1Content.getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING);
}
}
}
}
private static String byteArrToHexStr(byte[] digest) {
StringBuilder sb = new StringBuilder();
for (byte b : digest) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}最大坑点,gpg加密
首先说一句,如果是在windows系统操作,不要用下载的gpg图形化操作界面。这个界面虽然很直观,但是加密出来的文件后缀是GPG格式的,然而maven那边要求的是ASC格式的。因为我对于这个加密不太了解,所以不太清楚区别以及如何互相转化,反证用图形化界面弄出来的maven不会识别的
关于GPG,可以在这里下载。
下载后,进入我们存放上传文件的文件夹,然后打开命令行,执行下列命令
1 | gpg --version # 查看版本 |
然后,我们就会得到一个gpg签名过的文件: myfile.java.asc。把这个文件放在zip包与源码同级目录下即可。
至此,我们的打包工作完成,zip包中所有的东西均已准备完成。
但还有一件事,就是我们刚才生成的密钥对,目前是只有我们知道pub公钥的,别人没有的,因此,别人拿到你的签名文件也无法识别,无法解密,这会导致你上传的project在maven验证失败。
因此,我们还需要进行一步操作,那就是上传我们自己的公钥(publicKey)
1 | 首先,查询我们密钥的公钥 |
上传完毕公钥完毕后,我们就可以去maven那边来上传我们的zip并且publish我们的项目了。
最后,看到这个状态即表示上传成功,okkk