gradle 的调试目标相当于用于传递参数的 运行 {} 块

Debug target for gradle equivalent to the run {} block for passing arguments

我正在尝试移植 Codename One 客户端构建,它们是非常定制的 ant 脚本,可以与 gradle 一起使用。当您在模拟器上 运行 Codename One 应用程序时,您并不是在 运行 应用程序主 class 而是像这样的东西:

java -classpath CodenameOneJarList com.codename1.impl.javase.Simulator nameOfTheMainClassForTheApp

为了在 gradle 中做到这一点,我编辑了基本构建脚本:

apply plugin: 'java'
apply plugin: 'application'
mainClassName = "com.codename1.impl.javase.Simulator"

// for netbeans
ext.mainClass = 'com.codename1.impl.javase.Simulator'

然后在底部我这样做了:

run {
    args 'com.mycompany.myapp.Main'
}

这按预期工作并在 IDE (NetBeans) 中按 运行 时启动了模拟器。我不确定这是否是 "right thing" 要做的,以及它是否适用于其他 IDE。

然后,当我尝试在调试器中启动时,参数没有传递,因为我猜 run 目标没有被调用?

我试过这样做:

debug {
    args 'com.mycompany.myapp.Main'
}

这显然失败了。我不确定在哪里将参数传递给调试器?

这是 gradle 标准化的吗?

关于参数传递,我的方向是否正确?

"run" 声明性语法映射到什么?我如何找到其他潜在的声明性块类型?

不幸的是,谷歌搜索 run/debug 之类的基础知识并没有得到有用的结果。

build.gradle 中的 run 部分是从您应用的 application 插件添加到项目的 DSL。 Here is more information 关于插件。正如您所注意到的,应用程序插件实际上是为了生成一个 运行nable jar,分发和执行它 - 不是为了调试,也不支持它。

要从 Gradle 启动 java 进程,您可以使用 JavaExec 任务,以及使用 args 字段的任意 JVM 参数,包括但不限于调试选项。

你可以这样做:

task runApp(type: JavaExec) {
  classpath = sourceSets.main.runtimeClasspath
  main = 'package.Main' //class to run

  // add debug arguments as required, for example:
  args '-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8888,suspend=n'
}

运行 gradle runApp 以调试模式启动您的应用程序,然后附加您的 IDE。对 Netbeans 不够熟悉,我无法评论如何将 Netbeans 附加到调试 java 进程。