sbt速度过慢解决

安装sbt

Linux版本:Deepin15.1

sbt:0.13.11


下载sbt-launch.jar,然后将源改为国内源(aliyun),我选择将sbt安装在/usr/local/sbt中(随意)。

1
2
3
4
$sudo mkdir /usr/local/sbt
$sudo chown -R hadoop /usr/local/sbt #我的用户名是 hadoop.
$cd /usr/local/sbt
$mkdir sbtlaunch #用来放sbt-launch.jar

1.下载sbt-launch.jar,并存放至/usr/local/sbt/sbtlaunch

1
2
$cd /usr/local/sbt/sbtlaunch
$unzip -q ./sbt-launch.jar #解压

2.需要修改其中的./sbt/sbt.boot.properties文件,将[repositories]处修改为如下内容

因为国内众所周知的原因,连接国外https会慢,所以这里都换成http

1
2
$cd /usr/local/sbt/sbtlaunch
$vim ./sbt/sbt.boot.properties

修改为:

1
2
3
4
5
6
7
8
[repositories]
local
aliyun-nexus: http://maven.aliyun.com/nexus/content/groups/public/
repox-maven: http://repox.gtan.com:8078/
repox-ivy: http://repox.gtan.com:8078/ , [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
#jcenter: https://jcenter.bintray.com/
maven-central

还有/usr/local/sbt/sbtlaunch中的

这些文件内容也最好改一下。改成如下图所示:http://dl.bintray.com/sbt/sbt-plugin-releases/

还有在~/.sbt/repositrories文件中(没有就建一个)

1
$vim ~/.sbt/repositrories

也添加:

1
2
3
4
[repositories]
local
repox-maven: http://repox.gtan.com:8078/
repox-ivy: http://repox.gtan.com:8078/ , [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]

上面所有这些是为了换个下载仓库。

3.删除原来的sbt-launch.文件,然后重新打包

1
2
$rm ./sbt-launch.jar #删除旧的
$jar -cfM ./sbt-launch.jar . #重新打一个jar

4.在/usr/local/sbt目录下创建sbt脚本文件并赋予可执行权限,来执行sbt-launch.jar

1
2
$cd /usr/lcoal/sbt
$vim ./sbt #新建sbt脚本

添加如下内容:

1
2
SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
java $SBT_OPTS -jar /usr/local/sbt/sbtlaunch/sbt-launch.jar "$@"

5.保存后,为./sbt增加可执行权限:

1
$chmod u+x ./sbt

6.最后检验sbt是否可用

1
$./sbt sbt-version

改了镜像速度应该会上去一些,在国内墙环境下主要还是看运气,希望大家测试一下。

然后按照书上新建项目,进行打包运行测试,或者照下面的Helloworld项目测试。

7.创建hello world项目,并编译,打包,运行。

1
2
3
4
5
$mkdir ~/simpleapp
$mkdir ~/simpleapp/src
$mkdir ~/simpleapp/src/main
$mkdir ~/simpleapp/src/main/scala
$vim ~/simpleapp/src/main/scala/SimpleApp.scala #内容如下

SimpleApp.Scala

1
2
3
4
5
object SimpleApp{
def main(args: Array[String]){
println("Hello World!")
}
}

7.2 创建simple.sbt

1
2
$cd ~/simpleapp
$vim ./simple.sbt #内容如下

simple.sbt内容如下:每一行之间空一行。scala version 和 Spark版本信息根据所安装的spark所写。笔者安装的是spark2.1.0和scala 2.11.8。

1
2
3
4
5
6
7
8
name :="Simple Project"
version :="1.0"
scalaVersion := "2.11.8"
libraryDependencies +="org.apache.spark" %% "spark-core" % "2.1.0"

7.3配置环境变量,编译和运行。

注意:

打包时带参数-Dsbt.override.build.repos=true

这个参数是为了让sbt用你设置的仓库下载

1
$sbt -Dsbt.override.build.repos=true package


或者直接配置路径,这样就不用每次带参数了:

在/usr/local/sbt下的sbt文件里,SBT_OPTS=””里面加上-Dsbt.override.build.repos=true ,这样就不用带参数了,直接sbt package打包就好

建议选择直接配置路径。


下面给出完整步骤:

1
2
3
4
5
6
7
$vim ~/.bashrc #在开头添加如下内容:export PATH=/usr/local/sbt:$PATH
$source ~/.bashrc #使之生效
$cd ~/simpleapp
$sbt compile #编译,可以省略这步 直接打包
$sbt package #打包 前提是你已经将-Dsbt.override.build.repos=true这个参数配了
$/usr/local/spark/bin/spark-submit --class "SimpleApp" ~/simpleapp/target/scala-2.11/simple-project_2.11-1.0.jar #将生成的jar包通过spark-summit提交到spark中执行

这样下载依赖包会非常快,一堆[SUCESS]过去,没改之前依赖包一直卡着下不动根本无法打包,改了之后就很快了很快就打包编译了。

下面给出我的截图(这个截图没有截出下载依赖包的界面。。。):

是不是速度和之前比快了很多!


还有一种方法 搭建repox

from github:

从源码编译打包
repox暂时没有发布二进制包,只能从源码编译。

1
2
3
4
5
$ git clone https://github.com/Centaur/repox.git
$ cd repox/src/main/resources/admin
$ bower install
$ cd ../../../..
$ sbt assembly

上述中的bower依赖于Node.js和npm,因此需要先安装node.js。sbt将会在target/Scala-2.11/目录下生成 repox-assembly-$VERSION.jar

运行

1
$ java -Xmx512m -jar repox-assembly-$VERSION.jar

repox监听所有网络接口上的8078端口。repox缓存的文件保存在 ~/.repox/storage 目录下,配置数据保存在 ~/.repox/journal 目录下,日志文件是 ~/.repox/repox.log 因此如果要备份数据,只需要备份 ~/.repox 目录即可。
以下假设repox部署在192.168.0.120这台服务器上。

配置

repox使用akka-persistence来保存配置信息(这当然不是必须的,repox用这个场景demo了akka-persistence的用法)。 从浏览器连接 http://192.168.0.120:8078/admin/admin.html 通过web界面对repox进行配置。从这里开始

登录密码

Repox web admin 默认密码为zhimakaimen.

sbt 配置

为了充分发挥repox的优势,在开发者本机上需要做两件事。

1.配置 ~/.sbt/repositories 文件(如果文件还未创建过,则创建它),除了本地缓存外,仅使用repox作为仓库。文件内容如下:

1
2
3
4
[repositories]
local
repox-maven: http://192.168.0.120:8078/
repox-ivy: http://192.168.0.120:8078/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]

请注意,repox-maven 与 repox-ivy 的次序是重要的,请将 repox-maven 写在 repox-ivy 的前面。

2.配置sbt,使它仅使用~/.sbt/repositories中的内容。

如果你使用命令行,请在sbt命令行参数中添加 -Dsbt.override.build.repos=true 。例如我的sbt shell脚本的内容是这样的:

1
2
3
#!/bin/sh
export SBT_OPTS="-Dsbt.override.build.repos=true"
exec java -Xmx512M ${SBT_OPTS} -jar $(dirname "$0")/sbt-launch.jar "$@"

Renkai注:个人试了下只做第一步不做第二步似乎也是蛮好用的


Author:张琼

打赏:

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器