2020-12-21
< view all postsScala有多种编译方式,使用Maven和Gradle都是可以的,实际上大型项目用这两者的会比较多。但是我们有时候可能会遇到使用sbt编译的项目,这时候要从源代码编译它,还是有一些地方需要注意的。因为sbt的报错提示并不友好,不熟悉的话需要花上较长的时间才能解决。
首先,Scala目前对高版本的java似乎并不兼容,在遇到类似
cannot resolve symbol xxxx(junit之类)
或者
class file '/modules/java.base/java/lang/String.class' is broken
或者
scala packages cannot be represented as uri
这几种编译错误时,首先确认一下java版本。这里比较坑的地方是,sbt的配置文件中并不体现对java版本的要求,所以到底用哪个版本,必须要依赖外部的文档和社区才能知道了。建议是首先尝试java8,通过配置全局的%JAVA_HOME%去设置。
关于java还有一个问题,就是需要使用Oracle的jdk,我在windows上使用openjdk1.8是有问题的,会报
java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
错误,而Oracle jdk1.8则正常。
除了java的版本,还会涉及到两个版本:sbt版本和scala版本。在配置文件中,sbt版本可以改成和本地一致的,而配置里的scala版本不要修改。sbt的版本在build.properties文件里,而Scala版本在build.sbt文件里。sbt会自动去下载对应版本的scala。如果遇到类似
xxx is not a member of package scala
的报错,就可能是scala版本不对。
题外话,sbt的设计思想是每个项目有一个独立的scala环境,所以每次打开一个新项目都需要较长时间的下载。这可能也是它不流行的一个原因。