2015-03-17 17 views
16

Ich habe eine Spring-Boot-Anwendung, die ich mit externen Konfigurationsdatei ausführen möchte. Wenn ich es als jar (mit eingebettetem Servlet-Container) ausführen, ist alles in Ordnung. Aber ich möchte es unter externen Servlet Container (Tomcat) ausführen und hier habe ich Probleme mit der externen Konfiguration. Ich habe eine @PropertySource versucht, aber in diesem Fall ruft die Anwendung nur Eigenschaften ab, die in der WAR-Dateikonfiguration fehlen: Die externe Konfiguration überschreibt nicht die interne Konfiguration. Also die Frage: Wie kann ich externe Konfiguration konfigurieren, die interne Konfiguration überschreiben?Externe Konfiguration für Spring-Boot-Anwendung

Antwort

20

Sie verwenden wahrscheinlich eine externe Konfiguration in Form von application.properties im aktuellen Verzeichnis, wenn Sie Ihre Anwendung als jar ausführen. "Aktuelles Verzeichnis" ist jedoch nicht sehr nützlich, wenn es als Krieg in einem externen Tomcat eingesetzt wird. Selbst wenn Sie herausfinden, was das aktuelle Verzeichnis ist, ist es wahrscheinlich derselbe Speicherort für alle Anwendungen, die in diesem Tomcat ausgeführt werden. Wenn Sie also mehr als eine Anwendung ausführen, wird das nicht sehr gut funktionieren.

Was wir hier tun, ist diese zwei PropertySources auf unserer Anwendung erklären:

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

internal.properties enthält „eingebaute“ Standardwerte für propeties. Die zweite PropertySource ist eine Datei mit externer Konfiguration. Beachten Sie, dass der Name der Datei selbst eine Eigenschaft ist.

Wir definieren diese extern im Context Element unserer Anwendung (in tomcat):

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

Auf diese Weise können Sie in tomcat Ausführen mehrerer Anwendungen haben, jede Anwendung unter Verwendung ihrer eigenen externen Eigenschaftsdatei. Sie können sogar mehrere Instanzen der selben Anwendung mit verschiedenen Eigenschaften ausführen.

+1

Vielen Dank für Ihre Antwort. Ja, diese Konfiguration wird funktionieren und wie ich in meiner Frage erwähnt habe ich diese Lösung versucht. Der Nachteil dieser Lösung besteht darin, dass die externe Konfiguration die interne Konfiguration nicht überschreibt. Meine Frage ist, wie kann ich Priorität auf externe Konfiguration setzen? –

+0

Es sollte funktionieren, es tut für mich. Beachten Sie, dass ich nicht den Standardnamen application.properties verwende, der eine andere Priorität hätte. Bist du sicher, dass du genau versucht hast, was in meiner Antwort steht? –

+0

Ja, es funktioniert! :) Ich habe den internen Konfigurationsnamen in internal.properties geändert und es funktioniert perfekt. Gibt es eine Möglichkeit, externe Konfiguration zur Laufzeit neu zu laden? –

14

die Frühlings-Boot-application.properties externalisieren, wenn sie als WAR-Datei bereitstellen Sie spring.config.location am Anfang, wenn Frühjahr Boot-Anwendung konfiguriert ist, können Sie einstellen:

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; 
    } 

Für weitere Details lesen Sie in diesem solution.

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und die Link als Referenz. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. – Necreaux

+0

Ok @ Necreaux wesentliche Teile wurden hinzugefügt –

+0

@Necreaux Ich verstehe den Downvote nicht nach dem Hinzufügen der wesentlichen Teile? Gibt es noch etwas fehlt? –

6

Spring Boot Angebot many ways, um den Standort Ihrer Eigenschaften anzugeben, ist es nicht erforderlich, Ihre Quellen zu ändern.

Yo kann den spring.config.location Wert zum Beispiel definieren:

  • In Ihrem tomcat/conf/Catalina/<host> Kontext Deskriptoren:

    <Context> 
        <Parameter name="spring.config.location" value="/path/to/application.properties" /> 
    </Context> 
    
  • Als JVM Parameter in Ihrer tomcat setenv.sh Datei:

    -Dspring.config.location=/path/to/application.properties 
    
  • Als SPRING_CONFIG_LOCATION Umgebungsvariable.