跳过正文
  1. 博客/
  2. 后端/
  3. 框架/

如何在Ubuntu上发布Scala Jar包到Maven中央仓库

7 分钟· ·
后端 框架 Java
作者
Allen
一个强大、轻量级的 Hugo 主题。
目录

由于网上的教程大多数是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 <[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.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>[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文件的插件就简单了,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自动匹配关键词,使用统计方法来对输出最匹配路径,项目展示的Demo在http://ahocorasick.zhanglun.me/ ,随意输入地点能够迅速匹配出相关城市,比如打入“樟树”能够找到“江西省-宜春市-樟树市”,假如你服务器内存够的话还可以根据村委会名字来寻找到你的地点,而且搜索的速度只和你的地点名长度有关,不会随着关键词的增长而变慢

引用
#

SNAPSHOT

相关文章

Java的char类型到底几个字节
6 分钟
后端 框架 Java
从例子里解Spring IOC
7 分钟
后端 框架 Java SpringBoot
Learning Scala From Java
3 分钟
后端 框架 Java
如何让你的Python更快
11 分钟
后端 框架 Python
千万级数据处理小结
8 分钟
后端 框架 大数据
从关系角度来看XPath
5 分钟
后端 框架 Python