调试不使用play framework activator,scala和eclipse

时间:2015-06-07 01:31:11

标签: eclipse scala debugging playframework playframework-2.3

有很多帖子,说明很直接,但对于我的生活,我无法让调试器停在断点处。

我的环境是

  • eclipse 4.4.1
  • scala 2.11
  • scala IDE 4.1.0.nightly
  • play framework 2.3.3
  • 在Scala IDE 0.4.6中播放支持

我按如下方式启动激活器

activator -jvm-debug 9999 run

我已经使用标准套接字附件设置了远程Java应用程序调试配置。调试配置运行,附加到远程并启动一堆sbt线程。

但是,它不会在调试器中停止!这似乎不是很难,我做错了什么?

编辑: 我在一个项目中遇到了这个问题,我已经研究了一段时间,并在一个全新的,未触动过的play-anguale-require-seed项目实例中。这是该项目的build.sbt:

import WebKeys._

// TODO Replace with your project's/module's name
name := """play-angular-require-seed"""

// TODO Set your organization here; ThisBuild means it will apply to all sub-    modules
organization in ThisBuild := "your.organization"

// TODO Set your version here
version := "2.3.7-SNAPSHOT"

// Scala Version, Play supports both 2.10 and 2.11
//scalaVersion := "2.10.4"
scalaVersion := "2.11.4"

lazy val root = (project in file(".")).enablePlugins(PlayScala)

// Dependencies
libraryDependencies ++= Seq(
  filters,
  cache,
  // WebJars (i.e. client-side) dependencies
  "org.webjars" % "requirejs" % "2.1.14-1",
  "org.webjars" % "underscorejs" % "1.6.0-3",
  "org.webjars" % "jquery" % "1.11.1",
  "org.webjars" % "bootstrap" % "3.1.1-2" exclude("org.webjars", "jquery"),
  "org.webjars" % "angularjs" % "1.2.18" exclude("org.webjars", "jquery")
)

// Scala Compiler Options
scalacOptions in ThisBuild ++= Seq(
  "-target:jvm-1.7",
  "-encoding", "UTF-8",
  "-deprecation", // warning and location for usages of deprecated APIs
  "-feature", // warning and location for usages of features that should be                 imported explicitly
  "-unchecked", // additional warnings where generated code depends on assumptions
  "-Xlint", // recommended additional warnings
  "-Ywarn-adapted-args", // Warn if an argument list is modified to match the receiver
  "-Ywarn-value-discard", // Warn when non-Unit expression results are unused
  "-Ywarn-inaccessible",
  "-Ywarn-dead-code"
)

//
// sbt-web configuration
// https://github.com/sbt/sbt-web
//

// Configure the steps of the asset pipeline (used in stage and dist tasks)
// rjs = RequireJS, uglifies, shrinks to one file, replaces WebJars with CDN
// digest = Adds hash to filename
// gzip = Zips all assets, Asset controller serves them automatically when client accepts them
pipelineStages := Seq(rjs, digest, gzip)

// RequireJS with sbt-rjs (https://github.com/sbt/sbt-rjs#sbt-rjs)
// ~~~
RjsKeys.paths += ("jsRoutes" -> ("/jsroutes" -> "empty:"))

//RjsKeys.mainModule := "main"

// Asset hashing with sbt-digest (https://github.com/sbt/sbt-digest)
// ~~~
// md5 | sha1
//DigestKeys.algorithms := "md5"
//includeFilter in digest := "..."
//excludeFilter in digest := "..."

// HTTP compression with sbt-gzip (https://github.com/sbt/sbt-gzip)
// ~~~
// includeFilter in GzipKeys.compress := "*.html" || "*.css" || "*.js"
// excludeFilter in GzipKeys.compress := "..."

// JavaScript linting with sbt-jshint (https://github.com/sbt/sbt-jshint)
// ~~~
// JshintKeys.config := ".jshintrc"

// All work and no play...
emojiLogs


fork in run := true

3 个答案:

答案 0 :(得分:8)

克里斯的评论有答案!从build.sbt中删除运行中的fork或将其设置为false。我不确定是否会产生下游后果。

答案 1 :(得分:1)

当你的scala应用程序并不总是遵循java在包和目录结构之间的一对一关系时,也会错过断点。

今天被一个游戏框架应用程序咬了。按照惯例,播放控制器存在于controllers包中。随着项目的发展,它被重构为几个不同的子项目。因此,controllers目录仍然存在,但包已更改为package controllers.foo,这在scala中工作正常。

与OP一样,尽管文档简单,但没有任何效果,调试器永远不会遇到断点。一旦我将测试控制器移动到与包布局匹配的目录中,瞧,断点命中!

对于那些不使用激活器的人,这将启动一个sbt调试会话:

java -debug -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9999 -jar ~/bin/sbt-launch.jar "$@"

然后在播放控制台中运行run。切换到Eclipse并选择:

  • 运行>调试配置

  • 添加新的远程Java应用程序

  • 选择标准(套接字连接)或Scala调试器(套接字连接)

  • host:localhost,port:9999

  • 点击“应用”;然后单击Debug

如果一切顺利,当您访问控制器并在其依赖关系链中的某处设置断点时,应该触发断点,从而允许您按预期逐步执行代码。

答案 2 :(得分:0)

  1. 尝试以正常模式运行,并将前两行控制台日志粘贴到编辑器中。
  2. 在调试模式下执行相同操作。
  3. 比较:
    • 在第一行,在调试模式下(不是正常)你应该有这个(使用suspend = y ):
      agentlib:JDWP =运输= dt_socket,地址127.0.0.1 =:XXXXX,暂停= <强>ý下,服务器= N
    • 在调试模式下(不是正常),第二行应该存在:
      连接到目标VM,地址:'127.0.0.1:xxxxx',transport:'socket'
  4. suspend = y使您的服务器等待连接。它可能是 n

    1. 检查远程调试器的配置并检查用于监听的主机(localhost)和端口(9999)以及其他一些选项(传输等)。它应该与发射器的那些相匹配。