2015-03-17 2 views
16

У меня есть приложение для загрузки весны, которое я хочу запустить с внешним конфигурационным файлом. Когда я запускаю его как банку (со встроенным контейнером сервлетов), все в порядке. Но я хочу запустить его под внешним контейнером сервлетов (Tomcat), и здесь у меня проблема с внешней конфигурацией. Я попробовал @PropertySource, но в этом случае приложение получает только свойства, отсутствующие в конфигурации военного файла: внешняя конфигурация не переопределяет внутреннюю конфигурацию. Итак, вопрос: как настроить внешнюю конфигурацию, которая переопределит внутреннюю конфигурацию?Внешняя конфигурация для приложения весенней загрузки

ответ

20

Возможно, вы используете внешнюю конфигурацию в форме application.properties в текущем каталоге, когда вы используете приложение в качестве банки. Однако «текущий каталог» не очень полезен при развертывании в качестве войны во внешнем коте. Даже если вы узнаете, что такое текущий каталог, это, скорее всего, одно и то же место для всех приложений, работающих в этом tomcat, поэтому, когда вы запускаете более одного приложения, это не будет работать очень хорошо.

Что мы делаем здесь, это объявить два PropertySources на нашем приложении:

@PropertySources({@PropertySource(value={"classpath:internal.properties"}), @PropertySource(value={"file:${application.properties}"})}) 

internal.properties содержит «встроенный» значения по умолчанию для СВОЙСТВ. Второй PropertySource - это файл, содержащий внешнюю конфигурацию. Обратите внимание, как имя файла само по себе является свойством.

Определит это наружно в Context элементе нашего приложения (в коте):

<Context docBase="/path/to/your/war/your.war"> 
    <Parameter name="application.properties" value="/path/to/your/properties/application.properties"/> 
</Context> 

Это позволяет иметь несколько приложений, работающие в коте, каждое приложение, используя его файл собственных внешних свойств. Вы можете даже иметь несколько экземпляров того же приложения, работающего с различными свойствами.

+1

Спасибо за ваш ответ. Да, эта конфигурация будет работать, и, как я уже упоминал в своем вопросе, я пробовал это решение. недостатком этого решения является то, что внешняя конфигурация не переопределяет внутреннюю конфигурацию. Вопрос в том, как установить приоритет внешней конфигурации? –

+0

Это должно сработать, это для меня. Обратите внимание, что я не использую имя по умолчанию application.properties, которое будет иметь другой приоритет. Вы уверены, что попробовали именно то, что в моем ответе? –

+0

Да, это работает! :) Я изменил внутреннее имя конфигурации на internal.properties и работает отлично. Есть ли способ перезагрузить внешнюю конфигурацию во время выполнения? –

14

Для экстернализации загрузочной application.properties пружины при развертывании в качестве военного файла вы можете установить spring.config.location в начале, когда приложение Spring загрузки настраиваются:

public class Application extends SpringBootServletInitializer { 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder springApplicationBuilder) { 
     return springApplicationBuilder 
       .sources(Application.class) 
       .properties(getProperties()); 
    } 

    public static void main(String[] args) { 

     SpringApplicationBuilder springApplicationBuilder = new SpringApplicationBuilder(Application.class) 
       .sources(Application.class) 
       .properties(getProperties()) 
       .run(args); 
    } 

    static Properties getProperties() { 
     Properties props = new Properties(); 
     props.put("spring.config.location", "classpath:myapp1/"); 
     return props; 
    } 

Для получения более подробной информации проверить это solution.

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылка для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – Necreaux

+0

Ok @Necreaux основные части были добавлены –

+0

@Necreaux Я не понимаю downvote после добавления основных частей? Что-то еще не хватает? –

6

Spring Boot предлагает many ways для указания местоположения вашей недвижимости, не требуется изменять источники.

Yo можно определить значение spring.config.location, например:

  • В ваших tomcat/conf/Catalina/<host> контекстных дескрипторами:

    <Context> 
        <Parameter name="spring.config.location" value="/path/to/application.properties" /> 
    </Context> 
    
  • В качестве параметра виртуальной машины Java в файле setenv.sh кот:

    -Dspring.config.location=/path/to/application.properties 
    
  • В качестве переменной окружения SPRING_CONFIG_LOCATION.

Смежные вопросы