scala 安装和配置
使用Scala原因API足够优雅简单,快速上手,函数式特别适合处理数据,代表Kafka和Spark和基于JVM的hadoop生态结合好,可以混合java速度快,静态编译,相对其他JVM速度快安装和配置首先需要安装Java 8(添加JAVA_HOME到bin目录和设置CLASSPATH)Scala下载位置,mac和windows可以直接使用安装包,也可以解压安装配置和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,安装插件,如下
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目录,
然后如下,File->Project Structure将目录java指定为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>
演示程序下载
演示源码下载链接
也可参考文档
原创,转载请注明来自
更多推荐
所有评论(0)