ไฟล์ application.properties สภาพแวดล้อมเฉพาะในแอ็พพลิเคชัน Spring Boot [ปิด]


87

ในแอปพลิเคชัน Spring Boot ของฉันฉันต้องการสร้างไฟล์คุณสมบัติเฉพาะสภาพแวดล้อม ประเภทบรรจุภัณฑ์ของแอปพลิเคชันของฉันในสงครามและฉันกำลังดำเนินการใน Tomcat แบบฝัง ฉันใช้ sts และดำเนินการหลักจาก sts เอง

  1. ฉันสามารถมีไฟล์คุณสมบัติเฉพาะของสภาพแวดล้อมเช่น application - $ {env-value} .properties ได้หรือไม่

ในกรณีข้างต้น env-value จะมีค่าเป็น local / devl / test / prod

  1. จะตั้งค่าไฟล์ env-value ได้ที่ไหน? สำหรับ local ฉันสามารถตั้งเป็นอาร์กิวเมนต์ jvm ผ่าน sts

  2. ใครอ่าน application.properties ในแอปพลิเคชัน Spring Boot

  3. วิธีโหลดไฟล์คุณสมบัติเฉพาะของสภาพแวดล้อม เช่น - ถ้าฉันตั้งค่า uid ฐานข้อมูล, pwd, schema ฯลฯ ในไฟล์คุณสมบัติเฉพาะของสภาพแวดล้อมในกรณีนั้นแหล่งข้อมูลจะสามารถเข้าใจคุณสมบัติในนั้นได้หรือไม่

  4. ฉันสามารถใช้ไฟล์ application.properties และ application-local.properties ในเวลาเดียวกันได้หรือไม่


คุณอ่านสิ่งนี้แล้วหรือยัง? โดยพื้นฐานแล้วได้รับการสนับสนุนนอกกรอบ
M. Deinum

ฉันทำ แต่มันไม่ได้ผล ดังนั้นฉันจึงมีไฟล์ application.properties และไฟล์ application-local.properties ที่ตำแหน่งเดียวกัน ไฟล์ application-local.properties มีคุณสมบัติที่เกี่ยวข้องกับ db application.properties มีคุณสมบัติเดียวเกี่ยวกับสปริง mvc นอกจากนี้ฉันยังเพิ่ม -Dprofile = local เป็นการกำหนดค่าการดีบัก แต่ค่านี้ไม่ได้รับการหยิบขึ้นมา
user3534483

เพราะคุณจะต้องตั้งค่าเพื่อให้การใช้งานspring.active.profiles -Dspring.active.profiles=localแทน.
M. Deinum

ไม่ประสบความสำเร็จครับ ดังนั้นแทนที่จะเป็น -Dprofile ตอนนี้ฉันใช้ -Dspring.active.profiles = local จากนั้นในไฟล์คอนฟิกูเรชันของฉันฉันพยายามดึงค่า String driverClassName = env.getProperty ("driverClassName"); env คือสิ่งแวดล้อมตั้งแต่ฤดูใบไม้ผลิ
user3534483

1
ขออภัยฉันไม่ดีผสมไปรอบ ๆ :)
M. Deinum

คำตอบ:


173

ฤดูใบไม้ผลิ Boot แล้วมีการสนับสนุนสำหรับรายละเอียดคุณสมบัติตาม

เพียงเพิ่มapplication-[profile].propertiesไฟล์และระบุโปรไฟล์ที่จะใช้โดยใช้spring.profiles.activeคุณสมบัติ

-Dspring.profiles.active=local

สิ่งนี้จะโหลดapplication.propertiesและapplication-local.propertiesด้วยคุณสมบัติการแทนที่หลังจากครั้งแรก


1
เราสามารถแทนที่การใช้คุณสมบัติของแอปพลิเคชันด้วยไฟล์อื่นสำหรับโปรไฟล์เฉพาะโดยไม่ต้องโหลดทั้งสองอย่างได้หรือไม่ สำหรับการทดสอบหรือ dev เช่น?
Hassam Abdelillah

1
M. Deinum ฉันก็มีปัญหาที่คล้ายกันฉันมี application.yml และ application-qa.yml และฉันให้ -Dspring.profiles.active = qa ไฟล์ทั้งสองกำลังได้รับการอ่าน แต่คุณสมบัติจาก application-qa.yml ไม่ได้เขียนทับ คุณสมบัติจาก application.yml ฉันมักจะเห็นคุณสมบัติจาก application.yml เท่านั้น? มีวิธีใดในการระบุลำดับความสำคัญ?
Suresh

5
สวัสดีทั้งสองอย่างนี้สามารถแก้ปัญหาของคุณได้ docs.spring.io/spring-boot/docs/current/reference/html/… ตัวอย่าง: mkyong.com/spring-boot/…
Anand Varkey Philips

ฉันกำลังเขียนโค้ดสำหรับ aws lambda และสามารถส่งคีย์ = ค่านี้เป็นค่าสภาพแวดล้อมซึ่งสามารถเข้าถึงได้โดยใช้ System.getenv () - จะใช้งานได้หรือไม่
Abdeali Chandanwala

ฉันมี 4 application- ไฟล์ .properties {profile} และฉันต้องการเรียกใช้ไฟล์ jar เดียวกันในสภาพแวดล้อมที่แตกต่างกันให้เราพูดว่า dev, test, prod ดังนั้นฉันจึงใช้ -Dspring.profiles.active = local ไม่ได้ กรุณาแก้ไขฉันหากฉันขาดอะไรไป
Ashish Burnwal

25

ใช่คุณสามารถ. เนื่องจากคุณใช้สปริงโปรดดูคำ@PropertySourceอธิบายประกอบ

ใส่คำอธิบายประกอบการกำหนดค่าของคุณด้วย

@PropertySource("application-${spring.profiles.active}.properties")

คุณสามารถเรียกมันว่าสิ่งที่คุณต้องการและเพิ่มไฟล์คุณสมบัติหลายรายการได้ตามต้องการ จะดีมากถ้าคุณมีชุดและ / หรือค่าเริ่มต้นที่เป็นของทุกสภาพแวดล้อม (สามารถเขียนด้วย @PropertySource {... , ... , ... } ได้เช่นกัน)

@PropertySources({
  @PropertySource("application-${spring.profiles.active}.properties"),
  @PropertySource("my-special-${spring.profiles.active}.properties"),
  @PropertySource("overridden.properties")})

จากนั้นคุณสามารถเริ่มแอปพลิเคชันด้วยสภาพแวดล้อม

-Dspring.active.profiles=test

ในตัวอย่างนี้ชื่อจะถูกแทนที่ด้วย application-test-properties เป็นต้น


3
ปัญหาคือ$spring.profiles.active}เป็นสตริงที่แยกอาร์เรย์ / คอมมา ดังนั้นจึงอาจไม่ทำในสิ่งที่คุณคาดหวัง / ต้องการให้ทำเมื่อมีหลายโปรไฟล์ใช้งานอยู่
M. Deinum

นั่นเป็นความจริง แต่ใช้งานได้ดีสำหรับสองโปรไฟล์ - ค่าเริ่มต้นหนึ่งโปรไฟล์และอีกโปรไฟล์หนึ่งกำหนดด้วย PropertySource สำหรับการจัดการทรัพย์สินขั้นสูงฉันคิดว่าคุณจะต้องมองไปนอกฤดูใบไม้ผลิ นอกจากนี้ PropertySource จะอ่านระหว่างการเริ่มต้นเท่านั้น ไลบรารีขั้นสูงอื่น ๆ สำหรับการจัดการคุณสมบัติสามารถเปลี่ยนคุณสมบัติรันไทม์ได้เช่นกัน
Tzen

2
วิธีนี้ได้ผล แต่ฉันยังไม่เข้าใจว่าทำไมฉันต้องทำสิ่งนี้ด้วยตนเอง ในที่เก็บอื่นของฉันฉันไม่จำเป็นต้องทำสิ่งนี้
The Java Guy

7

เราสามารถทำได้ดังนี้:

ในapplication.yml :

spring:
  profiles:
    active: test //modify here to switch between environments
    include:  application-${spring.profiles.active}.yml

ในapplication-test.yml :

server:
  port: 5000

และในapplication-local.yml :

server:
  address: 0.0.0.0
  port: 8080

จากนั้นสปริงบูตจะเริ่มแอพของเราตามที่เราต้องการ


2
คุณไม่ฮาร์ดโค้ดโปรไฟล์ที่ใช้งานด้วยวิธีนี้หรือ? :(
Anna Medyukh

0

My Point ไม่ได้ขอให้นักพัฒนาสร้างสภาพแวดล้อมทั้งหมดที่เกี่ยวข้องในครั้งเดียวส่งผลให้เกิดความเสี่ยงในการเปิดเผยการกำหนดค่าการผลิตแก่ผู้พัฒนา

ตามปัจจัย 12 ประการไม่ควรเป็นสภาพแวดล้อมเฉพาะที่อยู่ในสภาพแวดล้อมเท่านั้น

เราจะทำอย่างไรสำหรับ CI CD

  • สร้าง Spring ครั้งเดียวและเลื่อนไปสู่สภาพแวดล้อมอื่นในกรณีนั้นถ้าเรามี Spring jar ที่มีสภาพแวดล้อมทั้งหมดก็จะมีความเสี่ยงด้านความปลอดภัยโดยมีตัวแปรสภาพแวดล้อมทั้งหมดใน GIT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.