Spring Boot прочитал файл свойств из командной строки. Не удалось разрешить заполнитель «ConfigPath»

Я пытаюсь прочитать файл конфигурации из командной строки. В основном я делаю это:

public static void main(String[] args) {
        if (args.length > 0) {
            SpringApplication.run(HeliosAdminBackendApplication.class, args);
        } else {
            System.out.println("Error");
            System.exit(0); 
        }       
    }

И, после этого вопроса, я создал класс MyConfig вот так:

import lombok.Getter;

@Configuration
@ConfigurationProperties
@PropertySource(value = "file:${ConfigPath}")
public class MyConfig {

     @Getter
     @Value("${property_name}")
     private String myproperty;

}

Затем я создал файл .jar, затем зашел в папку, содержащую банку, и попытался запустить ее, выполнив:

java -jar myapp.jar --spring.config.location=file:application.yml

Мой файл application.yml — это та же папка, что и в банке. Я также установил путь к C:/my/path/to/folder/, но ошибка сохраняется. Путь прописан неправильно? Или мне нужно что-то добавить/изменить в коде?

РЕДАКТИРОВАТЬ

Полная трассировка стека:

Exception in thread "main" java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51) Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [it.sysdata.helios_backend_admin.HeliosAdminBackendApplication]; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'ConfigPath' in value "file:${ConfigPath}" at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:181) at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:315) at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:232) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:275) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:95) at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:691) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:528) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) at it.sysdata.helios_backend_admin.HeliosAdminBackendApplication.main(HeliosAdminBackendApplication.java:24) ... 8 more Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'ConfigPath' in value "file:${ConfigPath}" at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:172) at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:124) at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:237) at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:211) at org.springframework.core.env.AbstractEnvironment.resolveRequiredPlaceholders(AbstractEnvironment.java:575) at org.springframework.context.annotation.ConfigurationClassParser.processPropertySource(ConfigurationClassParser.java:450) at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:271) at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:242) at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:191) at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:295) at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:242) at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:199) at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:167) ... 21 more

Сохраните файл в папке ресурсов и создайте банку

DEBENDRA DHINDA 22.05.2019 12:47

Нет, мне нужно, чтобы файл был внешним и передал путь при запуске jar...

Usr 22.05.2019 12:48

Попробуйте java -jar {jar-имя-файла}.jar --spring.config.location=file:///C:/{file-path}/{file-name}.‌​yml ИЛИ приложение java -jar. jar --spring.config.location=xxx.yml

DEBENDRA DHINDA 22.05.2019 13:00

Привет, не работает... Я обновил вопрос с полной трассировкой стека.

Usr 22.05.2019 14:07

это не полная трассировка стека... читайте внизу, там написано "еще 21"

Toerktumlare 22.05.2019 14:55

Я думаю, вы должны использовать "--spring.config.additional-location" для чтения внешней конфигурации

Rahul Wagh 22.05.2019 14:58

@RahulWagh, вот и все. Большое спасибо. Почему я должен использовать «дополнительно», а не просто местоположение? У меня нет другого файла .yml в моем проекте

Usr 22.05.2019 15:00

Добро пожаловать, я разместил подробный ответ ниже. Поскольку этот раздел комментариев слишком мал, чтобы объяснять, и если вам нравится ответ и вы можете решить свою проблему, пожалуйста, примите его.

Rahul Wagh 22.05.2019 16:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
8
1 234
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот ответ на ваш вопрос о том, почему я должен использовать «дополнительно», а не только местоположение?

Прежде всего, когда вы когда-либо используете spring.config.location для загрузки свойств конфигурации, spring-boot пытается выполнить поиск конфигурации в пути к классам или в каталоге конфигурации. Вот порядок поиска -

            file:./config/
            file:./
            classpath:/config/
            classpath:/

Но помните, если вы используете spring.config.locaton, он всегда будет искать либо «путь к классам», либо «config», а не внешнюю конфигурацию.

Чтобы загрузить внешнюю конфигурацию / пользовательскую конфигурацию, загрузка spring предоставляет «spring.config.additional-location», который выполняет поиск конфигурации в следующем порядке:

            file:./custom-config/
            classpath:custom-config/ (This is was your case)
            file:./config/
            file:./
            classpath:/config/
            classpath:/

Надеюсь, теперь я получил ответ, зачем использовать «spring.config.additional-location» для загрузки внешней конфигурации.

не думайте, что этот ответ полностью правильный: java -jar myapp.jar --spring.config.location=file:./application.yml должен работать, обратите внимание на ./ при использовании spring.config.additional-location внешние свойства добавляются к внутренним свойствам

Dirk Deyne 22.05.2019 16:30

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

Как с помощью Spring Security перенаправить зарегистрированного пользователя на его главную страницу, а незарегистрированного пользователя на другую
Развернуть весеннее загрузочное приложение на tomcat, должен ли я заменить все URL-адреса моего приложения
Как убедиться, что аннотация @Scheduled присутствует в методе
Как использовать тип карты Cassandra в Java
Почему файл pom.xml выдает неизвестную ошибку
Как интегрировать фабричный метод, который принимает Class<T> и производит T в Spring
Как обойти процесс аутентификации Ldap при доступе к базе данных в памяти
Eager fetch выполняет левое соединение в спящем режиме, но запускает отдельные запросы sql в springboot/JPA
Как добавить таймер к моей работе gitlab-ci, чтобы она остановилась в течение 1 минуты в gitlab-ci.yml
Настройте maven для упаковки толстой банки без распаковки зависимостей в проекте vertx, как это делает spring boot