Gradle.properties не переданы моему Java-приложению

Проблема

У меня есть файл 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
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
520
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

вы можете получить доступ, хотя это не очень хорошая идея, так как этот файл должен хранить свойства, которые будут использоваться только для задач 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

Насколько я понимаю, приложение считывает свойства с помощью System.getProperty(String). Он не знает о файле gradle.properties. Как только приложение будет развернуто где-то, файл gradle.properties будет недоступен, поэтому я не думаю, что это хорошее решение.

britter 12.06.2019 21:08

@britter Если он не добавит этот файл в ресурсы в сценарии gradle. Но я предложил добавить эти свойства в свойства приложения в /src/main/resources. Я просто пытался показать способ получить этот файл или любой другой файл, если это то, что ему действительно нужно.

Brother 13.06.2019 07:45
Ответ принят как подходящий

Системные свойства, определенные в 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 (для загрузки зависимостей из-за корпоративного брандмауэра), так и для работающего приложения (для подключения к ресурсам, размещенным за этим корпоративным брандмауэром). Я надеялся, что смогу определить их один раз и покончить с этим. Я перейду к ручному распространению нужных мне параметров прокси-сервера и назову это хорошим.

gmacster 13.06.2019 16:00

Другие вопросы по теме