由于网上的教程大多数是
Windows
下的,而且都是介绍怎么打包Java
的Jar
包,关于Scala
相关的比较少,因此我踩了不少坑才成功的把包发布到Maven
中央仓库,你们可以才中央仓库里面搜到我的包
如何你想直接使用ctrl-c
+ ctrl-v
那么你直接去我的github上的最小化打包版本把pom.xml
里面的build
给复制下来就可以了(前提是你已经把gpg
给配置好了)。
PS:因为这篇主要是介绍步骤所以就用中文写了
第一步:选择用什么打包 #
由于Scala
既可以选择用SBT
打包,又可以用maven
打包,所以你要先选择使用什么来打包,一开始我使用SBT
来尝试进行打包上传,但是一直卡在没法配置好SBT
的gpg
插件(这个主要是对你的文件进行签名),我甚至到Github
去看别人的项目是怎么配置的,但是我搜到的Scala
项目大部分都没有选择把包发到sonatype
去,有的是自己搭建中央仓库有的是根本没有提供中央仓库下载的。虽然我很想用SBT
把Scala
打包(毕竟是专门给Scala
用的),但是那个插件 实在是卡的死死的,而且文档太少了,官网上的SBT似乎一直是用的0.13.5+,但是我用的是1.2+,在选择低版本还是选择换一种打包方式面前我选择听从大牛的意见,选择使用maven
进行对Scala
打包(毕竟Scala
杀手级应用Spark
也是用的maven
进行打包)
而且SBT
有一个特别困扰我的地方,虽然我一直用阿里源,但是SBT
更新依赖的速度实在是太慢了,无论是新建项目还是增加第三方包,相比maven
它的速度都特别慢
当然我做不到不代表大家做不到,如果有人能够搞定用Maven
打包,记得在Github
上发个issue
告诉我
第二步:在中央仓库上面新建项目 #
为了将包发到maven
中央库,我们得借助【sonatype]4来帮我们上传,首先你得去上面注册一个用户
相比于Python
发包,Java
有一个group
的概念,也就是说每个包都属于不同的组织,比如说Java的核心包java.lang
也可以看做是一个组织,在Pypi
发包你只要不重名就行,但是在maven
中央库发包,你可以重名但是不能重复组织名,由于我有个zhanglun.me
的域名,所以我就新建了一个me.zhanglun.ahocorasick
组织,你也可以理解组织就是一个网址,我新建了一个ahocorasick.zhanglun.me
的网址,由于名字我们没法规定重名,但是网址可以,所以在sonatype
上新建一个项目后你得要有帮你审核一下这个域名是否是你的(如果你使用com.github.xxx
来作为域名的话那就不要审核了)
随便找篇教程新建完项目,等你的项目变成Resolved
,接下来我们就来配置上传的秘钥
第三步: 上传配置 #
相比于Python
直接将打包好的egg包发到pypi
,sonatype
需要你对你上传的文件都签名以验证安全,怎么签名呢,借助一个开源的GnuPG,我们只要自己制作一个秘钥,然后上传到秘钥服务器,然后我们就可以用这个秘钥来对我们的文件进行签名(会产生一个.asc
文件,里面是签名值)
所以关键就是把这个秘钥产生并且上传到秘钥服务器,在Ubuntu
上有两个版本的GnuPG
,一个是1.0版一个是2.0版,我试过使用1.0版但是没法传到秘钥服务器上面,所以大家还是最好使用2.0来生成秘钥和上传到服务器。
首先生成key,全部选择默认进行,填上你的个人信息,最后就会生成一个key
gpg2 --gen-key
里面会让你输入一个口令,你记住就行,等你上传的时候会弹出一个框让你输入这个口令
生成完后使用下面命令列出key
gpg2 --list-key
/home/zhanglun/.gnupg/pubring.gpg
---------------------------------
pub rsa2048/47DC71B6 2019-01-12 [SC]
uid [ultimate] zhanglun <[email protected]>
sub rsa2048/985EE474 2019-01-12 [E]
pub rsa2048/D0516023 2019-01-12 [SC]
uid [ultimate] zhanglun <[email protected]>
sub rsa2048/EE34357C 2019-01-12 [E]
我生成好几个没有关系,随便找到一行pub ,例如第三行的,47DC71B6
就是你得公钥
使用下面命令把秘钥发到秘钥服务器(keyserver你可以在网上随便找一个,只有能用就会同步到全球)
gpg2 --keyserver pool.sks-keyservers.net --send-keys 47DC71B6
接下来我们就要配置maven
来使用这个秘钥,首先在pom.xml里面加上这个插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>${version.maven.plugin.gpg}</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
它能自动帮你使用gpg
来进行签名(默认使用gpg
待会我们得改成gpg2
,否则会报错),这里要注意一点假如你计算机上面有很多秘钥,如果你不指定那个秘钥来进行签名那也会报错,我们要在~/.m2/settings.xml
上配置一下(注意不是你项目目录下面)
在settings.xml
的settings/profiles
节点下面下面加上配置
<settings>
<profiles>
....
<profile>
<id>oss</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<gpg.executable>gpg2</gpg.executable>
<gpg.keyname>47DC71B6</gpg.keyname>
</properties>
</profile>
.....
</profiles>
</settings>
id
就是这个配置的名字,gpg.keyname
就是秘钥的名字,gpg.executable
就是选择使用gpg2
(默认使用1.0版本也就是gpg
)
配置完这个你可以mvn install
一下,你可以看到生成的jar
都已经有一个.asc
文件,接下来就是配置sonatype
的账号密码,在pom.xml
配置文件里面加上一个
<distributionManagement>
<snapshotRepository>
<id>oss</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<site>
<id>master</id>
<name>Efficient longest keyword string matching</name>
<url>[email protected]:mrzhangboss/ahocorasick.git</url>
</site>
<repository>
<id>oss</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
在这里我们指定了用oss
这个作为上传账号,接下啦我们在~/.m2/settings.xml
加上sonatype
的用户名和密码
<settings>
<servers>
....
<server>
<id>oss</id>
<username>your usename</username>
<password>your password</password>
</server>
....
</servers>
</settings>
在settings/servers
节点下加入一个server
节点,填上你的账号密码就ok了,在这里你就可以使用mvn clean deploy
进行上传了。
第四部:发布配置 #
前面我们已经能够上传,但是我们现在上传的时候假如我们的版本号上面有SNAPSHOT
这个的话,我们是不能把他发布出去的,带有那个代表那个只是实验性质,虽然我们能够把它上传上去但是不能在maven
中央仓库里面看到。
当然这个只是一个要求,为了能够上传你还必须满足两个条件,第一个要把源文件上传上去,第二个就是你的文档上传上去,而且sonatype
采用了一个工作流的概念,你要上传中央库必须要进过 上传release-> 关闭release -> 发布release,当然所以的一切都可以用插件来完成,接下啦我们先介绍两个很重要的插件,打包源文件和打包文档。
由于我们要打包Scala
项目,所以第一步就是把Scala
编译成Java
字节码,这一步我们得借助scala-maven-plugin
来完成
我们在在build
里面加入下面的插件
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>${version.scala.maven.plugin}</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>doc-jar</goal>
</goals>
</execution>
</executions>
</plugin>
它带了连个命令一个是compile + testCompile
(编译),一个是attach-javadocs
(打包scaladoc
),加入这个插件后你可以试一下mvn install
它会帮你把javadoc.jar
生成出来。
添加source
文件的插件就简单了,Java
和Scala
都可以使用这个插件来生成jar
文件(只是简单的复制文件而已)
加入下面这个插件就能实现打包源文件了
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
加上这两个插件你就可以发布release
版本了(第一次你得要跟工作人员comment一下才能上传到中央库,以后就不要了)。现在你就可以只要执行mvn clean deploy
就能在管理页面的Staging Repositories下面看到你构件,你只要选择最后一个,然后点击close
,close
结束之后在点击release
就能在maven
中央库看到你的开源包了,是不是很激动
但是每次都要登录上面去点击很繁琐,所以你可以安装下面的插件帮你直接发布,不需要登录网站
加上下面的插件就能自动帮你发布了
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>${version.maven.plugin.nexus.staging}</version>
<extensions>true</extensions>
<configuration>
<serverId>oss</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
PS:我在项目里面把这个插件注释掉了,你们可以把注释取消
总结 #
这篇博文主要是把发布涉及到的库以及知识点简单的介绍了一下,其实发布并不难,很多时候我们只是卡在某一步上,只要我们知道原理,就能把钉子拔掉,顺利上路,在这里顺便推广一下我的项目,这个项目基于Aho-corasick
自动匹配关键词,使用统计方法来对输出最匹配路径,项目展示的Demo在http://ahocorasick.zhanglun.me/ ,随意输入地点能够迅速匹配出相关城市,比如打入“樟树”能够找到“江西省-宜春市-樟树市”,假如你服务器内存够的话还可以根据村委会名字来寻找到你的地点,而且搜索的速度只和你的地点名长度有关,不会随着关键词的增长而变慢