Apache spark-sql 带来了janino 和commons-compiler 所需的版本。如果您遇到此错误,则说明您的 pom(或父 pom)中的其他内容覆盖了该版本。虽然您可以在 pom 中显式设置 janino 和 commons-compiler 版本以匹配其他答案中建议的 spark 带来的内容,但这将使长期维护更加困难,因为维护人员需要记住每次都更新这些显式版本你更新火花。相反,我推荐对我有用的方法:
通过运行找出导致错误版本 janino 的原因:
mvn dependency:tree #-Dverbose may be helpful
从有问题的依赖项中排除 janino 和 commons-compiler。在我的例子中,它是一个内部的 hadoop 测试框架:
<dependency>
<groupId>org.my.client.pkg</groupId>
<artifactId>hadoop-testing-framework</artifactId>
<version>${some.version}</version>
<exclusions>
<!-- We want only and exactly Spark's janino version -->
<exclusion>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
</exclusion>
<exclusion>
<groupId>org.codehaus.janino</groupId>
<artifactId>commons-compiler</artifactId>
</exclusion>
</exclusions>
</dependency>
重新运行 mvn dependency:tree 并对覆盖 spark 的 janino 版本的任何其他依赖项重复上述过程,直到您的 janino 和 commons-compiler 版本来自您的 spark-sql 依赖项,如我的(缩写)所示mvn dependency:tree 输出如下:
[INFO] +- org.apache.spark:spark-sql_2.11:jar:2.4.0.cloudera1:provided
[INFO] | +- org.apache.spark:spark-catalyst_2.11:jar:2.4.0.cloudera1:provided
[INFO] | | +- org.codehaus.janino:janino:jar:3.0.9:compile
[INFO] | | +- org.codehaus.janino:commons-compiler:jar:3.0.9:compile
注意,如果您看到类似的内容:
[INFO] +- org.apache.spark:spark-sql_2.11:jar:2.4.0.cloudera1:provided
[INFO] | +- org.apache.spark:spark-catalyst_2.11:jar:2.4.0.cloudera1:provided
[INFO] | | +- org.codehaus.janino:janino:jar:2.6.1:compile <-- Note old version
[INFO] | | +- org.codehaus.janino:commons-compiler:jar:3.0.9:compile
那么其他人仍在覆盖 spark 的 janino 版本。就我而言,父 pom 明确引入了 v2.6.1。从父 pom 中删除该依赖块解决了我的问题。这就是-Dverbose 标志可能提供帮助的地方。
最后一点,至少我的 spark 版本不能容忍 janino 或 commons-compiler 版本的任何变化。它必须正是 spark 带来的补丁(假设 codehaus 遵循 semver)。