İlkbahar 3.1'deki varsayılan profil


100

Başvurumda @Profile("prod")ve açıklamalı fasulye var @Profile("demo"). İlki, tahmin edebileceğiniz gibi :), üretim DB'sine bağlanan fasulyelerde kullanılır ve ikincisi HashMap, geliştirmeyi daha hızlı hale getirmek için bazı sahte DB ( veya her neyse) kullanan fasulyelere açıklama ekler .

Sahip olmak istediğim şey"prod" , " başka bir şey " tarafından geçersiz kılınmadıysa her zaman kullanılacak olan varsayılan profildir ( ) .

Benim içimde olması mükemmel olurdu web.xml:

<context-param>
     <param-name>spring.profiles.active</param-name>
     <param-value>prod</param-value>
</context-param>

ve sonra -Dspring.profiles.active="demo"bunu yapabilmem için geçersiz kıl :

mvn jetty:run -Dspring.profiles.active="demo". 

Ama ne yazık ki bu işe yaramıyor. Bunu nasıl başarabileceğime dair bir fikrin var mı? -Dspring.profiles.active="prod"Tüm ortamlarımı ayarlamak bir seçenek değil.

Yanıtlar:


67

Benim deneyimim kullanmak

@Profile("default")

fasulye yalnızca başka bir profil tanımlanmadıysa içeriğe eklenir. Farklı bir profilden geçerseniz, örneğin -Dspring.profiles.active="demo"bu profil yok sayılır.


4
Kabul edilen yanıt web.xml'ye bağlıdır (ve bu iyi), ancak bu yanıt web.xml'iniz olup olmadığına bakılmaksızın işe yarar ve bu nedenle herkes için daha genel olarak yararlıdır.
— Jay

1
bu çözüm çok daha temiz
— cahen

Bu resmi bir özellik mi yoksa bir yan etki mi? Bu özelliğin açıklandığı Bahar belgelerine bağlantı vermek ister misiniz?
— rustyx

111

Üretim ortamınızı web.xml dosyanızda varsayılan profil olarak tanımlayın

<context-param>
   <param-name>spring.profiles.default</param-name>
   <param-value>prod</param-value>
</context-param>

ve farklı bir profil kullanmak istiyorsanız bunu sistem özelliği olarak geçirin

mvn -Dspring.profiles.active="demo" jetty:run

3
Hayır, aktif profili web.xml'de ve sistem özelliği olarak tanımlamaya çalıştı . Çözümümde web.xml'de varsayılan bir profil yapılandırıyorum ve sistem özelliği aracılığıyla etkin profilin üzerine yazıyorum / tanımlıyorum . Açık bir aktif profil yoksa, varsayılan kullanılır.
— andih

1
Teşekkürler! tam da istediğim buydu! hiçbir yerde bulamadı: /
— Michał Margiel

Bu yaklaşım bir sorun: Eğer ayarlarsanız spring.profiles.default=prodiçinde application.properties, daha sonra application-prod.propertiesyüklenen edilmeyecektir. Bu sezgiye aykırıdır.
— gamliela

@gamliela Yaklaşım bir application.propertiesdosyada varsayılan profili ayarlamaz . Bunun application-prod.propertieskullanılması gerektiğini bilmek için profili bilmeniz gerekir. Bu yaklaşımın yaptığı şey budur. Yay bağlamı dışındaki profilleri web.xml(varsayılan) veya ortam değişkeni aracılığıyla (varsayılanın üzerine yazın) tanımlar .
— andih

@andih Evet, bunu biliyorum ama sadece sezgisel olmadığını ve dolayısıyla sorunlu olduğunu söylüyorum. application-default.propertiesYüklendiğinden beri , bunun da yüklenmesini bekliyorum application-newdefault.properties. Çözümünüzle ilgili bir sorun değil, Bahar ile ilgili bir sorun ...
— gamliela

6

Aynı sorunu yaşıyorum, ancak ServletContext'i program aracılığıyla yapılandırmak için WebApplicationInitializer kullanıyorum (Servlet 3.0+). Bu yüzden aşağıdakileri yapıyorum:

public class WebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext sc) throws ServletException {
        // Create the 'root' Spring application context
        final AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        // Default active profiles can be overridden by the environment variable 'SPRING_PROFILES_ACTIVE'
        rootContext.getEnvironment().setDefaultProfiles("prod");
        rootContext.register(AppConfig.class);

        // Manage the lifecycle of the root application context
        sc.addListener(new ContextLoaderListener(rootContext));
    }
}

5

PROD profilini kaldırmayı ve @Profile ("! Demo") kullanmayı da düşünebilirsiniz.


2
Sanırım ikiden fazla profiliniz varsa bu işe yaramaz, değil mi?
— doğrayın

3

@Andih zaten yayınlanan varsayılan üretim profilini ayarlama hakkında

Maven jetty eklentisi için varsayılan profili ayarlamanın en kolay yolu, eklenti yapılandırmanıza aşağıdaki öğeyi eklemektir:

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <configuration>
        <systemProperties>
            <systemProperty>
                <name>spring.profiles.active</name>
                <value>demo</value>
            </systemProperty>
        </systemProperties>
    </configuration>
</plugin>

3

Yay, hangi profillerin aktif olduğunu belirlerken iki ayrı özellik sağlar:

  • spring.profiles.active

ve

  • spring.profiles.default

Eğer spring.profiles.activeayarlanır, daha sonra değeri profilleri aktif olduğunu belirler. Ama spring.profiles.activeayarlanmadıysa, o zaman Baharspring.profiles.default.

Hiçbiri ayarlanmadıysa spring.profiles.activeveya spring.profiles.defaultayarlanmadıysa, etkin profil yoktur ve yalnızca bir profilde tanımlanmayan çekirdekler oluşturulur default. Profil belirtmeyen her fasulye profile aittir .


-1

Web.xml dosyanızı filtrelenmiş kaynak olarak kurabilir ve bu değeri maven profil ayarlarından maven tarafından doldurabilirsiniz - biz de bunu yaparız.

pom'da tüm kaynakları filtreleyin (üzerinde $ {} işareti yoksa yapabilirsiniz)

<webResources>
    <resource>
        <directory>src/main/webapp</directory>
        <filtering>true</filtering>
    </resource>
</webResources>

web.xml içine

<context-param>
     <param-name>spring.profiles.active</param-name>
     <param-value>${spring.prfile}</param-value>
</context-param>

pom'da maven profilleri oluştur

<profiles>
    <profile>
        <id>DEFAULT</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <spring.profile>prod</spring.profile>
        </properties>
    <profile>
    <profile>
        <id>DEMO</id>
        <properties>
            <spring.profile>demo</spring.profile>
        </properties>
    <profile>
</profiles>

Şimdi kullanabilirsin

mvn jetty:run -P DEMO

veya -P DEMOherhangi bir maven komutuyla


1
Emin değilim ama bunun işe yaramayacağını düşünüyorum. IMHO jetty: run, kaynakların filtrelendiği aşamayı çalıştırmaz.
— Michal Margiel

caurse Eğer mvn temiz derleme iskeleye çalıştırmak gerekir: -P DEMO çalıştırabilir, ancak derlenmemiş kod ile bunu autimaticly o ishal
— Hurda

10
Spring 3.1 Profillerinin ana hedeflerinden birinin tüm ortamlarda konuşlandırılmaya hazır tek bir WAR dosyası oluşturmak olduğunu anlıyorum. Maven profillerini kullanmak önceki duruma geri adım
— atmaktır

@edrabc mvn iskelesi istiyordu: run - WAR dosyası yok.
— Hurda

Kabul ediyorum @Hurda. Ama aynı zamanda komutu birden fazla ortamda çalıştırmayı da istiyordu: Maven Profilleri ve Yay Profillerinin bir karışımına sahip olmak biraz yanıltıcı olabilir ...
— edrabc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.