编译 spark 源码
学习 spark 源码有段时间了,从一开始完全不懂 scala,靠抄 spark 源码学习,到近段时间 开始分析 spark 源码,一直没有成功编译过 spark 源码。
我下载的spark 源码, artifactId 是 spark-parent_2.11, version: 2.1.3-SNAPSHOT. 本地 jdk 为 1.7, maven 为 3.5, scala 为 2.11.8
今天突然想跑一下源码,按步骤调试源码,结果一直编译不能过,一共碰到3个问题:
- 直接运行 mvn -DskipTests clean package, 报错。
- 运行源码的命令: ./build/mvn -DskipTests clean package, 下载 zinc-0.3.9.tgz 和 scala-2.11.8.tgz 失败
- 手动下载 zinc 和 scala 后,运行源码命令: ./build/mvn -DskipTests clean package, 报错: -source 1.6 中不支持 diamond 运算符.
当然,今天最后都解决了,解决方法如下。
问题1:直接运行 mvn
这个问题,可能是编译 spark 依赖 zinc 和 scala,本地有 scala,而无 zinc, 同时和问题3有关造成。 后来去官网找,官网提供的建议是,使用源码提供的命令:./build/mvn -DskipTests clean package.
问题2:下载 zinc 和 scala 失败
使用 curl 下载这两个压缩包失败,主要是公司的网络限制,导致下载速度过慢造成,当然也跟两个压缩包是国外的站点有关。 最后 zinc-0.3.9.tgz 从国外的站点手动下载,而 scala-2.11.8.tgz 从网站手动下载 下来,放到源码的 build 目录下。
问题3:报错:-source 1.6 中不支持 diamond 运算符
这个问题比较明确,原因是 jdk1.7 才支持 java 的 <> 运算符的自动类型推断,1.6 及以前的版本不支持:解释.
但奇怪的是,明明源码的 pom.xml 里配置的是 1.7 呀,而报错的 maven 插件 scala-maven-plugin 里的scala-compile-first 报错,感觉很奇怪。因为明明在
今天发现,问题出在 maven 的 settings.xml 配置文件里,里面定义了 jdk 版本为 1.6,compile 的 source 和 target 均为 1.6.
最后看了 scala-maven-plugin 插件的官方文档,发现有配置 source 和 target 的地方,添加上去, 再运行命令就可以编译通过了。
<!-- spark-parent_2.11 的 pom.xml -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<id>eclipse-add-source</id>
<goals>
<goal>add-source</goal>
</goals>
</execution>
<execution>
<id>scala-compile-first</id>
<phase>process-resources</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>scala-test-compile-first</id>
<phase>process-test-resources</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
<execution>
<id>attach-scaladocs</id>
<phase>verify</phase>
<goals>
<goal>doc-jar</goal>
</goals>
</execution>
</executions>
<configuration>
<scalaVersion>${scala.version}</scalaVersion>
<recompileMode>incremental</recompileMode>
<useZincServer>true</useZincServer>
<!-- 添加了下面两行 -->
<source>${java.version}</source>
<target>${java.version}</target>
<args>
<arg>-unchecked</arg>
<arg>-deprecation</arg>
<arg>-feature</arg>
</args>
<jvmArgs>
<jvmArg>-Xms1024m</jvmArg>
<jvmArg>-Xmx1024m</jvmArg>
<jvmArg>-XX:PermSize=${PermGen}</jvmArg>
<jvmArg>-XX:MaxPermSize=${MaxPermGen}</jvmArg>
<jvmArg>-XX:ReservedCodeCacheSize=${CodeCacheSize}</jvmArg>
</jvmArgs>
<javacArgs>
<javacArg>-source</javacArg>
<javacArg>${java.version}</javacArg>
<javacArg>-target</javacArg>
<javacArg>${java.version}</javacArg>
<javacArg>-Xlint:all,-serial,-path</javacArg>
</javacArgs>
</configuration>
</plugin>