Проблема
У меня есть файл gradle.properties уровня проекта, который определяет различные значения systemProp.* (особенно прокси). Я получил эту идею от документация.
Я ожидаю, что эти свойства будут переданы в JVM, которая запускает мое приложение, чтобы мое приложение могло использовать эти значения во время выполнения.
Однако похоже, что ни одно из этих значений systemProp не передается.
Я неправильно понимаю, как это должно работать?
Повторяемый пример
Я создал небольшой репозиторий GitHub, который показывает это в действии: https://github.com/gmacster/gradle-system-properties-passthrough
У меня есть пользовательский systemProp, определенный в gradle.properties, который называется some-sample-prop. Мой метод main() считывает значение этого свойства и регистрирует его.
Я просто запускаю gradlew run без лишних аргументов.
Информация о версии
------------------------------------------------------------
Gradle 5.4.1
------------------------------------------------------------
Build time: 2019-04-26 08:14:42 UTC
Revision: 261d171646b36a6a28d5a19a69676cd098a4c19d
Kotlin: 1.3.21
Groovy: 2.5.4
Ant: Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM: 11.0.2 (Oracle Corporation 11.0.2+9-LTS)
OS: Windows 10 10.0 amd64




вы можете получить доступ, хотя это не очень хорошая идея, так как этот файл должен хранить свойства, которые будут использоваться только для задач gradle.
Я предлагаю вам иметь application.properties под источник/основной/ресурсы и читать файл оттуда.
Но если вы хотите сохранить в gradle.properties, вот как вы можете его получить:
public static void main(String[] args) throws IOException {
FileInputStream input = new FileInputStream("gradle.properties");
// load a properties file
Properties prop = new Properties();
prop.load(input);
System.out.println(prop.getProperty("systemProp.some-sample-prop"));
}
Он будет печатать:
hello world
@britter Если он не добавит этот файл в ресурсы в сценарии gradle. Но я предложил добавить эти свойства в свойства приложения в /src/main/resources. Я просто пытался показать способ получить этот файл или любой другой файл, если это то, что ему действительно нужно.
Системные свойства, определенные в gradle.properties, передаются только JVM, на которой запущен сам Gradle, а не JVM, которые разветвлены каким-либо плагином, который вы используете для запуска своего приложения. Итак, чтобы передать системные свойства из Gradle в приложение, которое запускается Gradle, вам нужно вручную скопировать их в свойство systemProperties задачи JavaExec. Предполагая, что вы используете задачу run, предоставленную плагин приложения, и у вас есть systemProp.proxy.host=example.proxy.host.com в вашем файле gradle.properties, вам нужно будет сделать это (см. также этот очень старый ответ на форумах Gradle):
task.named('run') {
systemProperties = [
'proxy.host': System.getProperty('proxy.host')
]
}
Но позвольте мне спросить вас, зачем вам нужна эта косвенность. Я предполагаю, что вам нужны только эти свойства для запуска приложения. Если это так, было бы проще определить их непосредственно в скрипте сборки:
task.named('run') {
systemProperties = [
'proxy.host': 'example.proxy.host.com'
]
}
Спасибо за ответ. Причина косвенного обращения: я хотел бы, чтобы прокси-сервер был определен как для самого Gradle (для загрузки зависимостей из-за корпоративного брандмауэра), так и для работающего приложения (для подключения к ресурсам, размещенным за этим корпоративным брандмауэром). Я надеялся, что смогу определить их один раз и покончить с этим. Я перейду к ручному распространению нужных мне параметров прокси-сервера и назову это хорошим.
Насколько я понимаю, приложение считывает свойства с помощью
System.getProperty(String). Он не знает о файлеgradle.properties. Как только приложение будет развернуто где-то, файлgradle.propertiesбудет недоступен, поэтому я не думаю, что это хорошее решение.