Получить значение из build.gradle в Spring Batch Project - PullRequest
0 голосов
/ 18 октября 2018

У меня есть некоторые данные в моем gradle.properties файле:

appVersion=1.4.31
appGroup=com.business
appName=projectName

Я хочу иметь доступ к ним в .java проекте.Я пытаюсь получить доступ к переменной следующим образом:

@Value("${appVersion}")
private int version; 

Однако, когда я пытаюсь запустить приложение из основного класса, я получаю следующую ошибку:

Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'appVersion' in value "${appVersion}"

, которая показываетчто он не может найти правильную переменную.

Попытки решить проблему

Добавление @propertySource Аннотация

Я пытался добавить это в основной класс @PropertySource(value = "file:build.gradle", ignoreResourceNotFound = true) который был неудачным.

Внесение изменений в build.gradle

Я попытался сделать следующее, взятое из this StackOverflow ответ:

processResources {
    filesMatching('application.properties'){
        expand(gradle.properties)
    }
}

Какойтакже был неудачным.

Этот ответ ниже

Я сделал то, что было сказано в этом ответе (мне пришлось добавить application.properties файл), и я получил это сообщение об ошибке:

Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Circular placeholder reference 'appVersion' in property definitions

Я думал, что это может быть перепутано с использованием тех же имен (appVersion = appVersion), поэтому я изменил строку application.properties на

version=${appVersion}

А потом в моем .java file, я изменил строку на:

@Value("${version}")
private String version;

И получил ошибку:

Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'appVersion' in value "${appVersion}"

1 Ответ

0 голосов
/ 18 октября 2018

Это должно работать:

processResources {
    filesMatching('application.properties'){
        expand(gradle.properties)
    }
}

Но похоже, что вы забыли другую часть.Это просто говорит Gradle обработать ваш файл application.properties и заменить любые найденные заполнители.Вам также необходимо поместить заполнитель в ваш application.properties:

version=${appVersion}

Тогда аннотация вашего значения должна работать (но это должна быть String, а не int)

@Value("${version}")
private String version; 

Наконец, поскольку вы запускаете через IDEA, вам может потребоваться убедиться, что gradle:processResources запускается до запуска вашего приложения, чтобы у Gradle была возможность заменить заполнитель, который вы указали в application.properties.Вы должны иметь возможность использовать раздел « Before Launch Options » в своей конфигурации запуска, чтобы IDEA запускала задачу Gradle processResources после задачи сборки.Это должно привести к правильной замене заполнителя каждый раз, когда вы запускаете приложение.


Кроме того, просто чтобы помочь с пониманием.Gradle - это система сборки для приложения, она не является частью самого приложения.Как только проект построен, все, что связано с Gradle, не имеет значения.Вот почему вы не можете просто сделать @Value("${appVersion}") и заставить его работать.Приложение / Spring ничего не знает об инструменте, который используется для его создания (и не должно).Поэтому вам нужно каким-то образом во время сборки внедрить версию проекта Gradle в приложение, если вы хотите получить к нему доступ.Есть несколько способов сделать это, но метод обработки ресурсов, описанный выше, является довольно распространенным подходом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...