Как разрешить заполнитель при запуске приложения на основе Spring?

Коллеги, у меня есть Java-конфигурация Spring:

@Configuration
@EnableTransactionManagement
@ComponentScan (basePackages = {"com.abc.dirint"})
@PropertySource("classpath:/settings/${env}/dir.properties")
@EnableScheduling
public class DirConfig {

    private static final Logger log = LoggerFactory.getLogger(DirConfig.class);

    @Autowired
    private Environment environment;

     @Bean
        public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() throws IOException {
            PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
    propertySourcesPlaceholderConfigurer.setIgnoreUnresolvablePlaceholders(true);
            return propertySourcesPlaceholderConfigurer;
        }


        /*Beans follow...*/ 

        }

Когда я выполню mvn clean package -Denv=dev он запускает тесты и создает проект без каких-либо ошибок.

Теперь я хотел бы запустить скомпилированную флягу. Я исполняю java -jar dir-integration-1.2-SNAPSHOT.jar -Denv=dev и программа завершается неудачно (это ожидается) с помощью следующей трассировки стека:

Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.abc.dirint.DirConfig]; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'env' in string value "classpath:/settings/${env}/dir.properties"
        at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:180)

Когда я бегу $ java -jar dir-integration-1.2-SNAPSHOT.jar --env=dev результат следующий:

Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.abc.dirint.DirConfig]; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'env' in string value "classpath:/settings/${env}/dir.properties"
        at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:180)
        at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:308)
        at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:228)
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:270)
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:93)
        at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:686)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:524)
        at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:84)
        at com.abc.dirint.AdApp.main(AdApp.java:19) Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'env' in string value "classpath:/settings/${env}/dir.properties"
        at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174)
        at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126)
        at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:236)
        at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210)
        at org.springframework.core.env.AbstractEnvironment.resolveRequiredPlaceholders(AbstractEnvironment.java:571)
        at org.springframework.context.annotation.ConfigurationClassParser.processPropertySource(ConfigurationClassParser.java:379)
        at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:

Что я должен сделать, чтобы получить свойства из указанного файла свойств во время работы приложения?

1 ответ

Решение

От java -h

Usage: java [-options] class [args...]
           (to execute a class)
   or  java [-options] -jar jarfile [args...]
           (to execute a jar file)
where options include:
...
    -D<name>=<value>
                  set a system property

Поэтому правильная команда для запуска вашего jar с указанным системным свойством должна быть java -Denv=dev -jar dir-integration-1.2-SNAPSHOT.jar вместо


И вы должны знать, что, используя mvn ... -Denv=dev против java -Denv=dev ... это две совершенно разные вещи.

С mvn, замена заполнителя происходит во время компиляции, что означает, что финальный файл jar будет содержать @PropertySource("classpath:/settings/dev/dir.properties")

Однако ваш второй подход - сохранить заполнитель в скомпилированном классе и полагаться на Spring для выполнения замены во время выполнения.

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