Spring boot 1.X และ Spring Boot 2.X ไม่มีตัวเลือกและลักษณะการทำงานที่เหมือนกันเกี่ยวกับไฟล์Externalized Configuration
.
คำตอบที่ดีมากของ M. Deinum หมายถึงข้อมูลจำเพาะของ Spring Boot 1
ฉันจะอัปเดตสำหรับ Spring Boot 2 ที่นี่
แหล่งที่มาและลำดับคุณสมบัติของสภาพแวดล้อม
Spring Boot 2 ใช้PropertySource
คำสั่งเฉพาะที่ออกแบบมาเพื่อให้สามารถลบล้างค่าได้อย่างสมเหตุสมผล คุณสมบัติจะพิจารณาตามลำดับต่อไปนี้:
คุณสมบัติการตั้งค่าส่วนกลาง Devtools บนโฮมไดเร็กทอรีของคุณ (~ / .spring-boot-devtools.properties เมื่อ devtools แอ็คทีฟ)
@TestPropertySource
คำอธิบายประกอบในการทดสอบของคุณ
@SpringBootTest#properties
แอตทริบิวต์คำอธิบายประกอบในการทดสอบของคุณ อาร์กิวเมนต์บรรทัดคำสั่ง
คุณสมบัติจากSPRING_APPLICATION_JSON
(inline JSON ที่ฝังอยู่ในตัวแปรสภาพแวดล้อมหรือคุณสมบัติระบบ)
ServletConfig
พารามิเตอร์ init
ServletContext
พารามิเตอร์ init
JNDI แอตทริบิวต์จากjava:comp/env
.
คุณสมบัติของระบบ Java ( System.getProperties()
)
ตัวแปรสภาพแวดล้อมระบบปฏิบัติการ
A RandomValuePropertySource
ที่มีคุณสมบัติในการสุ่มเท่านั้น *.
คุณสมบัติของแอปพลิเคชันเฉพาะโปรไฟล์ภายนอกโถบรรจุของคุณ ( application-{profile}.properties
และตัวแปร YAML)
คุณสมบัติการใช้งานเฉพาะโปรไฟล์ที่บรรจุอยู่ในโถของคุณ ( application-{profile}.properties
และตัวแปร YAML)
คุณสมบัติของแอปพลิเคชันภายนอกโถบรรจุของคุณ ( application.properties
และตัวแปร YAML)
คุณสมบัติการใช้งานที่บรรจุอยู่ในโถของคุณ ( application.properties
และตัวแปร YAML)
@PropertySource
คำอธิบายประกอบใน@Configuration
ชั้นเรียนของคุณ คุณสมบัติเริ่มต้น (ระบุโดยการตั้งค่า
SpringApplication.setDefaultProperties
)
ในการระบุไฟล์คุณสมบัติภายนอกตัวเลือกเหล่านี้คุณควรสนใจ:
คุณสมบัติของแอปพลิเคชันเฉพาะโปรไฟล์ภายนอกโถบรรจุของคุณ ( application-{profile}.properties
และตัวแปร YAML)
คุณสมบัติของแอปพลิเคชันภายนอกโถบรรจุของคุณ ( application.properties
และตัวแปร YAML)
@PropertySource
คำอธิบายประกอบใน@Configuration
ชั้นเรียนของคุณ คุณสมบัติเริ่มต้น (ระบุโดยการตั้งค่า
SpringApplication.setDefaultProperties
)
คุณสามารถใช้เพียงหนึ่งใน 3 ตัวเลือกเหล่านี้หรือรวมเข้าด้วยกันตามความต้องการของคุณ
ตัวอย่างเช่นสำหรับกรณีที่ง่ายมากโดยใช้คุณสมบัติเฉพาะโปรไฟล์ก็เพียงพอแล้ว แต่ในกรณีอื่น ๆ คุณอาจต้องการใช้ทั้งคุณสมบัติเฉพาะโปรไฟล์คุณสมบัติเริ่มต้นและ@PropertySource
.
ตำแหน่งดีฟอลต์สำหรับไฟล์ application.properties
เกี่ยวกับapplication.properties
ไฟล์ (และตัวแปร) โดยค่าเริ่มต้น Spring จะโหลดและเพิ่มคุณสมบัติในสภาพแวดล้อมจากสิ่งเหล่านี้ตามลำดับต่อไปนี้:
classpath:/,classpath:/config/,file:./,file:./config/
จัดลำดับความสำคัญสูงจึงตัวอักษร:
จะใช้ไฟล์คุณสมบัติที่มีชื่อเฉพาะได้อย่างไร?
ตำแหน่งเริ่มต้นไม่เพียงพอเสมอไป: ตำแหน่งเริ่มต้นเช่นชื่อไฟล์เริ่มต้น ( application.properties
) อาจไม่เหมาะสม นอกจากนี้เช่นเดียวกับในคำถาม OP คุณอาจต้องระบุไฟล์การกำหนดค่าหลายไฟล์นอกเหนือจากapplication.properties
(และตัวแปร)
ดังนั้นspring.config.name
จะไม่เพียงพอ
ในกรณีนี้คุณควรระบุตำแหน่งที่ชัดเจนโดยใช้spring.config.location
คุณสมบัติสภาพแวดล้อม (ซึ่งเป็นรายการตำแหน่งไดเร็กทอรีหรือเส้นทางไฟล์ที่คั่นด้วยเครื่องหมายจุลภาค)
หากต้องการเป็นอิสระเกี่ยวกับรูปแบบชื่อไฟล์จะชอบรายการพา ธ ไฟล์มากกว่ารายการไดเร็กทอรี
ตัวอย่างเช่นทำเช่นนั้น:
java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
วิธีนี้เป็นวิธีที่ละเอียดที่สุดเพียงแค่ระบุโฟลเดอร์ แต่ยังเป็นวิธีระบุไฟล์คอนฟิกูเรชันของเราอย่างละเอียดและจัดทำเอกสารคุณสมบัติที่ใช้อย่างมีประสิทธิภาพอย่างชัดเจน
spring.config.location ตอนนี้แทนที่ตำแหน่งเริ่มต้นแทนที่จะเพิ่มเข้าไป
ด้วย Spring Boot 1 spring.config.location
อาร์กิวเมนต์จะเพิ่มตำแหน่งที่ระบุในสภาพแวดล้อม Spring
แต่จาก Spring Boot 2 spring.config.location
แทนที่ตำแหน่งเริ่มต้นที่ใช้โดย Spring โดยตำแหน่งที่ระบุในสภาพแวดล้อม Spring ตามที่ระบุไว้ในเอกสารในเอกสาร
เมื่อกำหนดค่าตำแหน่งการกำหนดค่าแบบกำหนดเองโดยใช้ตำแหน่ง
spring.config.location
เหล่านี้จะแทนที่ตำแหน่งเริ่มต้น ตัวอย่างเช่นถ้าspring.config.location
มีการกำหนดค่าที่มีค่า
classpath:/custom-config/
, file:./custom-config/
, ลำดับการค้นหาจะกลายเป็นดังต่อไปนี้:
file:./custom-config/
classpath:custom-config/
spring.config.location
ตอนนี้เป็นวิธีตรวจสอบให้แน่ใจว่าapplication.properties
ต้องระบุไฟล์ใด ๆอย่างชัดเจน
สำหรับ uber JAR ที่ไม่ควรทำแพ็กเกจapplication.properties
ไฟล์นั้นค่อนข้างดี
หากต้องการรักษาพฤติกรรมเก่า ๆspring.config.location
ในขณะที่ใช้ Spring Boot 2 คุณสามารถใช้spring.config.additional-location
คุณสมบัติใหม่แทนที่จะspring.config.location
ยังคงเพิ่มตำแหน่งตามที่ระบุไว้ในเอกสาร :
หรือเมื่อกำหนดค่าตำแหน่งการกำหนดค่าแบบกำหนดเองโดยใช้
spring.config.additional-location
จะใช้นอกเหนือจากตำแหน่งเริ่มต้น
ในทางปฏิบัติ
ดังนั้นสมมติว่าในคำถาม OP คุณมีไฟล์คุณสมบัติภายนอก 2 ไฟล์ที่จะระบุและ 1 ไฟล์คุณสมบัติที่รวมอยู่ในโถ uber
ในการใช้เฉพาะไฟล์คอนฟิกูเรชันที่คุณระบุ:
-Dspring.config.location=classpath:/job1.properties,classpath:/job2.properties,classpath:/applications.properties
ในการเพิ่มไฟล์การกำหนดค่าลงในตำแหน่งเริ่มต้น:
-Dspring.config.additional-location=classpath:/job1.properties,classpath:/job2.properties
classpath:/applications.properties
อยู่ในตัวอย่างสุดท้ายที่ไม่จำเป็นเนื่องจากตำแหน่งเริ่มต้นมีและตำแหน่งเริ่มต้นนั้นไม่ได้ถูกเขียนทับ แต่ขยาย
application.properties
มักจะเต็มไปด้วยspring.config.location
คุณสามารถเพิ่มสถานที่การกำหนดค่าเพิ่มเติมที่ได้รับการตรวจสอบไฟล์ (นั่นคือเมื่อมันจบลงด้วย/
) แต่ถ้าคุณใส่จุลภาครายการที่แยกออกจากกันในการมีที่ชี้ไปยังไฟล์เหล่านั้นจะถูกโหลด นอกจากนี้ยังมีคำอธิบายใน Spring Boot Reference Guide ที่นี่