Mam wiele plików właściwości, które chcę załadować ze ścieżki klas. Istnieje jeden domyślny zestaw, do /src/main/resources
którego należy myapp.jar
. Moje springcontext
pliki oczekuje się na ścieżce klasy. to znaczy
<util:properties id="Job1Props"
location="classpath:job1.properties"></util:properties>
<util:properties id="Job2Props"
location="classpath:job2.properties"></util:properties>
Potrzebuję również opcji zastąpienia tych właściwości zewnętrznym zestawem. Mam zewnętrzny folder konfiguracyjny w cwd
. Jak na wiosnę, folder konfiguracyjny boot doc powinien znajdować się w ścieżce klasy. Ale z dokumentu nie wynika jasno, czy zastąpi on tylko applicaiton.properties
stamtąd lub wszystkie właściwości w config.
Kiedy go testowałem, tylko application.properties
są odbierane, a pozostałe nieruchomości są nadal odbierane /src/main/resources
. Próbowałem podać je jako listę oddzieloną przecinkami, spring.config.location
ale domyślny zestaw nadal nie jest zastępowany.
Jak sprawić, by wiele zewnętrznych plików konfiguracyjnych zastąpiło domyślne?
Obecnie używałem app.config.location
(właściwość specyficzna dla aplikacji) jako obejście tego problemu, którą dostarczam za pomocą wiersza poleceń. to znaczy
java -jar myapp.jar app.config.location=file:./config
i zmieniłem applicationcontext
na
<util:properties id="Job2Props"
location="{app.config.location}/job2.properties"></util:properties>
I tak robię separację pomiędzy plikiem a ścieżką klas podczas ładowania aplikacji.
EDYCJE:
//psuedo code
if (StringUtils.isBlank(app.config.location)) {
System.setProperty(APP_CONFIG_LOCATION, "classpath:");
}
Naprawdę nie chciałbym używać powyższego obejścia i sprawić, by sprężyna nadpisała wszystkie zewnętrzne pliki konfiguracyjne w ścieżce klas, tak jak ma to miejsce w przypadku application.properties
pliku.
application.properties
Zawsze będzie załadowany, zespring.config.location
można dodać dodatkowe lokalizacje konfiguracyjnych, które są zaznaczone pliki (czyli gdy kończy się/
), jednakże jeśli umieścisz oddzielone przecinkami listę tam co wskazuje na pliki te zostaną załadowane. Jest to również wyjaśnione w przewodniku Spring Boot Reference tutajOdpowiedzi:
Podczas korzystania z rozruchu sprężynowego właściwości są ładowane w następującej kolejności (patrz Konfiguracja zewnętrzna w przewodniku po rozruchu sprężynowym).
Podczas rozwiązywania właściwości (np
@Value("${myprop}")
Rozdzielanie odbywa się w odwrotnej kolejności (czyli zaczynając od 9).Aby dodać różne pliki, możesz użyć
spring.config.location
właściwości, które przyjmują rozdzieloną przecinkami listę plików właściwości lub lokalizację pliku (katalogi).Ten powyżej doda katalog, w którym będą sprawdzane
application.properties
pliki.Spowoduje to dodanie 2 plików właściwości do ładowanych plików.
Domyślne pliki konfiguracyjne i lokalizacje są ładowane przed dodatkowymi określonymi plikami
spring.config.location
, co oznacza, że te ostatnie zawsze zastępują właściwości ustawione we wcześniejszych. (Zobacz także tę sekcję Przewodnika po sprężynach rozruchowych).AKTUALIZACJA: Ponieważ zachowanie spring.config.location teraz zastępuje domyślne, zamiast je dodawać. Aby zachować wartości domyślne, musisz użyć spring.config.additional-location. To jest zmiana w zachowaniu z 1.x na 2.x
źródło
application.properties
iapplication-[env].properties
. Nie uwzględnia innych plików właściwości. Jest to również określone w przewodniku referencyjnym (w sekcji, do której prowadzi łącze, oraz cytacie z przewodnika).config.location
iconfig.names
interakcji, chociaż prawdopodobnie wydaje się to jasne dla osób, które już wiedzą, jak wchodzą w interakcje. Czy możesz zaktualizować swoją odpowiedź, aby dodać coś do dokumentacji?spring.config.location
teraz zastępuje domyślne, zamiast dodawać do niego. Musisz użyć,spring.config.additional-location
aby zachować wartości domyślne. To jest zmiana w zachowaniu z 1.x na 2.x.W przypadku rozruchu Spring, spring.config.location działa, wystarczy dostarczyć pliki właściwości oddzielone przecinkami.
zobacz poniższy kod
w aplikacji można umieścić domyślną wersję jdbc.properties. Wersje zewnętrzne można ustawić w ten sposób.
Na podstawie wartości profilu ustawionej za pomocą właściwości spring.profiles.active zostanie pobrana wartość jdbc.host. Więc kiedy (w systemie Windows)
jdbc.host przyjmie wartość z jdbc-dev.properties.
dla
jdbc.host przyjmie wartość z jdbc.properties.
źródło
Spring boot 1.X i Spring Boot 2.X nie zapewniają tych samych opcji i zachowania w przypadku
Externalized Configuration
.Bardzo dobra odpowiedź M. Deinum odnosi się do specyfiki Spring Boot 1.
Zaktualizuję tutaj Spring Boot 2.
Źródła i porządek właściwości środowiska
Spring Boot 2 używa bardzo szczególnej
PropertySource
kolejności, która umożliwia rozsądne zastępowanie wartości. Właściwości są rozpatrywane w następującej kolejności:Aby określić zewnętrzne pliki właściwości, te opcje powinny Cię zainteresować:
Możesz użyć tylko jednej z tych 3 opcji lub połączyć je zgodnie z własnymi wymaganiami.
Na przykład w bardzo prostych przypadkach wystarczy użyć tylko właściwości specyficznych dla profilu, ale w innych przypadkach możesz chcieć użyć zarówno właściwości specyficznych dla profilu, właściwości domyślnych i
@PropertySource
.Domyślne lokalizacje plików application.properties
O
application.properties
plikach (i wariantach), domyślnie Spring ładuje je i dodaje ich właściwości w środowisku z nich w następującej kolejności:Wyższe priorytety są więc dosłownie:
classpath:/,classpath:/config/,file:./,file:./config/
.Jak używać plików właściwości o określonych nazwach?
Domyślne lokalizacje nie zawsze są wystarczające: domyślne lokalizacje, takie jak domyślna nazwa pliku (
application.properties
), mogą nie pasować. Poza tym, podobnie jak w przypadku pytania OP, może być konieczne określenie wielu plików konfiguracyjnych innych niżapplication.properties
(i wariant).Więc
spring.config.name
to nie wystarczy.W takim przypadku należy podać jawną lokalizację przy użyciu
spring.config.location
właściwości environment (czyli rozdzielonej przecinkami listy lokalizacji katalogów lub ścieżek plików).Aby być wolnym w kwestii wzorców nazw plików, przedkładaj listę ścieżek plików nad listę katalogów.
Na przykład zrób tak:
W ten sposób jest to najbardziej rozwlekłe określenie folderu, ale jest to również sposób bardzo dokładnego określenia naszych plików konfiguracyjnych i jasnego udokumentowania efektywnie używanych właściwości.
spring.config.location zastępuje teraz domyślne lokalizacje zamiast je dodawać
W przypadku Spring Boot 1
spring.config.location
argument dodaje określone lokalizacje w środowisku Spring.Ale z Spring Boot 2,
spring.config.location
zastępuje domyślne lokalizacje używane przez Spring przez określone lokalizacje w środowisku Spring, zgodnie z dokumentacją .spring.config.location
jest teraz sposobem na upewnienie się, że każdyapplication.properties
plik musi być jawnie określony.Dla plików JAR Uber, które nie powinny być pakowane
application.properties
plików plików, jest to raczej miłe.Aby zachować stare zachowanie
spring.config.location
podczas korzystania z Spring Boot 2, możesz użyć nowejspring.config.additional-location
właściwości zamiastspring.config.location
nadal dodawać lokalizacje zgodnie z dokumentacją :W praktyce
Załóżmy więc, że tak jak w przypadku pytania OP, masz 2 zewnętrzne pliki właściwości do określenia i 1 plik właściwości zawarty w pliku uber jar.
Aby używać tylko określonych plików konfiguracyjnych:
Aby dodać do nich pliki konfiguracyjne w domyślnych lokalizacjach:
classpath:/applications.properties
w ostatnim przykładzie nie jest wymagane, ponieważ domyślne lokalizacje to mają i te domyślne lokalizacje nie są tutaj nadpisywane, ale rozszerzane.źródło
application.properties
ze wszystkimi parametrami i wiele${file_name}.properties
z częściowo zdefiniowanymi zestawami właściwości. Tak więc, jeśli używasz@PropertySource
lub innych silnych linków do plików, możesz utworzyć inny plik zewnętrzny i nadpisać te właściwości (na przykład: fromclasspath:file.properties
).Spójrz na PropertyPlaceholderConfigurer, uważam, że jest jaśniejszy w użyciu niż adnotacja.
na przykład
źródło
jest to jedno proste podejście z użyciem butów sprężynowych
TestClass.java
app.properties kontekst, w wybranej lokalizacji
Twoja aplikacja do rozruchu wiosennego
i predefiniowany kontekst application.properties
możesz napisać dowolną liczbę klas konfiguracyjnych i włączać / wyłączać je po prostu ustawiając spring.profiles.active = nazwę / nazwy profilu {oddzielone przecinkami}
jak widać, wiosenny but jest świetny, wystarczy go trochę zaznajomić, warto wspomnieć, że możesz użyć @Value również na swoich polach
źródło
Miałem ten sam problem. Chciałem mieć możliwość nadpisania wewnętrznego pliku konfiguracyjnego podczas uruchamiania zewnętrznym plikiem, podobnie jak w przypadku wykrywania Spring Boot application.properties. W moim przypadku jest to plik user.properties, w którym znajdują się użytkownicy moich aplikacji.
Moje wymagania:
Załaduj plik z następujących lokalizacji (w tej kolejności)
Wymyśliłem następujące rozwiązanie:
Teraz aplikacja korzysta z zasobu classpath, ale sprawdza również zasób w innych podanych lokalizacjach. Ostatni istniejący zasób zostanie pobrany i użyty. Mogę uruchomić moją aplikację za pomocą java -jar myapp.jar --properties.location = / directory / myproperties.properties, aby użyć lokalizacji właściwości, która unosi moją łódź.
Ważny szczegół tutaj: Użyj pustego ciągu jako wartości domyślnej właściwości properties.location w adnotacji @Value, aby uniknąć błędów, gdy właściwość nie jest ustawiona.
Konwencja dla properties.location jest następująca: Użyj katalogu lub ścieżki do pliku właściwości jako properties.location.
Jeśli chcesz przesłonić tylko określone właściwości, można użyć PropertiesFactoryBean z setIgnoreResourceNotFound (true) z tablicą zasobów ustawioną jako lokalizacje.
Jestem pewien, że to rozwiązanie można rozszerzyć o obsługę wielu plików ...
EDYTOWAĆ
Tutaj moje rozwiązanie dla wielu plików :) Tak jak poprzednio, można to połączyć z PropertiesFactoryBean.
źródło
Spring boot pozwala nam pisać różne profile do pisania dla różnych środowisk, na przykład możemy mieć oddzielne pliki właściwości dla środowisk produkcyjnych, QA i lokalnych
plik application-local.properties z konfiguracjami zgodnymi z moim lokalnym komputerem to
Podobnie możemy napisać application-prod.properties i application-qa.properties tyle plików właściwości, ile chcemy
następnie napisz skrypty uruchamiające aplikację w różnych środowiskach, np
źródło
Właśnie miałem podobny problem i w końcu znalazłem przyczynę: plik application.properties miał niewłaściwe atrybuty własności i rwx. Więc kiedy tomcat uruchomił plik application.properties znajdował się we właściwej lokalizacji, ale należał do innego użytkownika:
źródło
Zmodyfikowana wersja rozwiązania @mxsb pozwalająca na definiowanie wielu plików, w moim przypadku są to pliki yml.
W mojej aplikacji-dev.yml dodałem tę konfigurację, która pozwala mi wstrzyknąć wszystkie yml, które mają w sobie -dev.yml. Może to być również lista określonych plików. „ścieżka_klasy: /test/test.yml, ścieżka_klasy: /test2/test.yml”
Pomaga to uzyskać mapę właściwości.
Jeśli jednak tak jak w moim przypadku chciałem podzielić pliki yml dla każdego profilu, załadować je i wstrzyknąć bezpośrednio do konfiguracji sprężyn przed inicjalizacją fasoli.
... Masz pomysł
Komponent jest nieco inny
}
źródło
Jeśli chcesz przesłonić wartości określone w pliku application.properties, możesz zmienić aktywny profil podczas uruchamiania aplikacji i utworzyć plik właściwości aplikacji dla profilu. Na przykład określmy „przesłonięcie” aktywnego profilu, a następnie, zakładając, że utworzyłeś nowy plik właściwości aplikacji o nazwie „application-override.properties” w katalogu / tmp, możesz uruchomić
Wartości określone w spring.config.location są oceniane w odwrotnej kolejności. Tak więc w moim przykładzie obszar klasy jest oceniany jako pierwszy, a następnie wartość pliku.
Jeśli plik jar i plik „application-override.properties” znajdują się w bieżącym katalogu, możesz po prostu użyć
ponieważ Spring Boot znajdzie dla Ciebie plik właściwości
źródło
Uważam, że jest to przydatny wzór do naśladowania:
Tutaj zastępujemy użycie „application.yml”, aby użyć „application-MyTest_LowerImportance.yml”, a także „application-MyTest_MostImportant.yml”
(Spring będzie również szukał plików .properties)
Dodatkową korzyścią są również ustawienia debugowania i śledzenia w osobnej linii, dzięki czemu można je w razie potrzeby zakomentować;]
Debug / trace są niezwykle przydatne, ponieważ Spring zrzuca nazwy wszystkich ładowanych plików i tych, które próbuje załadować.
W konsoli w czasie wykonywania zobaczysz takie linie:
źródło
Kiedy próbowałem to rozgryźć, napotkałem wiele problemów. Oto moja konfiguracja,
Wersja deweloperska: Windows 10, Java: 1.8.0_25, Spring Boot: 2.0.3.RELEASE, Spring: 5.0.7.RELEASE
Odkryłem, że wiosna trzyma się koncepcji „Rozsądne wartości domyślne konfiguracji”. Oznacza to, że musisz mieć wszystkie swoje pliki własności jako część pliku wojny. Tam możesz je zastąpić, używając właściwości wiersza polecenia „--spring.config.additional-location”, aby wskazać zewnętrzne pliki właściwości. Ale to NIE DZIAŁA, jeśli pliki właściwości nie są częścią oryginalnego pliku wojny.
Kod demonstracyjny: https://github.com/gselvara/spring-boot-property-demo/tree/master
źródło