2017-01-04 21 views
7

SpringApplication załaduje właściwości z application.properties pliki w następujących miejscach i dodać je do wiosny Środowiska:Jak udostępnić plik application.properties w serwerze WWW Tomcat na wiosnę?

- A /config subdirectory of the current directory. 
- The current directory 
- A classpath /config package 
- The classpath root 

lista jest sortowana według pierwszeństwa (właściwości określone w miejscach wyżej na liście nadpisać te zdefiniowane w niższych lokalizacjach).

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-application-property-files

Pytanie: po uruchomieniu pliku war na serwerze tomcat: Jak mogę dodać dodatkową lokalizację application.propertiespoza ścieżce klasy lub kontenera Tomcat, jak d:\application.properties?

Niestandardowa lokalizacja powinna mieć najwyższy priorytet względem powyższych lokalizacji.

Problem: Mogłem oczywiście dodać folder /config w mojej wybuchłej wojnie w folderze tomcat webapps, ale wtedy straciłbym dowolną konfigurację, jeśli folder webapps zostanie wyczyszczony i wojna zostanie ponownie wdrożona.

Dlatego chciałbym dodać dodatkową lokalizację na zewnątrz.

+0

czy próbowałeś wstawić 'application.propeties' na ścieżce klas Tomcat? –

+0

Ale jeśli mam wiele plików 'wojennych ', a każda z nich ma' application.properties', gdzie mógłbym je umieścić, bez przesłonięcia się nawzajem? – membersound

+1

Możesz podać położenie pliku zewnętrznego podczas uruchamiania słoika. 'java -jar myproject.jar -spring.config.location = D:/application.properties' – Jobin

Odpowiedz

1

musiałem to zrobić kilka razy, a najlepszym rozwiązaniem znalazłem jest do konfigurowania katalogu zewnętrznego jako zasobu ścieżki klasy w pojemniku:

Tomcat classpath

Następnie, w miejscu katalogu zasobów chcesz uzewnętrznić i wszystko będzie dobrze. Aby załadować zasobu wiosną, można to zrobić w ten sposób:

<beans:bean id="externalProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
      <beans:property name="location" value="classpath:[my-application-name]/applicationProperties.properties" /> 
      <beans:property name="placeholderPrefix" value="!applicationProperties{" /> 
      <beans:property name="placeholderSuffix" value="}" /> 
     </beans:bean> 

Widać, że, jak pan powiedział, że może chcesz mieć wiele aplikacji wdrożonych w każdym tomcat, można po prostu utworzyć strukturę katalogów w Folder można ustawić w ścieżce klasy, aby zachować inny application.properties dla każdej aplikacji

enter image description here

w przypadku, gdy chcesz zachować dinamically aplikację nazwa sekcji w konfiguracji wiosennym war, można to zrobić na kilka sposobów, w trakcie packagi ng etap w maven lub nawet przy użyciu ścieżki kontekstowej aplikacji

3

Dla mnie najprostszym sposobem na to było umieszczenie pliku kontekstowego w folderze konfiguracyjnym Tomcat. Na przykład, jeśli aplikacja działa pod ścieżką root (np. http://your_domain.com/), musisz utworzyć plik [path_to_your_tomcat]/conf/Catalina/localhost/ROOT.xml. Jeśli aplikacja działa w innej ścieżce, na przykład http://your_domain.com/example_path, plik powinien mieć nazwę taką jak ta [path_to_your_tomcat]/conf/Catalina/localhost/example_path.xml. Wewnątrz tego pliku można określić ścieżkę do zewnętrznego pliku application.properties, który można umieścić w dowolnym miejscu na dysku twardym.

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <Environment name="spring.config.location" value="file:/path/to/your/application/properties/file/" type="java.lang.String"/> 
</Context> 
4

Można ustawić zmienną środowiskową spring_config_location wskazujący do folderu zawierającego plik application.properties.

W przypadku Tomcat można to zrobić poprzez dodanie następującej linii do pliku <TOMCAT_HOME>/bin/setenv.sh (utwórz plik jeśli brakuje):

export spring_config_location=/usr/local/tomcat/conf/ 

Umieść plik właściwości w tym folderze. Jeśli masz wiele aplikacji, możesz ustawić unikalną nazwę pliku właściwości każdej aplikacji. W przypadku aplikacji Spring Boot zrobiłem to w następujący sposób:

@SpringBootApplication 
public class MyApplication { 

    public static void main(String[] args) { 
     System.setProperty("spring.config.name", "my-app"); 
     SpringApplication.run(MyApplication.class, args); 
    } 
} 

To wybierze nową nazwę po uruchomieniu z BOOT. Aby mieć nazwę skonfigurowany gdy wdrożony na Tomcat też zastąpić Konfiguruj SpringBootServletInitializer tak:

public class ServletInitializer extends SpringBootServletInitializer { 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(MyApplication.class).properties("spring.config.name: my-app"); 
    } 

} 

Wtedy nazwa pliku właściwości jak: my-app.properties. Zamiast domyślnej nazwy Spring będzie tego szukał. Możesz umieścić wszystkie pliki właściwości aplikacji w określonym folderze, /usr/local/tomcat/conf/ w naszym przykładzie. Twoje właściwości zewnętrzne będą miały pierwszeństwo. Zobacz tutaj dla priorytetów: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

+0

to jest bardzo dobra odpowiedź, proszę OP to zaakceptuj –