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无法添加额外的参数:
在主build.gradle中设置runArgs
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