2015-04-30 2 views

ответ

3

Потому что во втором примере вызывается метод this. Вы получаете список, изменяете его, но изменения не отражаются на настройках - доступ только для чтения. В первом примере вызывается метод this и передаются аргументы.

Вот объяснение, копия списка возвращается (это для безопасности, из соображений безопасности - изменяемые типы должны быть всегда возвращаются в виде копии)

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

Это объясняет это. Можете ли вы объяснить, почему доступ только для чтения? Я новичок в Groovy, в java вы получаете ссылку на список, и вы можете изменить его, как хотите. – MaxNevermind

+0

Это не вопрос хороших, java. См. Обновленный ответ. – Opal

0

Я нашел это проблематично с нормальными аргументами командной строки используя 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}." 


} 

Выход правильно, показывает «-memo» добавлен параметр, но и переданное в 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, а затем смять по умолчанию какой-либо механизм.

Надеюсь, этот пример даст другим более глубокое понимание.

Смежные вопросы