spark 源码编译中碰到的一个问题

-source 1.6 中不支持 diamond 运算符

Posted by mzl on March 27, 2018

编译 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个问题:

  1. 直接运行 mvn -DskipTests clean package, 报错。
  2. 运行源码的命令: ./build/mvn -DskipTests clean package, 下载 zinc-0.3.9.tgz 和 scala-2.11.8.tgz 失败
  3. 手动下载 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 报错,感觉很奇怪。因为明明在 里配置 过 source 和 target,不应该有错呀。

今天发现,问题出在 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>