Значения Spring Profile смешиваются

Я использую Spring Boot 1.4.3.RELEASE и gradle 2.13 для разработки API. В локальной среде профиль «local» работает отлично, но у меня возникают проблемы при развертывании кода на сервере Linux/Unix.

Вот мой application.yml с двумя профилями: dev и local

---

spring:
  profiles:
    active: dev

server:
  context-path: /api/v1
  port: 8080

build:
  version: 1.0.0

cache:
  storage:
    path: '/home/user/content/storage/'


---

spring:
  profiles:
    active: local

server:
  context-path: /content-delivery/api/v1
  port: 8081

build:
  version: 1.0.0

cache:
  storage:
    path: '/Yogen/api/code/cachedData'

Команда, которую я использую для развертывания моего файла войны:

jdk1.8.0_112/bin/java -jar _-Dspring.profiles.active=dev content-delivery.jar

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

    01:56:16.557 INFO  ContentDeliveryApplication - The following profiles are active: dev
............
02:00:48.182 INFO  PropertyPlaceholderConfigurer - Loading properties file from file [/home/542596/content-api/resources/app-dev.properties]
    02:00:51.939 INFO  PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.ws.config.annotation.DelegatingWsConfiguration' of type [class org.springframework.ws.config.annotation.DelegatingWsConfiguration$$EnhancerBySpringCGLIB$$290c5e2d] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
    02:00:55.736 INFO  AnnotationActionEndpointMapping - Supporting [WS-Addressing August 2004, WS-Addressing 1.0]
    02:01:25.559 INFO  PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [class org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$a08e9c2b] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
    02:01:56.522 INFO  TomcatEmbeddedServletContainer - Tomcat initialized with port(s): 8081 (http)
    02:01:57.669 INFO  StandardService - Starting service Tomcat
    02:01:57.877 INFO  StandardEngine - Starting Servlet Engine: Apache Tomcat/8.5.6
    02:02:11.228 INFO  [/content-delivery/api/v1] - Initializing Spring embedded WebApplicationContext
    02:02:11.228 INFO  ContextLoader - Root WebApplicationContext: initialization completed in 353263 ms
    02:02:19.412 INFO  ServletRegistrationBean - Mapping servlet: 'dispatcherServlet' to [/]
    02:02:19.517 INFO  ServletRegistrationBean - Mapping servlet: 'messageDispatcherServlet' to [/services/*]
    02:02:19.829 INFO  FilterRegistrationBean - Mapping filter: 'metricsFilter' to: [/*]
    02:02:19.829 INFO  FilterRegistrationBean - Mapping filter: 'characterEncodingFilter' to: [/*]
    02:02:19.829 INFO  FilterRegistrationBean - Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
    02:02:19.829 INFO  FilterRegistrationBean - Mapping filter: 'httpPutFormContentFilter' to: [/*]
    02:02:19.829 INFO  FilterRegistrationBean - Mapping filter: 'requestContextFilter' to: [/*]
    02:02:19.829 INFO  FilterRegistrationBean - Mapping filter: 'webRequestLoggingFilter' to: [/*]
    02:02:19.829 INFO  FilterRegistrationBean - Mapping filter: 'applicationContextIdFilter' to: [/*]
    02:02:46.283 ERROR EhcacheManager - Initialize failed.
    02:02:46.284 WARN  AnnotationConfigEmbeddedWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jsonObjectCacheManager': Invocation of init method failed; nested exception is org.ehcache.StateTransitionException: Directory couldn't be created: /Yogen/api/code/cachedData/cachedData
    02:02:46.285 INFO  StandardService - Stopping service Tomcat
    02:02:47.528 INFO  AutoConfigurationReportLoggingInitializer -

    Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
    02:02:48.103 ERROR SpringApplication - Application startup failed
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jsonObjectCacheManager': Invocation of init method failed; nested exception is org.ehcache.StateTransitionException: Directory couldn't be created: /Yogen/api/code/cachedData/cachedData
            at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:137) ~[spring-beans-4.3.5.RELEASE.jar!/:4.3.5.RELEASE]

PropertyPlaceholderConfigurer настроен следующим образом:

@Configuration
public class PropertyConfiguration {

    @Bean
    @Profile("dev")
    public static PropertyPlaceholderConfigurer developmentPropertyPlaceholderConfigurer() {
        PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer();
        configurer.setLocation(new FileSystemResource("/home/542596/content-api/resources/app-dev.properties"));
        configurer.setIgnoreUnresolvablePlaceholders(true);
        return configurer;
}
}

Консоль показывает, что считываемый файл свойств правильный, а профиль — «dev», но порт запущен, а контекст-путь и другие значения извлекаются из профиля «local», а не из профиля «dev».

Что мне не хватает?? Спасибо.


person Yogen Rai    schedule 14.01.2017    source источник
comment
Вы пытались в этом файле yml просто использовать spring.profiles: dev вместо spring.profiles.active: dev? То же самое для местного   -  person Magd Kudama    schedule 14.01.2017
comment
Вы не должны регистрировать свои собственные PropertyPlaceholderConfigurer использовать функции, предоставляемые весенней загрузкой, вместо того, чтобы обходить их.   -  person M. Deinum    schedule 15.01.2017
comment
@MagdKudama это не сработало и не должно работать, потому что я уже зарегистрировался как «активный», а ключ «spring.profiles.active:» не может быть сопоставлен как «spring.profiles:» :)   -  person Yogen Rai    schedule 16.01.2017
comment
@M.Deinum В выпуске Github #6457 Сниколл ясно упомянул мы можем использовать PropertyPlaceholderConfigurer вместо PropertySourcesPlaceholderConfigurer :) и мне это очень подходит :)   -  person Yogen Rai    schedule 16.01.2017
comment
Я нигде не говорил, что вы не можете ... Я говорю, что вам не следует и лучше использовать способ загрузки файлов по умолчанию, используя вместо этого @PropertySource.   -  person M. Deinum    schedule 16.01.2017


Ответы (3)


Как заявил @Barath, вы не можете разделить свойства профиля в одном файле application.yml. Создайте файл yml для каждого профиля, назовите его следующим образом.

application-{profile}.yml

Я бы не стал использовать bootstrap.yml, чтобы указать, какой профиль загружать, поскольку вы захотите, если это возможно, внедрить его, поэтому предпочтительнее передать его на виртуальную машину через -Dspring.profiles.active=dev.

person lane.maxwell    schedule 15.01.2017

Ваши профили переопределяются.

Лучше ускорьте свое приложение, используя bootstrap.yml

и иметь два application.yml следующим образом:

application-dev.yml
application-local.yml

установите профили в bootstrap.yml, чтобы решить, какой файл свойств загружать:

    spring:
         profiles:
             active : dev # choose which application properties to load dev/local
person Barath    schedule 14.01.2017
comment
Спасибо, @Barath, я разделил конфигурации среды на соответствующие файлы, и у меня это сработало. Но я не хочу использовать bootstrap.yml, потому что мне нужно поработать над экстернализацией позже :) - person Yogen Rai; 16.01.2017

У нас также есть другой вариант, похожий на ответ @Maxwell, вместо передачи профиля через свойство VM:

у вас могут быть следующие файлы:

application.yml 
application-dev.yml
application-local.yml

И определите профиль в application.yml:

spring:
    profiles:
       active : dev 

Это обеспечивает загрузку application.yml, а также application-dev.yml.

person Barath    schedule 16.01.2017