Gradle Can';无法使用add()添加JVMARG,为什么?

Gradle Can';无法使用add()添加JVMARG,为什么?,gradle,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') }

有人能解释为什么第一个样本有效而第二个样本无效吗

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')
}

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

这里有一个解释,返回列表的副本(出于安全考虑-可变类型应始终作为副本返回)

public List getJvmArgs(){
List args=new ArrayList();
用于(对象extraJvmArg:extraJvmArgs){
add(extraJvmArg.toString());
}
返回args;
}

我发现使用Gradle的普通命令行参数也存在问题——即使示例1有效,而示例2无法添加额外的参数:

  • runArgs
    在主build.gradle中设置
详情如下:

 ext {
     runArgs = [ '-server=localhost', '-port=8080' ];
 }
简单地附加到命令行似乎很有挑战性(见下文)


示例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}."


}
debug.doFirst(){

//  ... <snip> ...

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


}

示例2

debug.doFirst(){

//  ... <snip> ...

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


}
debug.doFirst(){

//  ... <snip> ...

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


}
我发布这个示例是为了说明除了接受现状之外,可能还有其他选择,我希望
jvmArgs
也能以类似的模式工作。我没有找到添加额外调试特定参数的示例(比如)。这里有一个

我还看到了一些地方(在线和书籍),例如:

jvmArgs.add( "-DAPPLICATION_LOCATION=City" );
jvmArgs.add( "-DSERVER_HOST=localhost" );
正如我们现在所理解的,这是行不通的

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


希望这个例子能给其他人更多的洞察力

实际上,这项技术正在发挥作用:

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

这就是为什么。你能解释一下为什么是只读访问吗?我是Groovy新手,在java中,你可以得到一个对列表的引用,你可以随意更改它。请参阅更新的答案。
def jvmArgsCopy = jvmArgs
jvmArgsCopy.add("-XX:MaxDirectMemorySize=2g")
jvmArgs = jvmArgsCopy