Contents
  1. 1. 第一步:选择用什么打包
  2. 2. 第二步:在中央仓库上面新建项目
  3. 3. 第三步: 上传配置
  4. 4. 第四部:发布配置
  5. 5. 总结
  6. 6. 引用

由于网上的教程大多数是Windows下的,而且都是介绍怎么打包JavaJar包,关于Scala相关的比较少,因此我踩了不少坑才成功的把包发布到Maven中央仓库,你们可以才中央仓库里面搜到我的包

如何你想直接使用ctrl-c + ctrl-v那么你直接去我的github上的最小化打包版本pom.xml里面的build给复制下来就可以了(前提是你已经把gpg给配置好了)。

PS:因为这篇主要是介绍步骤所以就用中文写了

第一步:选择用什么打包

由于Scala既可以选择用SBT打包,又可以用maven打包,所以你要先选择使用什么来打包,一开始我使用SBT来尝试进行打包上传,但是一直卡在没法配置好SBTgpg插件(这个主要是对你的文件进行签名),我甚至到Github去看别人的项目是怎么配置的,但是我搜到的Scala项目大部分都没有选择把包发到sonatype去,有的是自己搭建中央仓库有的是根本没有提供中央仓库下载的。虽然我很想用SBTScala打包(毕竟是专门给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包发到pypisonatype需要你对你上传的文件都签名以验证安全,怎么签名呢,借助一个开源的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 <zhanglun.me@gmail.com>
sub   rsa2048/985EE474 2019-01-12 [E]

pub   rsa2048/D0516023 2019-01-12 [SC]
uid         [ultimate] zhanglun <zhanglun.me@gmail.com>
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.xmlsettings/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>git@github.com: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文件的插件就简单了,JavaScala都可以使用这个插件来生成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下面看到你构件,你只要选择最后一个,然后点击closeclose结束之后在点击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自动匹配关键词,使用统计方法来对输出最匹配路径,项目展示的Demohttp://ahocorasick.zhanglun.me/ ,随意输入地点能够迅速匹配出相关城市,比如打入“樟树”能够找到“江西省-宜春市-樟树市”,假如你服务器内存够的话还可以根据村委会名字来寻找到你的地点,而且搜索的速度只和你的地点名长度有关,不会随着关键词的增长而变慢

引用

SNAPSHOT

Contents
  1. 1. 第一步:选择用什么打包
  2. 2. 第二步:在中央仓库上面新建项目
  3. 3. 第三步: 上传配置
  4. 4. 第四部:发布配置
  5. 5. 总结
  6. 6. 引用