scala 安装和配置

  • 使用Scala原因
  • 安装和配置
    • shell
    • sbt
    • idea
    • maven
  • Scala和Java混合
    • Scala工程中添加Java模块
    • scala和java混合编译问题
    • 统一打包
  • 演示程序下载

使用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,安装插件,如下

scala 安装和配置_第1张图片

maven

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

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

mvn archetype:generate

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

scala 安装和配置_第2张图片

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

  <dependencies>
    <dependency>
      <groupId>org.scala-langgroupId>
      <artifactId>scala-libraryartifactId>
      <version>${scala.version}version>
    dependency>
  dependencies>

  <build>
    <plugins>
      <plugin>
        
        <groupId>net.alchim31.mavengroupId>
        <artifactId>scala-maven-pluginartifactId>
        <version>3.3.2version>
        <executions>
          <execution>
            <goals>
              <goal>compilegoal>
              <goal>testCompilegoal>
            goals>
            <configuration>
              <args>
                <arg>-dependencyfilearg>
                <arg>${project.build.directory}/.scala_dependenciesarg>
              args>
            configuration>
          execution>
        executions>
      plugin>
    plugins>
  build>

Scala和Java混合

Scala工程中添加Java模块

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

scala 安装和配置_第3张图片

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

scala 安装和配置_第4张图片
scala 安装和配置_第5张图片

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.mavengroupId>
<artifactId>scala-maven-pluginartifactId>
<executions>
    <execution>
    <id>scala-compile-firstid>
    <phase>process-resourcesphase>
    <goals>
        <goal>add-sourcegoal>
        <goal>compilegoal>
    goals>
    execution>
    <execution>
    <id>scala-test-compileid>
    <phase>process-test-resourcesphase>
    <goals>
        <goal>testCompilegoal>
    goals>
    execution>
executions>
plugin>

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

<plugin>
<groupId>net.alchim31.mavengroupId>
<artifactId>scala-maven-pluginartifactId>
<executions>
    <execution>
    <id>scala-compileid>
    <goals>
        <goal>compilegoal>
    goals>
    execution>
    <execution>
    <id>scala-test-compileid>
    <goals>
        <goal>testCompilegoal>
    goals>
    execution>
executions>
plugin>
<plugin>
<artifactId>maven-compiler-pluginartifactId>
<executions>
    <execution>
    <id>default-compileid>
    <phase>nonephase>
    execution>
    <execution>
    <id>default-testCompileid>
    <phase>nonephase>
    execution>
executions>
plugin>

统一打包

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

  • maven-assembly-plugin
<plugin>
<artifactId>maven-assembly-pluginartifactId>
<version>2.5.3version>
<configuration>
    <descriptorRefs>
    <descriptorRef>jar-with-dependenciesdescriptorRef>
    descriptorRefs>
    <archive>
    <manifest>
        <mainClass>org.jimwen.AppmainClass>
    manifest>
    archive>
configuration>
<executions>
    <execution>
    <phase>packagephase>
    <goals>
        <goal>singlegoal>
    goals>
    execution>
executions>
plugin>
  • maven-shade-plugin
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-shade-pluginartifactId>
<version>3.2.1version>
<executions>
    <execution>
    <phase>packagephase>
    <goals>
        <goal>shadegoal>
    goals>
    <configuration>
        <transformers>
        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <mainClass>helloworld.MytestmainClass>
        transformer>
        transformers>
    configuration>
    execution>
executions>
plugin>

演示程序下载

演示源码下载链接

也可参考文档

原创,转载请注明来自

  • 博客https://blog.csdn.net/wenzhou1219
  • 个人网站http://jimwen.net/

你可能感兴趣的:(Scala)