使用Scala原因

  • API足够优雅简单,快速上手,函数式特别适合处理数据,代表Kafka和Spark
  • 和基于JVM的hadoop生态结合好,可以混合java
  • 速度快,静态编译,相对其他JVM速度快

安装和配置

首先需要安装Java 8(添加JAVA_HOME到bin目录和设置CLASSPATH)

Scala下载位置,mac和windows可以直接使用安装包,也可以解压安装

配置和Java类似,需要配置SCALA_HOME到bin目录和设置CLASSPATH,这里使用安装包安装Java,brew安装Scala,参考配置如下:

export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home"
export SCALA_HOME="/usr/local/Cellar/scala/2.12.8"
export PATH=$PATH:$JAVA_HOME/bin:$SCALA_HOME/bin

export CLASSPATH=".:$JAVA_HOME/lib:$SCALA_HOME/libexec/lib"

注意,和之前其他编程语言全局安装一次SDK有所不同,Scala更加倾向每个项目安装一个Scala,Scala各个打版本间不兼容,这可能也是这样做的原因。

shell

Scala安装完成后,可以直接输入scala在命令行运行,做原型验证非常方便

sbt

如果使用sbt管理项目,可以在~/.sbt目录下,新建或修改repositories文件, 配置如下国内镜像:

[repositories]
local
aliyun: http://maven.aliyun.com/nexus/content/groups/public
jcenter: http://jcenter.bintray.com
typesafe: http://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly

具体使用参见官方文档

idea

plugin中搜索Scala,安装插件,如下

插件安装

maven

参考Scala官方文档,查看maven最新Scala编译插件

命令行使用maven时,选择对应插件GroupId/ArtifactId和Version生成项目骨架

mvn archetype:generate

使用IDEA时,如下点击[Add Archetype…]按钮添加对应骨架

添加骨架

然后创建对应项目,可以删除测试等部分代码,最简单pom如下:

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

  <build>
    <plugins>
      <plugin>
        <!-- see http://davidb.github.com/scala-maven-plugin -->
        <groupId>net.alchim31.maven</groupId>
        <artifactId>scala-maven-plugin</artifactId>
        <version>3.3.2</version>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>testCompile</goal>
            </goals>
            <configuration>
              <args>
                <arg>-dependencyfile</arg>
                <arg>${project.build.directory}/.scala_dependencies</arg>
              </args>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

Scala和Java混合

Scala工程中添加Java模块

如下,先在上述scala工程中,添加对应src/main/java目录,

java和scala目录

然后如下,File->Project Structure将目录java指定为Source

点击项目结构
添加source

scala编译器会识别这个目录并编译,类似的java中添加scala工程步骤类似

分别编写Java代码和Scala代码如下,这里Scala调用Java代码,mvn clean compile没问题,调用成功

// Java代码
package helloworld;

//import org.jimwen.App;

public class Mytest {
    public static void JavaSayHello(){
        System.out.println("Hello from Java");
    }

    public static void main(String[] args) {
        JavaSayHello();
        //App.ScalaSayHello();
    }
}
//Scala 代码
package org.jimwen

import helloworld.Mytest

object App {

  def main(args : Array[String]) {
    ScalaSayHello()
    Mytest.JavaSayHello()
  }

  def ScalaSayHello(): Unit ={
    println("Hello from Scala")
  }

}

然后将上述java代码中注释打开,mvn clean compile可以看到报错,即在java代码中识别不了scala代码,这是为什么呢?

[ERROR] /Mytest.java:[4,18] 程序包org.jimwen不存在
[ERROR] /Mytest.java:[13,9] 找不到符号
[ERROR]   符号:   变量 App
[ERROR]   位置: 类 helloworld.Mytest

scala和java混合编译问题

上述问题涉及到了scala和java混合编译的问题:

Scala编译插件可以编译识别Scala和Java代码,而Java编译插件只能编译识别Java代码,因此出现Scala引用Java没问题而Java引用Scala有问题的现象。实际混合项目中编译了两次,第一次Scala插件编译所有代码,没问题;第二次Java插件编译Java相关代码,如果不引用Scala代码也没问题。

最简单方式是如下指定编译命令,这样先用scala插件编译scala代码成.class,然乎java插件再编译,引用类便不会有问题了。

maven scala:compile compile

但是如上使用命令行太麻烦,为了解决上诉问题,通常参考官方文档的做法,如下

<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<executions>
    <execution>
    <id>scala-compile-first</id>
    <phase>process-resources</phase>
    <goals>
        <goal>add-source</goal>
        <goal>compile</goal>
    </goals>
    </execution>
    <execution>
    <id>scala-test-compile</id>
    <phase>process-test-resources</phase>
    <goals>
        <goal>testCompile</goal>
    </goals>
    </execution>
</executions>
</plugin>

但是如上所述,会导致多次编译和其他一些问题(参考这里),最好的办法就是只使用scala插件编译,保证统一。

<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<executions>
    <execution>
    <id>scala-compile</id>
    <goals>
        <goal>compile</goal>
    </goals>
    </execution>
    <execution>
    <id>scala-test-compile</id>
    <goals>
        <goal>testCompile</goal>
    </goals>
    </execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
    <execution>
    <id>default-compile</id>
    <phase>none</phase>
    </execution>
    <execution>
    <id>default-testCompile</id>
    <phase>none</phase>
    </execution>
</executions>
</plugin>

统一打包

通常打包有两种常用方法,就不再赘述

  • maven-assembly-plugin
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.3</version>
<configuration>
    <descriptorRefs>
    <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
    <archive>
    <manifest>
        <mainClass>org.jimwen.App</mainClass>
    </manifest>
    </archive>
</configuration>
<executions>
    <execution>
    <phase>package</phase>
    <goals>
        <goal>single</goal>
    </goals>
    </execution>
</executions>
</plugin>
  • maven-shade-plugin
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
    <execution>
    <phase>package</phase>
    <goals>
        <goal>shade</goal>
    </goals>
    <configuration>
        <transformers>
        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <mainClass>helloworld.Mytest</mainClass>
        </transformer>
        </transformers>
    </configuration>
    </execution>
</executions>
</plugin>

演示程序下载

演示源码下载链接

也可参考文档

原创,转载请注明来自

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐