Plik application.properties specyficzny dla środowiska w aplikacji Spring Boot [zamknięty]

85

W mojej aplikacji Spring Boot chcę utworzyć plik właściwości specyficznych dla środowiska. Rodzaj opakowania mojej aplikacji na wojnie i wykonuję ją we wbudowanym tomcat. Używam oczek i wykonuję główny z samego o.

  1. Czy mogę mieć plik właściwości specyficznych dla środowiska, taki jak aplikacja - $ {wartość-env} .properties?

W powyższym przypadku wartość-env będzie miała wartości lokalne / devl / test / prod

  1. Gdzie ustawić plik wartości env? W przypadku lokalnego mogę ustawić go jako argument jvm za pośrednictwem sts

  2. Kto czyta application.properties w aplikacji Spring Boot.

  3. Jak załadować plik właściwości specyficznych dla środowiska? Na przykład, jeśli ustawię identyfikator UID bazy danych, pwd, schemat itp. W pliku właściwości specyficznym dla środowiska, w takim przypadku czy źródło danych będzie w stanie zrozumieć zawarte w nim właściwości?

  4. Czy mogę używać pliku application.properties i application-local.properties w tym samym czasie?

user3534483
źródło
Czytałeś to ? Zasadniczo jest obsługiwany po wyjęciu z pudełka.
M. Deinum,
Zrobiłem, ale to nie działa. Mam więc plik application.properties i plik application-local.properties w tej samej lokalizacji. Plik application-local.properties zawiera właściwości związane z db. application.properties zawiera jedną właściwość dotyczącą wartości MVC sprężyny. Dodałem również -Dprofile = local jako konfigurację debugowania, ale ta wartość nie jest pobierana
user3534483
ponieważ musisz ustawić, spring.active.profileswięc użyj -Dspring.active.profiles=local. zamiast.
M. Deinum,
Nie ma sukcesu proszę pana. więc zamiast -Dprofile używam teraz -Dspring.active.profiles = local. Następnie w moim pliku konfiguracyjnym próbuję pobrać wartość String driverClassName = env.getProperty ("driverClassName"); env to środowisko od wiosny
user3534483
1
Przepraszam, mój zły, pomieszałem to wokół :).
M. Deinum,

Odpowiedzi:

170

Spring Boot obsługuje już właściwości oparte na profilach .

Po prostu dodaj application-[profile].propertiesplik i określ profile do użycia za pomocą spring.profiles.activewłaściwości.

-Dspring.profiles.active=local

Spowoduje to załadowanie application.propertiesi application-local.propertiesz tymi ostatnimi nadpisującymi właściwości z pierwszego.

M. Deinum
źródło
1
Czy możemy zastąpić użycie właściwości aplikacji innym plikiem dla określonego profilu bez ładowania obu z nich? Na przykład do testów lub deweloperów?
Hassam Abdelillah
1
M. Deinum, ja też mam podobny problem, mam application.yml i application-qa.yml i dałem -Dspring.profiles.active = qa, oba pliki są odczytywane, ale właściwości z application-qa.yml nie nadpisują właściwości z application.yml, zawsze widzę właściwości tylko z application.yml? czy istnieje sposób na określenie priorytetu?
Suresh Chaganti
5
Cześć Oboje, To może rozwiązać twoje problemy. docs.spring.io/spring-boot/docs/current/reference/html/ ... Przykład: mkyong.com/spring-boot/ ...
Anand Varkey Philips
Piszę kod dla aws lambda i mogę przekazać ten klucz = wartość jako wartość środowiska - do której można uzyskać dostęp za pomocą System.getenv () - czy to zadziała?
Abdeali Chandanwala
Mam 4 pliki aplikacji- {profil} .properties. I chcę uruchomić ten sam plik jar w innym środowisku, powiedzmy dev, test, prod. Więc nie mogę użyć -Dspring.profiles.active = local. Proszę, popraw mnie, jeśli czegoś mi brakuje.
Ashish Burnwal,
24

Tak, możesz. Ponieważ używasz wiosny, sprawdź @PropertySourceanotację.

Anotuj konfigurację za pomocą

@PropertySource("application-${spring.profiles.active}.properties")

Możesz to nazwać, jak chcesz, i dodać wiele plików nieruchomości, jeśli chcesz. Może być fajne, jeśli masz więcej zestawów i / lub wartości domyślnych, które należą do wszystkich środowisk (można je również zapisać za pomocą @PropertySource {..., ..., ...}).

@PropertySources({
  @PropertySource("application-${spring.profiles.active}.properties"),
  @PropertySource("my-special-${spring.profiles.active}.properties"),
  @PropertySource("overridden.properties")})

Następnie możesz uruchomić aplikację ze środowiskiem

-Dspring.active.profiles=test

W tym przykładzie nazwa zostanie zastąpiona właściwościami testu aplikacji i tak dalej.

Tzen
źródło
2
Problem polega na tym, że $spring.profiles.active}jest to ciąg oddzielony tablicą / przecinkiem. Może więc nie robić tego, czego oczekujesz / chcesz, gdy jest aktywnych wiele profili.
M. Deinum,
To prawda, ale działa dobrze dla dwóch profili - jednego domyślnego i jednego zdefiniowanego za pomocą PropertySource. Jeśli chodzi o bardziej zaawansowaną obsługę nieruchomości, myślę, że będziesz musiał spojrzeć poza Spring. Ponadto PropertySource jest odczytywana tylko podczas uruchamiania. Inne, bardziej zaawansowane biblioteki do obsługi właściwości mogą również zmieniać właściwości w czasie wykonywania.
Tzen
2
To zadziałało, ale nadal nie rozumiem, dlaczego musiałem to zrobić ręcznie. W jednym z moich innych repozytoriów nie musiałem tego robić.
The Java Guy
7

możemy to zrobić:

w application.yml :

spring:
  profiles:
    active: test //modify here to switch between environments
    include:  application-${spring.profiles.active}.yml

w aplikacji test.yml :

server:
  port: 5000

oraz w application-local.yml :

server:
  address: 0.0.0.0
  port: 8080

następnie rozruch wiosną uruchomi naszą aplikację tak, jak chcemy.

Mątwa
źródło
2
Czy nie zakodowałeś w ten sposób aktywnego profilu na stałe? :(
Anna Medyukh
0

My Point, IN to nie jest sposób proszący programistę o stworzenie całego środowiska związanego z jednym przejściem, co powoduje ryzyko ujawnienia konfiguracji produkcyjnej programistom końcowym

zgodnie z 12-Factor, nie powinno być specyficzne dla środowiska przebywać tylko w Enviornment.

Jak to robimy dla CI CD

  • Zbuduj Spring raz i awansuj do innego środowiska, w takim przypadku, jeśli mamy słoik wiosny ma całe środowisko, będzie to zagrożenie bezpieczeństwa, mając wszystkie zmienne środowiskowe w GIT
Karthik_Rajendiran
źródło