使用简单构建工具(sbt)和IntelliJ调试Scala代码

时间:2010-11-11 01:48:50

标签: scala intellij-idea jetty sbt

使用IntelliJ的内置调试器调试由sbt管理的Scala代码的最简单方法是什么?来自"RunningSbt" from sbt's google code site的文档列出了用于运行项目或测试的主类的命令,但似乎没有用于调试的命令。

后续问题:在使用sbt的jetty-run命令时,将IntelliJ的调试器连接到Jetty的最简单方法是什么?

15 个答案:

答案 0 :(得分:170)

对于Mac,Linux和Linux,官方SBT packages中有一个非常方便的 -jvm-debug 标记。 Windows。您可以使用该标志指定调试端口:

sbt -jvm-debug 5005

Under the covers,这将启动带有典型详细调试咒语的SBT JVM:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005

您现在可以正常运行代码,例如使用sbt run命令。

配置IntelliJ以连接到正在运行的代码...

现在使用Remote Debug configuration将IntelliJ连接到正在运行的进程。请注意,这种形式的上面3个字段虽然可怕,但只是为了复制文本 out 而不是(他们正在给出上面指定的详细调试咒语,{{ 1}}已经为您照顾了) - 您可以更改的唯一配置是在-jvm-debug部分中途:

Remote Debug configuration in IntelliJ

答案 1 :(得分:45)

对于IntelliJ中的普通调试,无论是否使用sbt编译代码,都可以按常规方式使用应用程序运行/调试配置。

要连接到在Jetty中运行的应用程序,您需要创建远程调试配置。执行此操作时,IntelliJ将为您提供一组用于运行远程JVM的命令行参数 - 类似于

-Xdebug -Xrunjdwp:transport = dt_socket,server = y,suspend = n,address = 5005

使用这些参数启动sbt,然后执行jetty-run。最后,在IntelliJ中启动远程调试配置。 This thread可能有用。

答案 2 :(得分:39)

我也遇到了一些麻烦,所以冒着过于详细的风险,这就是我的所作所为:

<强> SETUP

  1. 为sbt jetty-run

    创建运行配置
    • 转到“运行”&gt;编辑配置
    • 单击[+]图标并选择Scala Compilation Server
    • 输入您想要的任何名称,然后单击“运行SBT操作”复选框并从[...]
    • 中选择SBT Action码头运行
  2. 为远程调试创建调试配置

    • 转到“运行”&gt;编辑配置
    • 单击[+]图标,然后选择远程
    • 输入您想要的任何名称并复制行-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005(确保单击“确定”以实际创建配置)
  3. 设置sbt插件以运行上面的vm选项

    • 转到文件&gt;设置&gt; SBT
    • 将行-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005粘贴到VM参数框中,在已存在的行
    • 之后
  4. <强>调试

    1. 根据需要设置断点
    2. 通过选择上面创建的sbt jetty-run配置并选择Run&gt;来启动jetty Web服务器。运行或单击绿色箭头
    3. 选择上面创建的远程调试配置并选择Run&gt;启动远程调试器。调试或单击错误图标

答案 3 :(得分:7)

我在这里添加另一个答案,因为我在查找相关问题时发现了这个问题:使用断点调试测试类。

我正在使用ScalaTest,我通常使用sbt的'test-only'命令运行套件。现在,当我想使用交互式调试器时,我可以执行以下操作:

创建一个“ScalaTest”类型的新运行/调试配置,放置主“Test Class:”名称,然后选择“启动前:运行SBT操作'test-compile'”。就是这样,您现在可以在测试源中放置断点,并运行此配置。

答案 4 :(得分:6)

这个每次都适合我,你需要设置的唯一东西是IntelliJ中的远程调试;我在IntelliJ中用终端的JVM参数启动SBT:

sbt -J-Xdebug -J-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005

之后我可以在localhost:5005

上启动远程调试

答案 5 :(得分:5)

这些答案或提供的链接都不适用于我,所以一旦我弄清楚了,我想我会分享......

包括我开始时没有的背景知识......

这主要基于here的说明,只是提供了额外的解释。

我的环境: Scala 2.10.2,SBT 0.13和IntelliJ 13.1

背景:

  
      
  • 无论出于何种原因,使用SBT在IntelliJ中编译Scala没有像Maven项目那样集成(这样可以很容易地进行调试)。
  •   
  • 根据我的理解,在使用SBT进行编译时,您需要在单独的进程中进行编译,因此,您需要进行远程调试。
  •   

什么是调试?

  
      
  • 调试是一种可以运行JVM或应用程序的模式,允许您控制代码执行流程。
  •   
  • 您使用的调试工具然后可以向调试引擎发出命令,告诉它“执行下一行代码然后再次暂停”或“继续执行”或“获取存储在此处的变量值”。< / LI>   

什么是远程调试?

  
      
  • 远程调试是通过网络连接(套接字)进行调试。
  •   
  • 此网络连接允许您从远程计算机向调试引擎发出命令。
  •   
  • 当您要调试在远程服务器上运行的代码时,这非常有用,但
  •   
  • 对于像在SBT下运行的Scala代码以及通过Web服务器(例如Jetty或Tomcat)启动而与IntelliJ环境分开的情况,它也很有用。
  •   

参考上面的链接,以下解释/修改很有用:

  
      
  1. 设置IntelliJ以使用“启用调试”JVM设置启动SBT,包括设置网络套接字时使用的端口。 (未更改)将指定的VM参数添加到IntelliJ设置。
  2.   
  3. 确保此处的端口号与步骤1中的JVM设置相匹配。
  4.   
  5. 启动SBT时,需要从SBT控制台插件(这是您在步骤1中配置的插件)中执行此操作。如果您在IntelliJ之外运行SBT(在命令行),则需要使用步骤1中的相同VM参数启动SBT(我没有这样做;所以没有说明)。完成此步骤后,SBT现在正在运行(但您的代码尚未运行),并且JVM已设置为进行远程调试。
  6.   
  7. 这将启动IntelliJ调试工具,该工具连接到您在步骤3中启动的JVM。
  8.   
  9. 最后,您在SBT控制台中开始编译。您可以使用任何编译命令执行此操作,包括连续编译命令。如果连续重新编译,将重新编译,但不会在调试器暂停代码执行时发生。
  10.   

答案 6 :(得分:3)

使用Scala 2.10和SBT 0.12,我得到了这样的工作:http://tuliodomingos.blogspot.com.es/2014/01/scala-remote-debugging-in-sbts-jetty.html

答案 7 :(得分:3)

我一直在使用Intellij在使用通过SBT构建的Spray-can / Akka / Scala应用程序的Windows上进行调试。拼凑各种建议,最简单的方法是:

  1. 确保你的project / plugsin.sbt文件中有sbt.Revolver,例如。

    addSbtPlugin(&#34; io.spray&#34;%&#34; sbt-revolver&#34;%&#34; 0.7.1&#34;)

  2. 在build.sbt文件中设置javaoptions:

    javaOptions:= Seq(&#34; -Xdebug&#34;,&#34; -Xrunjdwp:transport = dt_socket,server = y,suspend = y,address = 5005&#34;)

  3. 特别使用suspend = y选项。这将保留应用程序,直到您从Intellij

    连接远程调试器
    1. 通过“运行/编辑配置”菜单在Intellij中设置调试器配置。按+按钮,选择&#34;遥控器&#34;选项。确保条目与上面的javaoptions匹配,特别是端口地址5005.为配置命名,例如&#39; Spray&#39;。

    2. 从SBT控制台使用重新启动命令。您应该在反馈输出中看到5005端口地址。

    3. 在Intellij中设置断点。

    4. 从Intellij中选择Run \ Debug&#39; Spray&#39;。这应该连接到喷雾罐网络服务器。您应该能够在调试窗口中看到很多线程。

    5. 请注意,Spray中的某些Get指令似乎在启动时执行,但在调用网站时不会反复执行。

答案 8 :(得分:3)

文件 - >设置 - >其他设置 - &gt; SBT  VM参数     -Xmx512M -XX:MaxPermSize = 256M -Xdebug -Xrunjdwp:transport = dt_socket,server = y,suspend = n,address = 5005

运行 - >编辑配置       按+,然后选择远程       按“应用”

当你执行命令&#39;运行&#39>时,现在在SBT控制台(由intelliJ启动)您将在地址:5005&#34;

中看到&#34;侦听传输dt_socket

现在按Run-&gt; Debug。您将看到下面的调试菜单已激活。它有两个选项卡Debugger和Console。

使用F7从下一行到下一行

我选择暂停为n。当我运行run命令它时,它被卡住了

答案 9 :(得分:2)

对于Windows民众的价值,编辑%SBT_HOME%\bin\sbt.bat并找到以下代码行:

:run

"%_JAVACMD%" %_JAVA_OPTS% %SBT_OPTS% -cp "%SBT_HOME%sbt-launch.jar" xsbt.boot.Boot %*
if ERRORLEVEL 1 goto error
goto end

然后用以下代码替换它们:

FOR %%a IN (%*) DO (
  if "%%a" == "-jvm-debug" (
    set JVM_DEBUG=true
    set /a JVM_DEBUG_PORT=5005 2>nul >nul
  ) else if "!JVM_DEBUG!" == "true" (
    set /a JVM_DEBUG_PORT=%%a 2>nul >nul
    if not "%%a" == "!JVM_DEBUG_PORT!" (
      set SBT_ARGS=!SBT_ARGS! %%a
    )
  ) else (
    set SBT_ARGS=!SBT_ARGS! %%a
  )
)

if defined JVM_DEBUG_PORT (
  set _JAVA_OPTS=!_JAVA_OPTS! -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=!JVM_DEBUG_PORT!
)

call :run %SBT_ARGS%

if ERRORLEVEL 1 goto error
goto end

:run
"%_JAVACMD%" %_JAVA_OPTS% %SBT_OPTS% -cp "%SBT_HOME%sbt-launch.jar" xsbt.boot.Boot %*
goto :eof

在Bash脚本启动器中看到-jvm-debug时,我可以做的最好的行为

NB。我不认为%SBT_HOME%实际上存在于此脚本之外,除非您在您的环境中明确创建,但无论如何您都明白:D

答案 10 :(得分:1)

AttachMe IntelliJ插件可能是连接调试器的更快方法,而无需摆弄端口号:

AttachMe将自动附加IntelliJ调试器,即使您 从终端(或任何其他方式)启动您的应用。你不需要 手动触发Attach to process操作。

Blog postreadme都有设置说明,但是我必须对其进行一些改动才能使其在我的计算机上正常工作

  1. 从官方存储库下载installer.sh脚本

    curl -o installer.shhttps://raw.githubusercontent.com/JetBrains/attachme/master/installer.sh
    
  2. 给予可执行权限chmod u+x installer.sh
  3. 使用./installer.sh
  4. 运行它
  5. 这应将代理安装在/.config/attachme/agent.jar下并创建~/.attachme文件
  6. 修改~/.attachme以包含

    AM_JDWP_ARGS="transport=dt_socket,server=y,suspend=y,address=127.0.0.1:0"
    echo Using JDWP arguments ${AM_JDWP_ARGS}
    export JAVA_TOOL_OPTIONS="- javaagent:/Users/mario_galic/.config/attachme/agent.jar -agentlib:jdwp=${AM_JDWP_ARGS}"
    echo "AttachMe configured successfully"
    
  7. 安装相应的Attachme插件并重新启动:IntelliJ | Preferences | Plugins

  8. 创建Attachme运行配置:Run | Edit configurations... | Add new configuration | Attachme debugger registry | OK

这些一次性的恶作剧之后,我们可以通过以下方式自动附加调试器

  1. 开始Attachme运行配置
  2. source ~/.attachme
  3. 从终端sbt "runMain example.Hello"启动应用程序
  4. 调试器应自动附加并在任何断点处停止

答案 11 :(得分:0)

我也遇到了同样的问题,我想分享一下我的解决方法。顺便说一句,我使用的是Ubuntu 14.04和IntelliJ 15。

  1. 在设置中 - &gt; SBT - &gt; 粘贴在VM参数文本框中的以下行:

    -XX:MaxPermSize = 384M -Xdebug -Xrunjdwp:transport = dt_socket,server = y,suspend = n,address = 5005

  2. 在IntelliJ中打开Termilal并运行:

    sbt -jvm-debug 5005

    注意:你应该在终端看到这一行:“在地址:5005收听传输dt_socket”

  3. 编辑配置 - &gt;点击+ - &gt;选择“远程”

    I. Give some name example: DebugMyModule
    
    II. All needed configurations will be set automatically, But you just verify. In Command line arguments should look like this "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005".
    
    III. In 'Search Sources in Module's Classpath' text box specify your module in which module your test cases are there.
    
    IV. put 127.0.0.1 host instead of 'localhost'. 'localhost' not working for me.
    
  4. Edit Configurations列表框中选择 DebugMyModule ,然后点击调试

    注意:您应该看到Debug View已打开并且在Debug Console中您应该能够看到“已连接到目标VM,地址:'127.0.0.1:5005',transport:'socket'”

  5. 在测试类中的几个测试用例中放置断点。

  6. 来到运行“sbt -jvm-debug 5005”的终端,然后运行如下

    project <your-module-name>
    it:testOnly package.TestSpec
    

    例如:com.myproject.module.AddServiceTest [Spec]

  7. 您可以在测试用例断点中看到调试开始。

答案 12 :(得分:0)

export SBT_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5009

试试这个

答案 13 :(得分:0)

关于一个相对较新版本的 Intellij (2020.1.4) 一步一步地给出一分钱:

  • 配置 Intellij

    • “编辑配置”
      enter image description here
    • 添加“远程”
      这个新版本的 Intellij 不允许你在“命令行参数”中编辑字符串,你只能编辑上面的“主机”和“端口”,我保持默认;我只将下面的“模块路径”更改为“root”(不确定是否有必要) enter image description here
  • 远程调试

    • 设置断点
    • 命令行中执行sbt命令,例如sbt -jvm-debug 5005 test
    • 立即返回 Intellij 并单击“调试”,它应该显示类似“已连接到 xxx”的内容,然后等到它在您的断点处挂起
      enter image description here

答案 14 :(得分:-1)

根据上述Roberto Tyley的回答,但是在Windows中,在安装sbt之后,我们还需要设置以下环境变量:

SBT_HOME
C:\ Program Files(x86)\ sbt \
[或安装sbt的任何地方]

SBT_OPTS
-Xdebug -runjdwp:transport = dt_socket,server = y,suspend = n,address = 5005

[每个RT的IntelliJ示例]

添加到路径:%SBT_HOME%\ bin;%SBT_OPTS%

然后在项目文件夹中的命令行中运行以下命令 “ sbt run -jvm -debug 5005”。

如果此方法正常运行,则命令行最初将在命令行中输出re “侦听地址为5005的运输dt_socket”。

在IntelliJ中设置断点。

在浏览器中打开网站以触发调试器断点,例如“ http://localhost:9000/”。