无法使用add()添加jvmArgs,为什么?

时间:2015-04-30 09:26:43

标签: gradle

任何人都可以解释为什么第一个样本在第二个样本无效时会起作用吗?

test {
    jvmArgs '-Xdebug',
            '-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=4000'
}

test {
    jvmArgs.add('-Xdebug')
    jvmArgs.add('-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=4000')
}

3 个答案:

答案 0 :(得分:3)

因为在第二个示例中调用了this方法。您获取列表,修改它,但更改不会反映到设置 - 只读访问。在第一个示例中,调用this方法并设置传递的参数。

以下是解释,返回列表的副本(出于安全原因,出于安全考虑 - 可变类型应始终作为副本返回)

public List<String> getJvmArgs() {
   List<String> args = new ArrayList<String>();
   for (Object extraJvmArg : extraJvmArgs) {
      args.add(extraJvmArg.toString());
   }
   return args;
}

答案 1 :(得分:0)

我发现这个问题与使用Gradle的正常命令行参数一样 - 甚至在示例1 工作且示例2 将无法添加额外的范围内参数:

  • runArgs在主build.gradle
  • 中设置

如下:

 ext {
     runArgs = [ '-server=localhost', '-port=8080' ];
 }

只需在命令行中附加 challenge (见下文)。

示例1

debug.doFirst(){

//  ... <snip> ...

        //  command line arguments
        //
    println "      debug args (a):  ${args}."
    runArgs.add( "-memo=${project.name}:debug" );
    args = runArgs;
    println "      debug args (b):  ${args}."


}

输出正确,显示&#34; -memo&#34;参数已添加,但传入的args已使用此方法替换为脚本变量。

debug args (a):  [-server, localhost, -port, 8080 ].
debug args (b):  [-server=localhost, -port=8080, -memo=Client:debug].

示例2

debug.doFirst(){

//  ... <snip> ...

        //  command line arguments
        //
    println "      debug args (a):  ${args}."
    args.add( "-memo=${project.name}:debug" );
    println "      debug args (b):  ${args}."


}

输出(正确?)显示上面没有add()答案:from Opal

debug args (a):  [-server, localhost, -port, 8080 ].
debug args (b):  [-server, localhost, -port, 8080 ].

我发布了这个示例,表明可能有其他选择接受现状,我希望jvmArgs能够以类似的模式运作。我没有找到添加额外调试特定参数的示例(比方说)。所以这是一个。

我还在几个地方(在线和书籍)看过,例如:

jvmArgs.add( "-DAPPLICATION_LOCATION=City" );
jvmArgs.add( "-DSERVER_HOST=localhost" );

我们现在明白,不行。

我要实现的用例是为子项目build.gradle脚本提供缺少的参数和/或脚本特定的参数(例如在调试运行示例中)。我很清楚,如果你想这样做,脚本将需要替换命令行或分析传入的args,然后通过一些来消除默认值机构。

希望这个例子能让其他人更深入了解。

答案 2 :(得分:0)

实际上,这种黑客手段有效:

def jvmArgsCopy = jvmArgs
jvmArgsCopy.add("-XX:MaxDirectMemorySize=2g")
jvmArgs = jvmArgsCopy