Scala和Java混合开发和编译

2020-11-17

< view all posts

Flink和Spark这类大数据库中有大量的源码是用Scala编写的,我们对这些库进行二次开发、构建定制化的版本,需要对其中的Scala代码进行编译。

Flink以及Spark使用的官方包管理工具是Maven(Kafka是Gradle),下面介绍基于Maven的开发和编译方法。

首先要在IDEA里安装Scala插件。IDEA在联网环境里是可以在软件内下载的,不过我们开发环境是和外网隔离的,所以需要手动下载。可以在这个地址下载。在IDEA里找到File->Settings->Plugins,选择Install Plugin From Disk。

还需要安装Scala的SDK。如果在联网环境IDEA也是可以自动下载的,我们手动进入这个地址,注意选择“Download the Scala binaries for windows”(不是下载sbt)。之后进行安装。

在IDEA里创建项目时,和一般的Java项目一样,还是选择创建空的Maven项目(不要用模板archetype-scala)。之后在/src/main下面新建一个scala目录,和java目录同级。这时候右键scala目录,是没有Scala Class这个选项的,但是没有关系,先选择New->File新建一个文件,文件名里把后缀.scala写上,IDEA就会自动识别。这时候会提示没有SDK,点击添加,选择刚刚安装好的SDK就可以了。

这时候编译还是不行的,需要在pom文件里加入scala的依赖和插件。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
     http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>scala.learn</groupId>
<artifactId>pomtest</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
    <scala.version>2.13.1</scala.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-library</artifactId>
        <version>${scala.version}</version>
    </dependency>

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.scala-tools</groupId>
            <artifactId>maven-scala-plugin</artifactId>
            <version>2.15.2</version>
            <executions>

                <execution>
                    <id>compile</id>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                    <phase>compile</phase>
                </execution>
                <execution>
                    <id>test-compile</id>
                    <goals>
                        <goal>testCompile</goal>
                    </goals>
                    <phase>test-compile</phase>
                </execution>
                <execution>
                    <phase>process-resources</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

</project>

这样就可以用Maven编译Scala代码了。

补充一点,网上也有很多资料是使用sbt进行依赖管理的,如果要使用sbt进行编译,需要在~/.sbt目录内新建一个repositories文件。文件中加入镜像源的地址,例如:

[repositories]
    public: https://.../public/
    repo2: https://...

之后启动sbt时,在命令后加入override的参数:

sbt -Dsbt.override.build.repos=true