如何将 IntelliJ 与 Play Framework 和 Scala 一起使用

Posted

技术标签:

【中文标题】如何将 IntelliJ 与 Play Framework 和 Scala 一起使用【英文标题】:How to use IntelliJ with Play Framework and Scala 【发布时间】:2013-04-14 16:22:39 【问题描述】:

我正在尝试将 IntelliJ 与播放框架 2.11 应用程序一起使用。

我为 IntelliJ 安装了 Play Framework 2 插件和 Scala 插件。

我创建了一个 Play 应用程序。我一直在努力在 IntelliJ 中编写和运行 Specs 2 测试。我的运行配置说在运行 Specs 2 测试时首先运行“make”,但它看起来不像我的测试类正在生成。一直告诉我它找不到规范。当我查看文件系统时,目标/测试类中没有代码,目录为空。此外,至少与运行 Play 控制台相比,构建似乎需要很长时间。

我想看看人们如何使用 Play with IntelliJ。您只是将 IntelliJ 用作编辑器,然后通过 Play 控制台运行所有内容吗?

有没有一种方法可以让您在 IntelliJ 中运行应用程序测试(让您的测试类运行)?

我在运行 Play 控制台和运行 ~test-only test=xxx.Spec 时从未遇到任何问题。它通常相当快。

这是我在尝试运行 Specs2 测试时在 IntelliJ 中遇到的异常:

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.jetbrains.plugins.scala.testingSupport.specs2.JavaSpecs2Runner.runSingleTest(JavaSpecs2Runner.java:130)
    at org.jetbrains.plugins.scala.testingSupport.specs2.JavaSpecs2Runner.main(JavaSpecs2Runner.java:76)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.lang.RuntimeException: can not create specification: test.ApplicationSpec
    at scala.sys.package$.error(package.scala:27)
    at org.specs2.specification.SpecificationStructure$.createSpecification(BaseSpecification.scala:96)
    at org.specs2.runner.ClassRunner.createSpecification(ClassRunner.scala:64)
    at org.specs2.runner.ClassRunner.start(ClassRunner.scala:35)
    at org.specs2.runner.ClassRunner.main(ClassRunner.scala:28)
    at org.specs2.runner.NotifierRunner.main(NotifierRunner.scala:24)
    ... 11 more

【问题讨论】:

【参考方案1】:

更新:在 IntelliJ IDEA 的较新版本中,不再需要从 play/activator 创建模块。 IntelliJ IDEA 现在对 SBT 项目有很好的支持。如果存在,请删除项目中所有与想法相关的目录。然后在 IntelliJ IDEA 中单击 File -> Open 并选择您的 build.sbt 文件。就是这样。


IntelliJ IDEA 与 Play Framework 2 有很好的集成。有时会卡住,但大部分时间会运行。我用它来运行(单个,所有)测试,启动或调试 play 应用程序并编辑我的代码(o;这一切都在 IDE 中,没有 sbt 控制台。

这是一个简短的教程,其中包含最重要的步骤。目前我使用 IntelliJ IDEA 12.1 和最新的 Play Framework 2 和 Scala 插件。

1.创建一个新的应用程序

play new myapp

2。创建 IDE 模块

启动播放控制台:

cd newapp
play

创建模块:

idea with-sources=yes
exit

3.配置 IDE

    打开新创建的项目 打开模块设置(选择项目并按F4) 将 Scala 库添加到您的项目中
      选择Modules->myapp->Dependencies 按加号图标并选择库(2) 添加 Scala 2.10.0 项目库
    在 Scala Facet 中选择编译器库
      选择Facets->Scala(myapp)编译器库设置为Scala 2.10.0
    修复错误
      选择 Modules->myapp-build->Dependencies->scala-2.9.2 并按减号图标 选择 Libraries->Scala 2.9.2 并按减号图标
    修复 myapp-build 模块的输出路径
      选择模块->myapp-build->路径附加到输出路径(X:\projects\myapp\project\target\scala_2.9.2\classes) 将 test-classes 附加到 Test 输出路径(X:\projects\myapp\project\target\scala_2.9.2\test-classes)

4.运行测试

选择测试目录下的ApplicationSpec,然后从上下文菜单中单击Run 'ApplicationSpec'。您应该会收到一个错误,即找不到已编译的模板。这是因为 IDE 不编译模板,但这可以通过运行应用程序一次来完成。同样遵循第 5 点,然后再次运行测试。

5.运行应用程序

选择一个控制器,然后从上下文菜单中单击 Run Play 2 App。这应该在地址上启动应用程序:http://localhost:9000/

6.更新依赖项

如果您更新您的应用程序依赖项,那么您必须将这些更改告知 IDE。此外,在运行 play update 命令后,您必须关闭 IDE 并从项目目录中删除一些文件。如果你在删除文件之前执行play idea 命令,你会在你的播放项目中获得双重依赖。

执行以下步骤来更新你的依赖:

    从您的游戏控制台运行 update 任务 删除 .idea_modules.idea/libraries 目录 在播放控制台中运行idea with-sources=yes 命令 再次运行第 3 步

【讨论】:

到目前为止这有效!非常感谢您提供的信息!我有一个棘手的问题,当您运行测试时,它会加载项目信息和所有内容,这需要很长时间。有什么方法可以更快地运行测试吗?我的猜测是它需要很长时间,因为它在启动测试之前运行“Make”。有什么指点吗? 另一个问题,看起来想法插件生成了一堆 XML 文件,这些文件将类硬编码到安装 Play 的任何位置。我想如果不止一个人在做这个项目,你需要确保每个人都将 play 安装在同一个文件路径中? 到目前为止,我的朋友很好。为了避免运行测试时编译时间过长,我在 IntelliJ 中启动 SBT 控制台并运行 ~test:compile。然后,每次我进行代码更改时,都会快速重新编译代码,无论是应用程序代码还是测试代码。在我的运行配置中,我在启动测试之前删除了“Make”。这在执行 BDD / TDD 时非常快。 100万谢谢你的回答!!!! 这只是对这个答案的更新。在我的 Mac 上,当我用-sources=yes 运行idea 时,我发现源文件存在问题。为了解决这个问题,我开始使用 sbt 而不是 play。然后我从 sbt 运行以下命令:“update”、“update-classifierss”、“update-sbt-classifiers”。这将很多资源下载到我的本地。之后,我可以进入游戏控制台并运行“ide​​a with-sources=yes”并让它工作。注意:我在 Ubuntu 12.10 上没有遇到同样的问题 您可以使用原始的 sbt-idea 插件来避免在运行 play idea 后进行后期修复。请看下面我的回答!【参考方案2】:

Play 控制台包含一个名为 sbt-idea 的 sbt 插件的分支。该剧的 fork 有点落后于原始插件,并且在运行 play idea 时在 IntelliJ 中存在一些问题。您可以使用没有任何问题的原始插件。为了在你的游戏项目中使用这个插件,你需要..

1.在project/plugins.sbt文件中加入如下几行:(中间空行为必填)

resolvers += "Sonatype snapshots" at "http://oss.sonatype.org/content/repositories/snapshots/"

addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.5.1")

2.从播放控制台运行gen-idea

【讨论】:

【参考方案3】:

我通常只将 IntellijIDEA(12.0.4 版)用于 Play Framework 代码编辑器,因为:

    默认自动保存功能 相当快速的 IntelliSense 功能 Dracula UI,让我赏心悦目

我通常使用 Play SBT 控制台运行和调试应用程序。这是合理的快。但是,有时在控制台上执行play 命令时,我发现loading-project-info 任务耗时过长(将近10 分钟)。我不知道为什么有时会发生这种情况,但总的来说使用 Play SBT 控制台是我的选择。

我这样做是因为通常有 should-not-be-the-problem-things 被解释为 error,如下所示:

当我第一次开始学习 Play Framework 时,我遇到了这样的问题。所以,最后,我选择使用 Play SBT 控制台来运行和调试应用程序。

抱歉,我无法回答第 2 个问题。到目前为止,我只尝试运行和调试播放应用程序。出于测试目的,我以前从未尝试过 Play 2.x。

【讨论】:

感谢您的回复。我认为您只使用 IntelliJ 作为编辑器。昨晚,我设法在 IntelliJ 中安装了 SBT 控制台,我可以在其中执行 ~test-only test=xxxSPec 之类的操作。非常好,从编译的角度来看非常快。我同意,加载项目信息可能需要一段时间,这就是为什么最好让 play / sbt 控制台一直运行 我暂时没有回答这个问题。我希望有人能回应他们是否真的能够更好地整合 Play 和 IntelliJ。特别是关于我发布的例外情况。 +1 是的,我的朋友,我也想好好关注这个问题!

以上是关于如何将 IntelliJ 与 Play Framework 和 Scala 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 IntelliJ 中运行 Play Framework 2.1 项目?

将 google-play-services 库导入 Intellij IDEA 12(和 13)

使用 Intellij 15 创建新 Play 应用程序时的控制器问题

IntelliJ IDEA + Tomcat ;On Upate Action 与 On Frame Deactivation

通过路由为 IntelliJ 中导入的 Play 2.4.x 项目解析控制器

TwirlKeys.templateImports with Play 未在 IntelliJ IDEA 模板文件中解析