斯卡拉图书馆两次进口?

cen*_*ote 22 scala intellij-idea sbt

我只是想用SBT在Intellij上的Scala中的Scala中执行一个简单的Hello World应用程序,但是即使这样……看起来也太难了。

我按照此处的说明进行操作:https : //www.cloudera.com/tutorials/setting-up-a-spark-development-environment-with-scala/.html

我曾经与Eclipse和Maven一起工作...在这里,我使用的是Intellij和SBT,所以我尽力而为,但我有点迷茫。这是我所做的:

  • 我安装了Intellij,SBT。
  • 我通过设置文件>设置>构建,执行,部署>构建工具> sbt>启动器在Intellij中配置了SBT启动器
  • 使用Java 1.8,SBT 1.3,Scala 2.13创建新项目
  • 在这一步,我无法创建Scala类,但是我注意到,如果我“重新导入sbt项目”,那么scala类将出现在要创建的新元素列表中。
  • 使用main方法创建一个对象:
    object HelloScala {
      def main(args: Array[String]): Unit = {
        println("Hello world!")
      }
    }
Run Code Online (Sandbox Code Playgroud)

当我尝试执行该main时,将导致以下错误:

错误:scalac:Scala SDK sbt中的Scala编译器类路径中的多个'scala-library * .jar'文件(scala-library-2.13.0.jar,scala-library-2.13.0.jar):org.scala-lang: scala库:2.13.0:jar

我的build.sbt:

name := "HelloScala"
version := "0.1"
scalaVersion := "2.13.0"
Run Code Online (Sandbox Code Playgroud)

我在文件>项目结构>库>编译器类路径中检查了编译器类路径:

文件:///AppData/Local/Coursier/cache/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar
文件:/// AppData / Local / Coursier /cache/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.13.0/scala-compiler-2.13.0.jar
文件:/// AppData / Local / Coursier / cache /v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.0/scala-library-2.13.0.jar
文件:/// AppData / Local / Coursier / cache / v1 /https/repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.13.0/scala-reflect-2.13.0.jar

我试图从目标结构中的其他scala-library.jar中搜索目标目录,使缓存无效,通过删除它来重新生成.idea文件夹,然后让intellij重新创建它。我什么也没发现

真的...我不明白为什么scala库被两次引用。

如果我将scala版本从2.13.0更改为2.11.0,则存在相同的问题:

错误:scalac:Scala SDK sbt中的Scala编译器类路径中的多个'scala-library * .jar'文件(scala-library-2.11.0.jar,scala-library-2.11.0.jar):org.scala-lang: scala库:2.11.0:jar

但是!如果我在build.sbt中评论scala版本:

name := "HelloScala"
version := "0.1"
//scalaVersion := "2.11.0"
Run Code Online (Sandbox Code Playgroud)

然后,如果我清除目标目录,重新导入sbt项目并尝试执行,它将成功!在目标目录中,我有一个新的scala-2.12文件夹...它从哪里来?

有关信息,我使用的是Windows 10,Intellij 2019.2,JDK 1.8,SBT 13

任何帮助都非常感谢!

小智 28

尝试这个:

外部库> [右键单击] sbt:org.scala-lang:scala-library:xxx:jar>打开库设置>项目设置>库

有一个包含类,源代码和JavaDocs的部分。单击JavaDocs并使用上面的减号将其删除。单击确定。

重新导入您的sbt项目(在右侧的sbt工具栏上)。


仍然不确定为什么会发生错误或为什么会解决此错误。

  • 谢谢,我原来的问题就是这个问题,已经解决了! (3认同)

Dao*_*Wen 5

TL; 博士

将您的 IDEA 项目恢复到 sbt 1.2.8

在 New Project 对话框中选择 sbt version 1.2.8


细节

本周末我一直在用全新安装的 IntelliJ IDEA 解决同样的问题。我尝试了不同版本的 IDE,以及上面建议的一些其他修复,但唯一似乎真正有效的解决方案是手动编辑自动生成的.idea/libraries/sbt__org_scala_lang_scala_library_2_13_0_jar.xml文件以删除重复的 JAR 条目。

sbt当我在我的 shell 中注意到这个对话框时,我终于在错误和新版本之间建立了联系:

[info] Welcome to sbt 1.3.0.
[info] Here are some highlights of this release:
[info]   - Coursier: new default library management using https://get-coursier.io
[info]   - Super shell: displays actively running tasks
[info]   - Turbo mode: makes `test` and `run` faster in interactive sessions. Try it by running `set ThisBuild / turbo := true`.
[info] See https://www.lightbend.com/blog/sbt-1.3.0-release for full release notes.
Run Code Online (Sandbox Code Playgroud)

由于SBT 1.3.0介绍Coursier,并在IDEA生成的XML文件中的重复的JAR条目都存储在一个Coursier缓存目录,我还以为恢复到SBT 1.2.8可能会解决问题。

果然,我在使用 sbt 1.3.0 时只得到“Multiple 'scala-library*.jar' files”错误。我多次重新创建我的项目并且在使用 sbt 1.2.8 时没有看到错误。


小智 0

如果您的 中没有 scalaVersion 属性build.sbtsbt将使用中指定的版本project/build.sbt