【问题标题】:How to run Jetty via Gradle in Debug Mode如何在调试模式下通过 Gradle 运行 Jetty
【发布时间】:2012-02-16 16:50:25
【问题描述】:

有谁知道如何配置 jetty gradle 插件以在调试模式下运行,以便我可以附加远程调试器?

我已尝试将 gradle 和 java opts 设置为:

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

...但它似乎不起作用。

我能够让我自己的码头安装工作正常,只是不是通过 gradle(jettyRun 或 jettyRunWar)。

问候。

【问题讨论】:

  • 你说得对,应该可以。我通过 JAVA_OPTS 设置,效果很好。
  • 你的 gradle 项目是多项目设置吗?
  • 是的。您可能希望将“-Xdebug -Xnoagent”添加到您的 JAVA_OPTS;他们也在我的。
  • 不知道 jettyRun,但是可以使用 --debug-jvm 调用 gradle run 以在 5005 上启动调试器

标签: jetty gradle


【解决方案1】:

尝试使用 Gretty 插件,它提供了 gradle 任务 jettyRunDebug、jettyStartDebug 等。

源码及文档:https://github.com/akhikhl/gretty

披露:我是 Gretty 插件的作者。

【讨论】:

  • 我试过 Gretty,idea 很不错,但不支持多码头/tomcat 实例,女巫对于多项目非常重要
  • 您的意思是“同一个 servlet 容器上的多个 Web 应用程序”吗?
  • 不,两个独立的项目,当我通过运行gradle run开始第一个,然后转到第二个项目目录,运行gradle run,gretty给我已经有一个实例错误
  • 请尝试为两者定义不同的端口集:gretty { httpPort = 8081 servicePort = 8082 statusPort = 8083 }
  • Gradle 分发:来自目标构建 Gradle 版本的 Gradle 包装器:3.0 Java 主页:C:\Java\jdk1.7.0_45 JVM 参数:无程序参数:无 Gradle 任务:jettyRunDebug '':prepareInplaceWebAppFolder UP- TO-DATE :createInplaceWebAppFolder UP-TO-DATE :processResources UP-TO-DATE :classes :prepareInplaceWebAppClasses :prepareInplaceWebApp :jettyRunDebug 在地址监听传输 dt_socket:5005 它永远卡在这里无法调试代码。操作系统:Windows GRADLE_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,address=9999,server=y,suspend=n
【解决方案2】:

在 Linux 上:

export GRADLE_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=9999,server=y,suspend=n"
gradle jettyRun

在 Windows 上:

set GRADLE_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,address=9999,server=y,suspend=‌​n
gradle jettyRun

【讨论】:

  • 不错!我也是。我在 Windows 上,所以我使用了set GRADLE_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,address=9999,server=y,suspend=n
  • +1 谢谢这终于在 Windows 上工作了。我的陈述用引号引起来,这似乎给我带来了所有麻烦。
  • 任何值得一提的 IDE 都将允许您添加断点并允许基于端口运行远程会话。检查jetbrains.com/idea/help/run-debug-configuration-remote.html
【解决方案3】:

你是否在守护进程模式下运行 gradle?据我了解,守护进程将运行码头实例。因此,您需要为守护程序设置 JVM 参数。这应该可以通过在 gradle.properties 中设置 org.gradle.jvmargs 来实现。

http://gradle.org/docs/current/userguide/tutorial_this_and_that.html#sec:gradle_properties_and_system_properties

在非守护程序模式下工作的简单项目

build.gradle:

apply plugin: 'idea'
apply plugin: 'jetty'

src/main/java/com/Test.java:

package com;
public class Test {
    static public String greet() {
        return "Hi";
    }
}

src/main/webapp/index.jsp:

<%@ page import="com.Test" %>
<html><body>
<%= Test.greet() %>
</body></html>

命令行(不过在 cygwin 中):

$ GRADLE_OPTS='-Xdebug -Xrunjdwp:transport=dt_socket,address=9999,server=y,suspend=n' gradle jettyRun

Gradle 然后挂起,我可以将 Intellij 的调试器放在端口 9999 上,并在 java 文件中设置断点。然后当我尝试打开网页时,码头通知我我将遇到断点。

【讨论】:

  • 我想它目前正在运行,我会听从你的建议来确定。干杯
  • Jetty 似乎默认运行在进程中。
  • “进行中”是什么意思?你的意思是gradle过程吗?如果您在没有守护程序的情况下运行“gradle jettyRun”,则 gradle 进程将挂起,直到您强制它停止。
  • 在 gradle.properties 中设置 org.gradle.jvmargs 在守护程序模式下也不起作用。也许我做错了。有任何想法吗?如果您想在那里回答,我提交了一个附加问题:stackoverflow.com/questions/18729998/…
  • 刚刚在 cygwin 中尝试使用 Gradle 3.5.1,发现由于 jvm args,Gradle 为 jetty 分叉了一个进程。如果没有 --no-daemon,两个进程都尝试使用相同的端口,并且非 jetty 进程获胜。使用 --no-daemon,第一个进程使用命令行中指定的端口 9999,分叉的进程使用 5005,gradle 的默认值。所以我能够使用端口 5005 连接到分叉的码头进程。
【解决方案4】:

set GRADLE_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,address=9999,server=y,suspend=n 在使用gradle jettyRunWar 运行时对我也不起作用。

我找到了另一个可行的解决方案,使用以下选项运行 gradle jettyRunWar gradle -Dorg.gradle.jvmargs="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n" jettyRunWar

但是当我在 gradle.properties 中添加相同的参数时,它不起作用...

【讨论】:

    【解决方案5】:

    我的是一个多项目的 gradle 构建,我试过了:

    $ export GRADLE_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=9999,suspend=y,server=y"
    $ gradle jettyRun
    

    那没有用。我什至尝试将 -Xnoagent 添加到上面的 GRADLE_OPTS 设置中,但这也没有什么不同。此外,设置 JAVA_OPTS 而不是 GRADLE_OPTS 也不能解决问题。为我解决问题的是添加一个 gradle.properties :

    org.gradle.jvmargs=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=5005,suspend=y
    

    我可以立即打断点。可能是其他答案中提到的解决方案对我不起作用,因为它是一个多项目构建。不确定!

    只是想提供对我有用的解决方案,以防上述解决方案对其他人不起作用。

    P.S:尝试使用 gradle 1.5/1.6 并将上述设置添加到 gradle.properties 对两个版本都有效!

    【讨论】:

      【解决方案6】:

      将此添加到 build.gradle 中

      jettyRun {
          jvmArgs '-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005'
      }
      

      【讨论】:

        【解决方案7】:

        我的情况是,在我运行以下命令之前它不起作用。 GRADLE_OPTS='-XX:MaxPermSize=256M -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=4001' gradle jettyRun

        当它工作时,我可以在服务器控制台中使用System.out.println(...) 来检查我想看到的内容。至于断点调试,不幸的是,我还没有找到办法。谁知道怎么做,欢迎补充。

        【讨论】:

          【解决方案8】:

          另外,请查看官方 wiki 中的这两个链接:

          https://github.com/akhikhl/gretty/issues/36

          http://akhikhl.github.io/gretty-doc/Debugger-support.html

          它可以帮助您正确配置 gretty 插件以使用 IntelliJ Idea 调试码头应用程序

          【讨论】:

            【解决方案9】:

            我使用org.gradle.debug 属性运行它:

            ./gradlew -Dorg.gradle.debug=true jettyRun

            此时 gradle 冻结并等待传入​​的调试连接。

            然后我在 IntelliJ 中创建了远程运行配置,其值为“运行远程​​ JVM 的命令行参数”为 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

            最后,我运行了这个新配置,gradle 恢复进度,IDE 在第一个断点处停止。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-06-10
              • 1970-01-01
              • 2015-12-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多