首页 > 如何配置sbt的build.sbt使得编译时将依赖包也打包进去

如何配置sbt的build.sbt使得编译时将依赖包也打包进去

简单描述下我的环境

problem

将编写好的scala代码编译后,放到sprak上执行,下面是执行的脚本:

$SPARK_HOME/bin/spark-submit --class com.linker.demo.utils.UserClickCountAnalytics ./target/scala-2.10/sbtdemo1_2.10-1.0.jar

kafka、spark、zookeeper都没有问题,正确启动。报错:

15/10/30 09:53:11 WARN Utils: Your hostname, geek resolves to a loopback address: 127.0.1.1; using 192.168.10.135 instead (on interface wlan0)
15/10/30 09:53:11 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address


15/10/30 09:53:12 WARN MetricsSystem: Using default name DAGScheduler for source because spark.app.id is not set.

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/streaming/kafka/KafkaUtils$
    at com.linker.demo.utils.UserClickCountAnalytics$.main(UserClickCountAnalytics.scala:86)
    at com.linker.demo.utils.UserClickCountAnalytics.main(UserClickCountAnalytics.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:672)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:180)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:205)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:120)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.spark.streaming.kafka.KafkaUtils$
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 11 more

需要自己配置sbt,使编译时把KafkaUtil这个类所在的包编译进去。自己看了sbt文档,没看懂怎么配置。

希望大家能帮忙指点下如何配置。


首先问题解决了,就是sbt-assembly插件的配置问题。这个文档自己前两次读表示看不懂意思。过2天又仔细看了一遍大致明白了,敢动手操作了。

assembly插件的目的是:

The goal is simple: Create a fat JAR of your project with all of its dependencies.

即将项目依赖的大文件也打包到生成的jar中。我的报错Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/streaming/kafka/KafkaUtils$就是因为包含KafkaUtil的jar包没打包到jar中。

配置使用插件

下面是我的scala项目目录结构:

.
├── assembly.sbt
├── build.sbt
├── project
├── README.md
├── run-assembly.sh
├── run.sh
├── src
└── target

插件的配置取决于sbt的版本,详情见这里

我的是sbt 0.13.8,所以在project/assembly.sbt添加(assembly.sbt)要自己创建:

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.0")

配置assembly的参数

参数在项目根目录下新建assembly.sbt

直接引入插件就可以用

sbt assembly

编译了,但是由于我的sbt下载了大量的依赖包,在编译的时候遇到了编译包冲突的问题。这个时候需要配置Merge Strategy(合并策略)。详情见。

讲的不是特别详细,希望能帮到大家。

【热门文章】
【热门文章】