在 IntelliJ 中运行项目时遇到此错误:
"C:\Program Files\Java\jdk1.8.0_212\bin\java.exe" ...
Connected to the target VM, address: '127.0.0.1:57229', transport: 'socket'
Exception in thread "main" java.lang.IncompatibleClassChangeError: Implementing class
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:1106)
at my.org.MyClass.<init>(MyClass.scala:2)
在 MyClass 中我只有:
import org.apache.spark.sql.SparkSession
SparkSession.builder().master("local[*]").appName("my app").getOrCreate()
这些是我在 pom.xml 中的版本(使用 Maven 和 IntelliJ):
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.12.0</version>
</dependency>
我尝试在命令行中运行它,得到了相同的结果。
我已确认我的 java 版本是 64 位(Windows 11):
java -version
java version "1.8.0_212"
Java(TM) SE Runtime Environment (build 1.8.0_212-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.212-b10, mixed mode)
还有什么我可以尝试的吗?
这是由于(我猜)SparkSession 中传递的某些类的定义不一致/冲突造成的。在某一时刻,它被定义(或称为)为
class
。在其他地方,相同的 FQ 名称指的是 interface
。这可能在您的代码中,也可能在 Spark 代码中。不幸的是,异常消息并没有告诉我们定义不一致的类的名称。
我建议您确保在编译代码和运行代码时使用相同的 Spark JAR 文件。另外,请确保您没有混合不同版本的 Spark JAR。最后,请确保您已重新编译所有代码,特别是如果您最近更改了 Spark 版本。