【問題描述】
說一件很神奇的事情,今天在使用SparkStreaming進行Scala編程的時候,發生瞭如下問題:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/streaming/StreamingContext
at com.xzw.sparkstreaming.KafkaToHBase$.main(KafkaToHBase.scala:27)
at com.xzw.sparkstreaming.KafkaToHBase.main(KafkaToHBase.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.spark.streaming.StreamingContext
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
... 2 more
從報錯來看是沒有發現那個類,這就奇怪了,代碼中明明有這個類,而且還沒有任何報錯:
小編的pom.xml中也導入了相應的依賴:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>2.4.0-cdh6.3.1</version>
<scope>provided</scope>
</dependency>
【解決方案】
問題出現在:<scope>provided</scope>這裏,這表示編譯和測試時有效,並且該jar包在運行時由服務器提供。所以出錯了,解決辦法就簡單了,直接在pom.xml文件中去掉這一行即可。
在此也列舉出附加依賴的集中弄範圍,僅供參考:
compile:默認值,適用於所有階段(表明該jar包在編譯、運行以及測試中路徑俊可見),並且會隨着項目直接發佈。
provided:編譯和測試時有效,並且該jar包在運行時由服務器提供。
runtime:運行時使用,對測試和運行有效。
test:只在測試時使用,在編譯和運行時不起作用,發佈項目時沒有作用。
system:不依賴maven倉庫解析,需要提供依賴的顯式的置頂jar包路徑。對項目的移植來說是不方便的。