如何让IntelliJ识别Scala脚本中的导入?

时间:2017-12-28 06:50:39

标签: scala intellij-idea sbt ammonite

我无法让IntelliJ在我的Scala脚本中识别Ammonite导入。这是一项新功能,报告here,其中还有说明。我按照说明操作,然后在IntelliJ中启动了一个新的sbt项目来试用它,但是它没有工作。

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

(非常简单)项目似乎成功构建。我还指出Scala工作表文件应该被视为"始终是Ammonite"。

所有这些,但IDE显示的脚本如下: enter image description here

我还需要做些什么才能让它发挥作用?

版本:

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

4 个答案:

答案 0 :(得分:7)

我有类似IntelliJ的问题,所以让我分享一下我是如何工作的。

我的版本:

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

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

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

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

要让IntelliJ识别导入,我按 Alt + 输入 显示意图操作对已损坏的com.lihaoyi::scalatags:0.6.7依赖项进行操作从jar创建库... Create library from jar...

这使得Intellij识别出库,导入并且它可以开始给你提示。 enter image description here

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

答案 1 :(得分:1)

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

我的版本:

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

没有IntelliJ项目

如果我只是打开.sc文件而不打开项目,那么我会提示

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

该通知很快消失。如果在修复JDK之前单击“添加”按钮,则导入将不起作用,并且添加按钮也消失了。修复jdk和scala,然后在事件日志中找到“添加所有Ammonite ...”,然后在其中单击“添加”,即可使用。

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

使用IntelliJ Project

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

现在,IntelliJ可以记住sc文件的设置。我什至可以将IntelliJ的'open with ...'配置为打开后,甚至可以直接从IntelliJ中的资源管理器/总指挥官打开sc文件。

不允许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"

库成功加载后,这是项目设置中的外观:

enter image description here

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

添加的库。

enter image description here

当IntelliJ无法加载炸药库时,以上库列表为空。

带有SBT的IntelliJ(因为IntelliJ丢失了am石进口,价格为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"

答案 2 :(得分:1)

我认为,如果您主要通过Coursier库管理来使用Scala 2.13和SBT 1.3+,则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 -refresh从目录运行ivy.xml

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

仅此而已!

答案 3 :(得分:0)

你需要将.sc文件与菊石相关联。

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

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