Spring Boot читает файл свойств из командной строки Не удалось разрешить заполнитель ConfigPath - PullRequest
0 голосов
/ 22 мая 2019

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

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, затем вошел в папку, содержащую jar, и попытался запустить его, выполнив:

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

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

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

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

Исключение в потоке "main" java.lang.reflect.InvocationTargetException в java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Метод) в java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) в java.base / jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.base / java.lang.reflect.Method.invoke (Method.java:566) в org.springframework.boot.loader.MainMethodRunner.run (MainMethodRunner.java:48) на org.springframework.boot.loader.Launcher.launch (Launcher.java:87) на org.springframework.boot.loader.Launcher.launch (Launcher.java:50) в org.springframework.boot.loader.JarLauncher.main (JarLauncher.java:51) Вызванный: org.springframework.beans.factory.BeanDefinitionStoreException: Failed проанализировать класс конфигурации [It.sysdata.helios_backend_admin.HeliosAdminBackendApplication]; Вложенное исключение - java.lang.IllegalArgumentException: не удалось разрешить местозаполнитель 'ConfigPath' в значении "file: $ {ConfigPath}" в org.springframework.context.annotation.ConfigurationClassParser.parse (ConfigurationClassParser.java:181) в org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions (ConfigurationClassPostProcessor.java:315) в org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry (ConfigurationClassPostProcessor.java:232) в org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors (PostProcessorRegistrationDelegate.java:275) в org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors (PostProcessorRegistrationDelegate.java:95) в org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors (AbstractApplicationContext.java:691) в org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:528) в org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh (ServletWebServerApplicationContext.java:142) в org.springframework.boot.SpringApplication.refresh (SpringApplication.java:775) в org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:397) в org.springframework.boot.SpringApplication.run (SpringApplication.java:316) в org.springframework.boot.SpringApplication.run (SpringApplication.java:1260) в org.springframework.boot.SpringApplication.run (SpringApplication.java:1248) at it.sysdata.helios_backend_admin.HeliosAdminBackendApplication.main (HeliosAdminBackendApplication.java:24) ... еще 8 Причина: java.lang.IllegalArgumentException: Не удалось разрешить заполнитель ConfigPath в значении "файл: $ {ConfigPath}" в org.springframework.util.PropertyPlaceholderHelper.parseStringValue (PropertyPlaceholderHelper.java:172) в org.springframework.util.PropertyPlaceholderHelper.replacePlaceholder (PropertyPlaceholderHelper.java:124)в org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders (AbstractPropertyResolver.java:237) в org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders (AbstractPropertyResolver.java:211) в org.springframework.core.env.AbstractEnvironment.resolveRequiredPlaceholder (AbstractEnvironment.java:575) в org.springframework.context.annotation.ConfigurationClassParser.processPropertySource (ConfigurationClassParser.java:450) в org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass (ConfigurationClassParser.java:271) в org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass (ConfigurationClassParser.java:242) в org.springframework.context.annotation.ConfigurationClassParser.parse (ConfigurationClassParser.java:191) в org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass (ConfigurationClassParser.java:295) в org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass (ConfigurationClassParser.java:242) в org.springframework.context.annotation.ConfigurationClassParser.parse (ConfigurationClassParser.java:199) в org.springframework.context.annotation.ConfigurationClassParser.parse (ConfigurationClassParser.java:167) ... еще 21

1 Ответ

1 голос
/ 22 мая 2019

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

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

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

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

Чтобы загрузить внешнюю конфигурацию / пользовательскую конфигурацию, тогда весенняя загрузка предоставляет «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» для загрузки внешней конфигурации.

...