明明包已经引入了,但是还是报错NoClassDefFoundError
❓❓❓
这个问题要分析一下java运行的机制了
首先java代码编译成class字节码文件
然后JVM解释字节码文件运行程序
总的来说就是分为编译阶段和运行阶段
我是如何管理这些jar包的呢? 通过maven,如下
org.apache.spark
spark-core_${scala.compat.version}
2.3.2
provided
引入的时候有个**scope属性,**问题关键就出在了这里
首先说一下scope都与哪些吧
- compile 不写的话默认就是这个,编译运行测试都起作用
- provided 期望JDK,容器或者使用者提供,如servlet.jar,打包的时候不会打包进去,最后运行的时候环境会提供jar包
- runtime 只在运行时使用,例如jdbc驱动,运行和测试起作用
- test 只有在测试编译和测试运行阶段可用。
- system 引用本地的jar包,maven不会在仓库中查找它
问题原因:
☀️☀️☀️
idea不会在main方法运行的时候依赖provide范围的jar包,也就是编译可以通过,但是运行不会通过
☀️☀️☀️
方法一:(推荐)
-
方法二:
将对于依赖的scope标签去掉,但是不推荐这么做,这样会使得打包出来的文件非常大



