如何使用IntelliJ与Play框架和Scala

34

我正在尝试在 IntelliJ 中使用 Play Framework 2.11 应用程序。

我安装了 Play Framework 2 插件和 Scala 插件以供 IntelliJ 使用。

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

我想知道人们如何在 IntelliJ 中使用 Play。您只是将 IntelliJ 作为编辑器,通过 Play 控制台运行所有内容吗?

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

我从 IntelliJ 中运行 Specs2 测试时遇到了以下异常:

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
3个回答

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


IntelliJ IDEA对Play Framework 2有良好的集成。有时它会卡住,但大多数情况下都可以运行。我使用它来运行(单个、全部)测试,启动或调试play应用程序以及编辑我的代码(o;而这一切都是在IDE内部完成而无需使用sbt控制台。

以下是最重要的步骤的简短教程。目前,我使用带有最新Play Framework 2和Scala插件的IntelliJ IDEA 12.1。

1. 创建一个新应用程序

play new myapp

2. 创建IDE模块

启动Play Console:

cd newapp
play
创建模块:
idea with-sources=yes
exit

3. 配置IDE

  1. 打开新建的项目
  2. 打开模块设置(选择项目并按F4键)
  3. 将Scala库添加到您的项目中
    1. 选择模块->myapp->依赖项
    2. 点击加号图标,然后选择Library(2)
    3. 添加Scala 2.10.0项目库
  4. 在Scala Facet中选择编译器库
    1. 选择Facets->Scala(myapp)
    2. Compiler library设置为Scala 2.10.0
  5. 修复错误
    1. 选择模块->myapp-build->依赖项->scala-2.9.2,然后按减号图标
    2. 选择库->Scala 2.9.2,然后按减号图标
  6. 修正myapp-build模块的输出路径
    1. 选择模块->myapp-build->路径
    2. Output path添加到classes(X:\projects\myapp\project\target\scala_2.9.2\classes)
    3. Test output path添加到test-classes(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命令,则会在play项目中出现重复的依赖项。

执行以下步骤以更新依赖项:

  1. 从play控制台运行update任务
  2. 删除.idea_modules.idea/libraries目录
  3. 在play控制台中运行idea with-sources=yes命令
  4. 再次执行第3步

1
到目前为止,这个方法可行!非常感谢您提供的信息!我有一个问题困扰着我,当你运行测试时,它会加载项目信息和所有内容,这需要很长时间。有没有办法让测试运行得更快?我猜测它需要在启动测试之前运行“Make”,您有什么建议吗? - noplay
3
这只是对这个答案的更新。在我的Mac电脑上,当我用“idea with-sources=yes”运行时,我发现源文件无法被找到。为了解决这个问题,我启动了sbt而不是play。然后我从sbt运行了以下命令:“update”,“update-classifierss”,“update-sbt-classifiers”。这样就下载了很多源文件到本地。之后,我能够进入Play控制台并运行“idea with-sources=yes”,它可以正常工作。注意:我在Ubuntu 12.10上没有遇到同样的问题。 - noplay
1
你可以使用原始的sbt-idea插件,以避免在运行play idea后需要进行后期修正。请看下面的回答! - Yeonho
嘿,非常感谢你的帮助。因为某种原因,我导入项目到IDEA的方式总是左右抛出错误。你的指南真的很有帮助! - Roberto
注意:当IDEA无法识别Scala模板中的反向路由时,需要执行以下操作:•打开模块设置(_CTRL + ALT + Shift + S_)•选择模块-> myapp->源(选项卡)•将target \ scala-2.10 \ src_managed \ main添加为源(如此所示),并从源中删除2或3个长路径(它们不在图中)。 - Lukas M.
显示剩余5条评论

3
Play控制台包含一个名为sbt-idea的sbt插件的分支。Play的分支比原始插件稍微滞后一些,并且在运行play idea时在IntelliJ中存在一些问题。您可以使用没有任何问题的原始插件。为了在Play项目中使用此插件,您需要执行以下操作:
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.在play控制台中运行gen-idea命令。


0

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

  1. 默认具有自动保存功能
  2. 相当快的智能感知功能
  3. Dracula UI,这对我来说是一种视觉享受

我通常使用Play SBT控制台运行和调试应用程序。它非常快速。但是,有时在控制台上执行play命令时,我发现loading-project-info任务需要太长时间(近10分钟)。我不知道为什么有时会发生这种情况,但总体而言,我选择使用Play SBT控制台。

我这样做是因为通常会将不应该成为问题的事情解释为错误,如下所示:

IDEA Error

第一次学习Play框架时,我遇到了这样的问题。因此,最终我选择使用Play SBT控制台来运行和调试应用程序。

很抱歉我无法回答第二个问题。直到现在,我只尝试过运行和调试Play应用程序。为了测试目的,我以前从未尝试过Play 2.x。


感谢您的回复。我理解您只使用IntelliJ作为编辑器。昨晚,我成功在IntelliJ中安装了SBT控制台,并且可以在其中执行像~test-only test=xxxSPec这样的操作。非常好用,从编译的角度来看也相当快。我同意,加载项目信息可能需要一些时间,这就是为什么最好始终运行play / sbt控制台的原因。 - noplay
1
我暂时不回答这个问题。我希望有人能够回应,是否真的能够在Play和IntelliJ之间获得更好的集成。具体来说,就是我发布的异常情况。 - noplay
+1 是的,我的朋友,我也想好好关注这个问题! - Wayan Wiprayoga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接