【问题标题】:scala-library imported twice?scala库导入两次?
【发布时间】:2020-01-09 19:23:56
【问题描述】:

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

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

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

  • 我安装了 Intellij,SBT。
  • 我通过设置 File > Settings > Build, Execution, Deployment > Build tools > sbt > Launcher 在 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!")
      }
    }

当我尝试执行该 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-library:2.13.0:jar

我的 build.sbt :

name := "HelloScala"
version := "0.1"
scalaVersion := "2.13.0"

我在 File > Project Structure > Libraries > Compiler classpath 中检查了 Compiler 类路径:

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

我试图删除目标目录,使缓存无效,通过删除它重新生成.idea文件夹并让intellij重新创建它,我从项目结构中的其他scala-library.jar中搜索。我什么都没找到……

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

如果我将 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-library:2.11.0:jar

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

name := "HelloScala"
version := "0.1"
//scalaVersion := "2.11.0"

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

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

非常感谢任何帮助!

【问题讨论】:

  • 这是 IntelliJ 的一些奇怪问题。在过去的 1 周里,我也见过几次本应该可以正常工作的项目。它似乎是随机出现的,并且在从 2.12.9 -> 2.12.8 -> 2.12.7 -> 2.12.8 等随机切换 scala 版本几次后通常会消失。
  • 你能在 IntelliJ 中从 sbt shell 编译/运行你的应用程序吗:compile, run 而不是 Ctrl+Shift+F9/Ctrl+Shift+F10? (当您将项目导入 IntelliJ 时,有复选框“使用 sbt shell:用于导入,用于构建”,这会将 Ctrl+Shift+F9/Ctrl+Shift+F10 重定向到 sbt shell。)
  • 这个错误在 IntelliJ Scala 插件的问题跟踪器上有一个未解决的问题:youtrack.jetbrains.com/issue/SCL-16208
  • IntelliJ Scala 插件已经更新,新版本(2019.2.28)修复了这个bug。

标签: scala intellij-idea sbt


【解决方案1】:

试试这个:

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

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

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


仍然不确定为什么会发生错误或为什么会修复它。

【讨论】:

  • 谢谢,我在原来的问题中遇到了问题,这解决了!
  • 这使我的项目至少可以构建,但会导致测试中出现 ClassDefNotFound :/
【解决方案2】:

TL;DR

将您的 IDEA 项目恢复到 sbt 1.2.8


详情

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

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

[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.

自从 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 时没有看到错误。

【讨论】:

  • 找到这个解决方法后,我去报告错误,但发现有人在两周前已经打开了一个问题:youtrack.jetbrains.com/issue/SCL-16208
  • 有效,但 intellij 不断将库重新插入。
  • @ManishPatel - IntelliJ Scala 插件已更新,此错误已在新版本 (2019.2.28) 中修复。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多