如何配置sbt的build.sbt使得编译时将依赖包也打包进去
简单描述下我的环境
ubuntu14.04 64bit
IterlliJ IEDA 14
scala 2.10.4
sbt 0.13.8
spark 1.5.1
java 1.7_79
kafka 0.8.2.2
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文档,没看懂怎么配置。
希望大家能帮忙指点下如何配置。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
首先
问题解决了
,就是sbt-assembly插件的配置问题。这个文档自己前两次读表示看不懂意思
。过2天又仔细看了一遍大致明白了,敢动手操作了。assembly插件的目的是:
即将项目依赖的大文件也打包到生成的jar中。我的报错
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/streaming/kafka/KafkaUtils$
就是因为包含KafkaUtil
的jar包没打包到jar中。配置使用插件
下面是我的scala项目目录结构:
插件的配置取决于sbt的版本,详情见这里
我的是
sbt 0.13.8
,所以在project/assembly.sbt添加(assembly.sbt)要自己创建:配置assembly的参数
参数在项目根目录下新建
assembly.sbt
。直接引入插件就可以用
编译了,但是由于我的sbt下载了大量的依赖包,在编译的时候遇到了编译包冲突的问题。这个时候需要配置
Merge Strategy
(合并策略)。详情见。讲的不是特别详细,希望能帮到大家。
https://stackoverflow.com/que...