编译Spark时attach-javadoc任务报找不到符号错误如何解决
目标与问题
编译最小化版本Spark以缩减容器体积,业务仅需使用spark-sql和pyspark组件,当前使用的Dockerfile配置如下:
FROM openjdk:20-bullseye RUN apt-get update && \ apt-get install git -y && \ git clone --depth=1 --branch=v3.3.0 https://github.com/apache/spark /root/spark && \ cd /root/spark && \ ./dev/make-distribution.sh --tgz --pip -pl :spark-core_2.12,:spark-sql_2.12 -P '!test-java-home,kubernetes,hadoop-3,apache-release' -DskipTests
编译过程抛出如下错误,后续伴随大量「cannot find symbol(找不到符号)」类报错:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:3.1.1:jar (attach-javadocs) on project spark-core_2.12: MavenReportException: Error while generating Javadoc: [ERROR] Exit code: 1 - /root/spark/core/src/main/java/org/apache/spark/SparkFirehoseListener.java:36: error: cannot find symbol [ERROR] public class SparkFirehoseListener implements SparkListenerInterface { [ERROR] ^ [ERROR] symbol: class SparkListenerInterface [ERROR] /root/spark/core/src/main/java/org/apache/spark/SparkFirehoseListener.java:38: error: cannot find symbol [ERROR] public void onEvent(SparkListenerEvent event) { } ...
咨询问题
- 如何修复上述报错,让编译流程正常完成?
- 如何通过纯命令行参数关闭文档生成步骤,不修改项目文件,规避自动化改文件的风险?
解决方案
报错修复方法
报错由两个原因共同导致,对应修复操作如下:
- 替换JDK基础镜像版本:Spark 3.3.0官方仅兼容JDK 8/11/17,当前使用的JDK 20属于未适配版本,javadoc插件的源码解析逻辑和低版本存在差异,会触发类识别异常。直接把基础镜像换成
openjdk:17-jdk-bullseye即可,不要用高于17的JDK版本编译该版本Spark。 - 补充Maven模块编译参数:使用
-pl参数指定仅编译spark-core、spark-sql两个模块时,没有加-am(即--also-make)参数,Maven不会自动编译指定模块依赖的上游同项目模块,SparkListenerInterface这类类属于同项目模块的编译产物,未提前编译时就会报找不到符号。在-pl参数后追加-am即可解决该问题。
关闭文档生成的命令行参数
不需要修改任何项目内的pom文件或配置,直接在编译命令末尾追加Maven官方支持的跳过参数-Dmaven.javadoc.skip=true,就能完全禁用javadoc插件的执行,跳过所有文档生成步骤。
修正后可直接使用的Dockerfile
FROM openjdk:17-jdk-bullseye RUN apt-get update && \ apt-get install -y git python3 python3-pip && \ git clone --depth=1 --branch=v3.3.0 https://github.com/apache/spark /root/spark && \ cd /root/spark && \ ./dev/make-distribution.sh --tgz --pip -pl :spark-core_2.12,:spark-sql_2.12 -am -P '!test-java-home,kubernetes,hadoop-3,apache-release' -DskipTests -Dmaven.javadoc.skip=true
注:因为加了
--pip参数编译pyspark,需要提前在镜像里安装python3和pip,否则编译会失败,上面的命令已经提前补了对应依赖。
内容的提问来源于stack exchange,提问作者FailureGod
相关产品推荐
相关产品推荐

