У меня есть программа Java, которая читает свойство системы
System.getProperty("cassandra.ip");
и у меня есть файл сборки Gradle, с которого я начинаю
gradle test -Pcassandra.ip=192.168.33.13
или
gradle test -Dcassandra.ip=192.168.33.13
однако System.getProperty всегда будет возвращать null .
Единственный способ, который я нашел, - добавить это в свой файл сборки Gradle через
test {
systemProperty "cassandra.ip", "192.168.33.13"
}
Как мне это сделать через -D
gradle -Dcassandra.ip=192.168.33.13
? В любом случае тестовая задача создает одну или несколько новых JVM. Поэтому вам придется явно передавать свойства. Однако никто не заставляет вас жестко указывать их значение в сборке.Ответы:
Флаг -P предназначен для свойств Gradle, а флаг -D - для свойств JVM. Поскольку тест может быть разветвлен в новой JVM, аргумент -D, переданный в gradle, не будет передан в тест - похоже, что вы наблюдаете именно такое поведение.
Вы можете использовать systemProperty в своем
test
блоке, как вы это сделали, но основывать его на входящем свойстве gradle, передав его с параметром -P:или, альтернативно, если вы передаете его через -D
источник
System.getProperties().stringPropertyNames().forEach(System.out::println);
кода Java, не отображается)getProperty
выбрасывается,MissingPropertyException
если свойство не найдено. Вместо этого используйте ответ Эрона: stackoverflow.com/a/43112126/915441gradle.properties
предотвратит расширениеMissingPropertyException
.Столкнулся с этой очень большой проблемой, за исключением того, что я не хочу снова перечислять все свойства, указанные в командной строке в скрипте gradle. Поэтому я отправляю все свойства системы на свой тест
источник
У меня был случай, когда мне нужно было передать несколько системных свойств в тестовую JVM, но не все (я не хотел передавать нерелевантные). Основываясь на приведенных выше ответах и используя
subMap
для фильтрации нужных мне, это сработало для меня:В этом примере будут переданы только
PROP1
иPROP2
, если они существуют в JVM Gradle.источник
Вот вариант, который передает многочисленные свойства проекта в тестовую JVM как системные свойства. Я предпочитаю свойства проекта свойствам системы, чтобы повысить гибкость.
Что можно передать в командной строке:
И получено в вашем тесте:
источник
System.getProperty("someprop")
с использованием этого метода subMap я получил{someprop=foo}
вместоfoo
. Мне пришлось использоватьsystemProperty "foo", project.properties.subMap(["foo"]).get("foo")
в build.gradlesystemProperty "foo"
? т.е. я прошу увидеть полную строку кода, где это использовалось? Я пробую все, что предлагается в этом вопросе, и все же Gradle не передает никаких аргументов. Надеюсь, это разрешится!Так что сегодня я тоже наткнулся на эту проблему, и мне помогло следующее:
Я вызываю свою тестовую задачу, используя -Penv = dev, и получаю свое значение 'dev' в моем print или 'prod', если я не отправляю никакого значения, что является ожидаемым поведением для меня.
Значение также доступно на стороне Java, используя System.getProperty ("env") .
Мой вывод по этому поводу заключается в том, что входное значение (параметр) фактически хранится в системе , что делает его доступным через System.properties ['env'] или System.getProperty ("env") , тогда как выходные данные (системное свойство) хранятся в systemProperties массив, что делает его доступным для чтения через systemProperties [ «окр»] .
источник