【问题标题】:How to get IntelliJ to recognize imports in Scala script?如何让 IntelliJ 识别 Scala 脚本中的导入?
【发布时间】:2018-06-08 17:34:55
【问题描述】:

我无法让 IntelliJ 识别我的 Scala 脚本中的 Ammonite 导入。这是一个新功能,报告here,其中也有说明。我按照说明在 IntelliJ 中启动了一个新的 sbt 项目进行尝试,但它不起作用。

我在项目的“外部库”中看到了 Ammonite 依赖项,我在 build.sbt 中指定了该依赖项: libraryDependencies += "com.lihaoyi" %% "ammonite-ops" % "1.0.3" libraryDependencies += "com.lihaoyi" % "ammonite" % "1.0.3" cross CrossVersion.full

(非常简单的)项目似乎已成功构建。我还指定了 Scala 工作表文件应被视为“Always Ammonite”。

所有这些,但 IDE 显示的脚本如下:

我还需要做什么才能使其正常工作?

版本:

  • Java 1.8.0
  • Scala 2.12.4
  • sbt 1.0.3
  • IntelliJ CE 2017.3.2
  • IntelliJ scala 插件 2017.3.11

【问题讨论】:

  • 我注意到的一件事是传递依赖没有被拉入范围。例如,如果我拉入 circe 库并让 IntelliJ 下载它,我仍然无法解析 cats 库的导入(circe 依赖于)

标签: scala intellij-idea sbt ammonite


【解决方案1】:

我在使用 IntelliJ 时遇到了类似的问题,所以让我分享一下我是如何让它工作的。

我的版本:

  • IntelliJ Ultimate 2017.3.2(所以基本上和你的版本一样)
  • IntelliJ Scala 插件 2017.3.11
  • Kubuntu,因此可能需要调整下面的键盘快捷键

现在,我从与您相同的代码开始,更新版本的依赖项0.6.7

现在已经按下第一行旁边的绿色箭头来运行 Ammonite。下载依赖项并显示链接。 这是 IntelliJ 识别新 jar 可用的强制性步骤

同样在这个阶段,Intellij 向我显示了一个小弹出窗口,其中包含我可以导入 jar 的信息。 我没有使用它

为了让 IntelliJ 识别导入,我在损坏的 com.lihaoyi::scalatags:0.6.7 依赖项上按 Alt+Enter Show Intention Actions 并使用 从 jar 创建库...

这使 Intellij 识别库、导入并且可以开始给你提示。

该库已添加到项目的依赖项中(Ctrl+Alt+Shift+s)。您还可以在下面看到来自其他文件的依赖项。

【讨论】:

  • 您忘了提及将表单从 0.6.0 更改为 0.6.7 :) Maven 存储库中缺少该版本。此外,您还需要先运行脚本以获取amm 以下载poms,然后它将从jar 创建lib。似乎这不是插件的工作方式,但是嘿,它正在工作!
  • 感谢@einnocent,我根据您的反馈更新了答案,以供后代使用。
【解决方案2】:

我在 IntelliJ 中遇到了类似的问题,并且似乎正在解决 IntelliJ 中的错误。

我的版本:

  • IntelliJ Ultimate 2018.2.4
  • IntelliJ Scala 插件 2018.2.11
  • 操作系统:Windows
  • Scala:2.12.6(目前 Ammonite 当前版本 1.2.1 尚未针对 Scala 2.12.7 发布,请参阅 #879 及以下版本)

没有 IntelliJ 项目

如果我只打开 .sc 文件而不打开项目,则会收到提示

  • 项目 JDK 未定义
  • 模块中没有 Scala SDK
  • 通知:“将所有 Ammonite 标准依赖项添加到项目中?”

通知很快消失。如果我在修复 JDK 之前单击“添加”按钮,则导入不起作用,并且添加按钮消失了。修复 jdk 和 scala,然后在 eventlog 中找到“Add all Ammonite...”并单击“add”,然后就可以了。

但是,下次我重新打开 IntelliJ 时,所有设置更改都会丢失。

使用 IntelliJ 项目

  • 创建新项目 Scala sbt 项目,基于默认目录的项目。
  • 我将我的 sc 文件放在某处

现在 IntelliJ 会记住 sc 文件的设置。我什至可以直接从 IntelliJ 的 explorer/total commands 中打开 sc 文件,不过我更喜欢在 IntelliJ 中配置“打开方式...”。

不允许 IntelliJ 通过通知自动导入 sbt 项目设置,这似乎破坏了库导入,我需要重新创建项目才能恢复。

Scala 版本问题

库自动导入“添加”按钮仅适用于发布 Ammonite 的 Scala 版本。见Maven Central Ammonite releases。在撰写本文时,尚未针对 scala-2.12.7 发布 Ammonite 1.2.1,尽管当前不稳定的 ammonite 版本已发布。见Ammonite bug-report #879。添加按钮只是默默地失败,这很糟糕,尤其是。对于像我这样的新手。

自动生成的 sbt 构建文件如下所示

name := "Ammonite"
version := "0.1"
scalaVersion := "2.12.6"

这是成功加载库后在项目设置中的样子:

这里是使它编译的依赖项。请注意,“SBT:”依赖项是通过 SBT 文件自动生成的(似乎),其他是由 scala 插件 ammonite 通知功能添加的库

当 IntelliJ 无法加载 ammonite 库时,上述库列表为空。

带有 SBT 的 IntelliJ(因为 IntelliJ 丢失了菊石进口,并且用于 $ivy)

IntelliJ 似乎经常丢失其菊石进口。如果我有 SBT 设置来提供导入,那么这并不重要。此外,IntelliJ $ivy 对 ammonite 的支持仅在文件已经本地缓存在 ivy-cache 中时才有效,并且在我的 Windows 上运行 Ammonite 脚本会将文件缓存在不同的位置,这意味着 IntelliJ $ivy 导入有效地不起作用。因此,我使用 SBT 来设置我在脚本中使用的导入的总和。

我的 build.sbt

scalaVersion := "2.12.7"
// https://mvnrepository.com/artifact/com.lihaoyi/ammonite
libraryDependencies += "com.lihaoyi" % ("ammonite_" + scalaVersion) % "1.2.1-16-48ce533"

// Extra example dependency
libraryDependencies += "org.jsoup" % "jsoup" % "1.11.3"

【讨论】:

    【解决方案3】:

    如果您主要使用 Scala 2.13 和 SBT 1.3+ 以及 Coursier 库管理,我认为 IntelliJ IDEA 不会在本地缓存中找到依赖项。我们需要通过将依赖项下载到 Ivy 缓存来帮助 IntelliJ IDEA。

    我通过以下方式解决了这个问题:

    1. 在具有所需依赖项的某处创建ivy.xml,例如:

      <ivy-module version="1.0">
          <info organisation="test" module="download-deps"/>
          <dependencies>
              <dependency org="com.softwaremill.sttp.client" name="core_2.12" rev="2.1.1"/>
              <dependency org="com.softwaremill.sttp.client" name="okhttp-backend_2.12" rev="2.1.1"/>
              <dependency org="com.github.tototoshi" name="scala-csv_2.12" rev="1.3.6"/>
          </dependencies>
      </ivy-module>
      

      注意,我在这里指定了 Scala 2.12。

    2. 从已创建ivy.xml 的目录中运行ivy -refresh

    3. 然后我们需要从 IntelliJ IDEA 中红色导入的上下文操作中“从 jar 创建库...”。

    就是这样!

    【讨论】:

    • 当我单独打开我的工作表目录时,这对我有用,而不是在我的 Mill 项目中。
    【解决方案4】:

    您需要将 .sc 文件与 ammonite 相关联。

    在你的设置中,它应该是这样的 (解决方案取自here

    我还建议阅读以下blog post(向下滚动到Ammonite 脚本支持)以确保您满足所有需要

    【讨论】:

    • 谢谢,但我已经这样做了:“我还指定了 Scala 工作表文件应被视为“始终 Ammonite”。另外,在问题中,我链接到您提到的博客文章。另外,在您链接到的解决方案中,我几天前在那里发表了评论:)
    猜你喜欢
    • 2019-05-25
    • 1970-01-01
    • 2020-12-17
    • 2019-10-27
    • 2018-07-18
    • 1970-01-01
    • 2021-02-20
    • 2011-07-14
    • 1970-01-01
    相关资源
    最近更新 更多