首先需要安装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各个打版本间不兼容,这可能也是这样做的原因。
Scala安装完成后,可以直接输入scala在命令行运行,做原型验证非常方便
如果使用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
具体使用参见官方文档
plugin中搜索Scala,安装插件,如下
参考Scala官方文档,查看maven最新Scala编译插件。
命令行使用maven时,选择对应插件GroupId/ArtifactId和Version生成项目骨架
mvn archetype:generate
使用IDEA时,如下点击[Add Archetype…]按钮添加对应骨架
然后创建对应项目,可以删除测试等部分代码,最简单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工程中,添加对应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编译插件可以编译识别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>
通常打包有两种常用方法,就不再赘述
<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>
<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>
演示源码下载链接
也可参考文档
原创,转载请注明来自