Wie stelle ich das Federprofil aus der Systemvariablen ein?

78

Ich habe ein Frühlingsprojekt, das ein anderes Projekt verwendet. Jedes Projekt verfügt über ein eigenes Federprofil, das mit applicationContext.xmlund *.propertiesfür jedes Profil aus Java-Code initialisiert wird . Ich injiziere das Profil von args[]. Das Problem ist, dass das zweite Projekt die Standardkonfiguration für die Umgebung verwendet. applicationContext.xml Ich kann die Umgebung nicht args[]in das zweite Projekt einfügen , und ich habe versucht, nach einem Artikel zu suchen, in dem die Funktionsweise des Spring-Profils erläutert wird.

  1. Gibt es eine Hierarchie, in der das Profil angezeigt wird, wenn die Standardeinstellung nicht konfiguriert ist applicationContext.xml?
  2. Ist System var stärker als applicationContext.xmlKonfiguration?
  3. Was ist Ihrer Meinung nach die beste Lösung für meine Herausforderung?

Artikel zu diesem Thema oder sogar Beispiele wären sehr dankbar !! Danke im Voraus.

user2656851
quelle

Antworten:

131

SPRING_PROFILES_ACTIVE ist die Umgebungsvariable zum Überschreiben / Auswählen des Federprofils

Lalit Jha
quelle
Zusammen mit Docker funktioniert es auch gut mit der TypeSafe-Konfigurationsbibliothek (HOCON), dem Shell-Skript zum Initialisieren von App / System / Docker-Container usw.
Lalit Jha
62

Wenn Sie Ihrer JVM das Spring-Profil zur Verfügung stellen, sollten keine Probleme auftreten:

java -Dspring.profiles.active=development -jar yourApplication.jar 

Siehe auch Frühlingsdokumentation:

http://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html

69.5 Stellen Sie die aktiven Federprofile ein

Die Spring-Umgebung verfügt über eine API dafür. Normalerweise legen Sie jedoch eine Systemeigenschaft (spring.profiles.active) oder eine Betriebssystemumgebungsvariable (SPRING_PROFILES_ACTIVE) fest. Starten Sie beispielsweise Ihre Anwendung mit einem -D-Argument (denken Sie daran, es vor die Hauptklasse oder das JAR-Archiv zu stellen):

$ java -jar -Dspring.profiles.active = Produktionsdemo-0.0.1-SNAPSHOT.jar

In Spring Boot können Sie das aktive Profil auch in application.properties festlegen, z

spring.profiles.active = Produktion

Ein auf diese Weise festgelegter Wert wird durch die Einstellung der Systemeigenschaft oder der Umgebungsvariablen ersetzt, nicht jedoch durch die Methode SpringApplicationBuilder.profiles (). Somit kann die letztere Java-API verwendet werden, um die Profile zu erweitern, ohne die Standardeinstellungen zu ändern.

Weitere Informationen finden Sie in Kapitel 25, Profile im Abschnitt 'Spring Boot-Funktionen'.

JanTheGun
quelle
38

Normalerweise konfiguriere ich den applicationContext mithilfe einer auf Anmerkungen basierenden Konfiguration anstelle einer XML-basierten Konfiguration . Jedenfalls glaube ich, dass beide die gleiche Priorität haben .

* Bei der Beantwortung Ihrer Frage hat die Systemvariable eine höhere Priorität *


Profilbasierte Beans aus applicationContext abrufen

  • Verwenden Sie @Profile für eine Bohne

@Component
@Profile("dev")
public class DatasourceConfigForDev

Nun ist das Profil dev

Hinweis: Wenn das Profil als angegeben @Profile("!dev")wird, schließt das Profil dev aus und gilt für alle anderen.

  • Verwenden Sie das Profilattribut in XML

<beans profile="dev">
    <bean id="DatasourceConfigForDev" class="org.skoolguy.profiles.DatasourceConfigForDev"/>
</beans>

Legen Sie den Wert für das Profil fest:

  • Programmatisch über die WebApplicationInitializer-Schnittstelle

    In Webanwendungen kann WebApplicationInitializer verwendet werden, um den ServletContext programmgesteuert zu konfigurieren
@Configuration
public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
            servletContext.setInitParameter("spring.profiles.active", "dev");
    }
}
  • Programmatisch über ConfigurableEnvironment

    Sie können Profile auch direkt in der Umgebung festlegen:
    @Autowired
    private ConfigurableEnvironment env;

    // ...

    env.setActiveProfiles("dev");
  • Kontextparameter in web.xml

    Profile können auch in der Datei web.xml der Webanwendung mithilfe eines Kontextparameters aktiviert werden:
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/app-config.xml</param-value>
    </context-param>
    <context-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>dev</param-value>
    </context-param>
  • JVM-Systemparameter

    Die als Parameter übergebenen Profilnamen werden beim Start der Anwendung aktiviert:

    -Dspring.profiles.active=dev
    

    In IDEs können Sie die Umgebungsvariablen und -werte festlegen, die beim Ausführen einer Anwendung verwendet werden sollen. Das Folgende ist die Run-Konfiguration in Eclipse:

Eclipse Run Configuration - Screenshot ist nicht verfügbar

  • Umgebungsvariable

    über die Kommandozeile einstellen: export spring_profiles_active=dev

Jede Bean, die kein Profil angibt, gehört zum Standardprofil.


Die Prioritätsreihenfolge lautet:

  1. Kontextparameter in web.xml
  2. WebApplicationInitializer
  3. JVM-Systemparameter
  4. Umgebungsvariable
Ajmal V Aliyar
quelle
makellose Antwort!
Gaurav
6

Wenn Sie Docker zum Bereitstellen der Spring Boot-App verwenden, können Sie das Profil mithilfe des Flags e festlegen :

Docker run -e "SPRING_PROFILES_ACTIVE = prod" -p 8080: 8080 -t r.test.co/myapp:latest

db80
quelle
wie diese Flagge im Frühjahr intern verwendet wurde.
Parmar Kamlesh
1

Wenn ich die Befehlszeile java -Dspring.profiles.active=development -jar yourApplication.jar ausführe : In meinem Webanwendungsverzeichnis wird angegeben, dass der Pfad falsch ist. Also habe ich das Profil in manualy in der Datei application.properties wie folgt definiert:

spring.profiles.active=mysql 

oder

spring.profiles.active=postgres

oder

spring.profiles.active=mongodb
caketestico
quelle
0

Meine Lösung besteht darin, die Umgebungsvariable als festzulegen spring.profiles.active=development. Damit alle Anwendungen, die auf diesem Computer ausgeführt werden, auf die Variable verweisen und die Anwendung starten. Die Reihenfolge, in der die Feder eine Eigenschaft wie folgt belastet

application.properties
system properties
environment variable
Achaius
quelle
0

Sie können das Federprofil durch Lieferung einstellen -Dspring.profiles.active=<env>

Für Java-Dateien im Quellverzeichnis (src) können Sie von verwenden System.getProperty("spring.profiles.active")

Für Java - Dateien in Testverzeichnis können Sie liefern

  • SPRING_PROFILES_ACTIVE zu <env>

ODER

Da "Umgebung", "jvmArgs" und "systemProperties" für die Aufgabe "Test" ignoriert werden. build.gradleFügen Sie im Stammverzeichnis eine Aufgabe hinzu, um die jvm-Eigenschaft und die Umgebungsvariable festzulegen.

test {
    def profile = System.properties["spring.profiles.active"]
    systemProperty "spring.profiles.active",profile
    environment "SPRING.PROFILES_ACTIVE", profile
    println "Running ${project} tests with profile: ${profile}"
}
Verschwenderisch
quelle