โปรไฟล์เริ่มต้นใน Spring 3.1


100

ในใบสมัครของฉันฉันมีถั่วที่มีคำอธิบายประกอบ@Profile("prod")และ@Profile("demo"). อันแรกอย่างที่คุณเดาได้ :) ใช้กับถั่วที่เชื่อมต่อกับฐานข้อมูลการผลิตและอันที่สองใส่คำอธิบายประกอบถั่วที่ใช้ DB ปลอม ( HashMapหรืออะไรก็ได้) เพื่อให้การพัฒนาเร็วขึ้น

สิ่งที่ฉันต้องการคือโปรไฟล์เริ่มต้น ( "prod") ที่จะใช้เสมอหากไม่ถูกแทนที่ด้วย " อย่างอื่น "

สมบูรณ์แบบจะมีในweb.xml:

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

แล้วลบล้างสิ่งนี้ด้วย-Dspring.profiles.active="demo"เพื่อที่ฉันจะได้:

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

แต่น่าเศร้าที่มันไม่ทำงาน มีความคิดอย่างไรที่ฉันจะทำได้ การตั้งค่า-Dspring.profiles.active="prod"ในสภาพแวดล้อมทั้งหมดของฉันไม่ใช่ตัวเลือก

คำตอบ:


67

ประสบการณ์ของฉันคือการใช้

@Profile("default")

bean จะถูกเพิ่มในบริบทเท่านั้นหากไม่มีการระบุโปรไฟล์อื่น หากคุณส่งผ่านโปรไฟล์อื่นเช่น-Dspring.profiles.active="demo"โปรไฟล์นี้จะถูกละเว้น


4
คำตอบที่ยอมรับนั้นขึ้นอยู่กับ web.xml (และไม่เป็นไร) แต่คำตอบนี้ใช้ได้ไม่ว่าคุณจะมี web.xml หรือไม่ก็ตามและมีประโยชน์ในวงกว้างสำหรับทุกคน
Jay

1
วิธีนี้สะอาดกว่ามาก
cahen

นี่เป็นคุณสมบัติอย่างเป็นทางการหรือมีผลข้างเคียง? คุณต้องการเชื่อมโยงไปยังเอกสาร Spring ที่มีการอธิบายคุณลักษณะนี้หรือไม่
rustyx

111

กำหนดสภาพแวดล้อมการใช้งานจริงของคุณเป็นโปรไฟล์เริ่มต้นใน web.xml ของคุณ

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

และหากคุณต้องการใช้โปรไฟล์อื่นให้ส่งเป็นคุณสมบัติของระบบ

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

3
ไม่ได้พยายามกำหนดโปรไฟล์ที่ใช้งานอยู่ใน web.xml และเป็นคุณสมบัติของระบบ ในโซลูชันของฉันฉันกำหนดค่าโปรไฟล์เริ่มต้นใน web.xml และเขียนทับ / กำหนดโปรไฟล์ที่ใช้งานผ่านคุณสมบัติของระบบ หากไม่มีโปรไฟล์ที่ใช้งานอยู่อย่างชัดเจนระบบจะใช้ค่าเริ่มต้น
andih

1
ขอบคุณ! นี่คือสิ่งที่ฉันต้องการ! หาที่ไหนไม่ได้: /
Michał Margiel

ปัญหาหนึ่งด้วยวิธีนี้: ถ้าคุณตั้งค่าspring.profiles.default=prodใน application.propertiesแล้วapplication-prod.propertiesจะไม่สามารถโหลด นี่คือการตอบโต้ที่ใช้งานง่าย
gamliela

@gamliela วิธีการนี้ไม่ได้ตั้งค่าโปรไฟล์เริ่มต้นในapplication.propertiesไฟล์ เพื่อให้ทราบว่าapplication-prod.propertiesควรใช้คุณจะต้องรู้โปรไฟล์ นั่นคือสิ่งที่แนวทางนี้ทำ กำหนดส่วนกำหนดค่านอกบริบทสปริงทั้งweb.xml(ค่าเริ่มต้น) หรือผ่านตัวแปรสภาพแวดล้อม (เขียนทับค่าเริ่มต้น)
andih

@ และใช่ฉันรู้ แต่ฉันบอกว่ามันไม่เข้าใจง่ายและเป็นปัญหา ตั้งแต่application-default.propertiesโหลดมาฉันก็คาดหวังว่ามันapplication-newdefault.propertiesจะโหลดได้เช่นกัน ไม่ใช่ปัญหาในการแก้ปัญหาของคุณ แต่เป็นปัญหากับ Spring ...
gamliela

6

ฉันมีปัญหาเดียวกัน แต่ฉันใช้WebApplicationInitializerเพื่อกำหนดค่า ServletContext แบบเป็นโปรแกรม (Servlet 3.0+) ดังนั้นฉันจึงทำสิ่งต่อไปนี้:

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 ออกและใช้ @Profile ("! demo")


2
ฉันคิดว่าสิ่งนี้จะใช้ไม่ได้ในกรณีที่คุณมีโปรไฟล์มากกว่าสองโปรไฟล์ใช่ไหม?
สับ

3

เกี่ยวกับการตั้งค่าโปรไฟล์การผลิตเริ่มต้นที่โพสต์ไว้แล้ว @andih

วิธีที่ง่ายที่สุดในการตั้งค่าโปรไฟล์เริ่มต้นสำหรับปลั๊กอินท่าเทียบเรือ maven คือการรวมองค์ประกอบด้านล่างในการกำหนดค่าปลั๊กอินของคุณ:

<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

Spring มีคุณสมบัติสองอย่างที่แยกจากกันเมื่อพิจารณาว่าโปรไฟล์ใดที่ใช้งานอยู่:

  • spring.profiles.active

และ

  • spring.profiles.default

หากspring.profiles.activeถูกตั้งค่าไว้ค่าจะเป็นตัวกำหนดว่าโปรไฟล์ใดที่ใช้งานอยู่ แต่ถ้าspring.profiles.activeยังไม่ได้ตั้งค่า Spring ก็จะเป็นเช่นนั้นspring.profiles.default.

หากค่าspring.profiles.activeมิได้spring.profiles.defaultตั้งแล้วไม่มีโปรไฟล์ที่ใช้งานและมีเพียงถั่วเหล่านั้นที่ไม่ได้กำหนดไว้ว่าอยู่ในรายละเอียดจะ created.Any ถั่วที่ไม่ได้ระบุรายละเอียดเป็นdefaultรายละเอียด


-1

คุณสามารถตั้งค่า web.xml ของคุณเป็นทรัพยากรที่ถูกกรองและให้ค่านี้เติมเต็มโดย maven จากการตั้งค่าโปรไฟล์ maven นั่นคือสิ่งที่เราทำ

ใน pom กรองทรัพยากรทั้งหมด (คุณสามารถทำได้ถ้าคุณไม่มีเครื่องหมาย $ {} อยู่ในนั้น)

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

ใน web.xml ใส่

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

ใน pom สร้างโปรไฟล์ maven

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

ตอนนี้คุณสามารถใช้

mvn jetty:run -P DEMO

หรือเพียงแค่-P DEMOใช้คำสั่ง maven ใด ๆ


1
ฉันไม่แน่ใจ แต่คิดว่าคงไม่ได้ผล ท่าเทียบเรือ IMHO: รันจะไม่รันเฟสที่ทรัพยากรถูกกรอง
Michał Margiel

ของพยาบาลคุณต้องเรียกใช้ท่าเทียบเรือ mvn clean compile: เรียกใช้ -P DEMO แต่ด้วยรหัสที่ไม่ได้คอมไพล์จะเรียกใช้โดยอัตโนมัติ
Hurda

10
ฉันเข้าใจว่าหนึ่งในเป้าหมายหลักของ Spring 3.1 Profiles คือการสร้างไฟล์ WAR ไฟล์เดียวพร้อมที่จะปรับใช้ในทุกสภาพแวดล้อม การใช้โปรไฟล์ Maven เป็นการย้อนกลับไปสู่สถานะก่อนหน้าซึ่งจำเป็นต้องมีการบรรจุไฟล์ WAR สำหรับแต่ละสภาพแวดล้อม ...
edrabc

@edrabc เขาขอ mvn jetty: run - ไม่มีไฟล์ WAR
Hurda

เห็นด้วย @Hurda. แต่เขายังขอให้เรียกใช้คำสั่งในสภาพแวดล้อมที่หลากหลาย: การผสมผสานของ Maven Profiles และ Spring Profiles อาจทำให้เข้าใจผิดได้เล็กน้อย ...
edrabc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.