การตั้งค่าโปรไฟล์ที่ใช้งานและกำหนดค่าตำแหน่งจากบรรทัดคำสั่งในฤดูใบไม้ผลิบูต


164

ฉันมีแอพพลิเคชั่นบู๊ทสปริง

ฉันมีสามโปรไฟล์ในโปรแกรมประยุกต์ของฉัน> การพัฒนา, การแสดงละครและการผลิต ดังนั้นฉันมี 3 ไฟล์

  1. แอพลิเคชัน development.yml
  2. แอพลิเคชัน staging.yml
  3. แอพลิเคชัน production.yml

ฉันapplication.ymlsrc/main/resourcesอยู่ภายใน ฉันได้ตั้งค่าโปรไฟล์ที่ใช้งานใน application.yml เป็น:

spring:
  profiles.active: development

ไฟล์กำหนดค่าเฉพาะโปรไฟล์อีก 3 รายการจะอยู่ในC:\configโฟลเดอร์

ฉันกำลังใช้โปรแกรมเสริม Gradle สำหรับ eclipse เมื่อฉันพยายามทำ " bootRun " ฉันกำลังตั้งค่าอาร์กิวเมนต์บรรทัดคำสั่งในการกำหนดค่า gradle ของฉันใน eclipse เป็น

 -Dspring.profiles.active=staging -Dspring.config.location=C:\Config

อย่างไรก็ตามคุณสมบัติบรรทัดคำสั่งไม่ได้รับการสะท้อนและโปรไฟล์ที่ใช้งานของฉันได้รับการตั้งค่าเป็นการพัฒนาเสมอ (ซึ่งเป็นสิ่งที่ฉันได้กล่าวถึงในไฟล์ applications.yml) และโฟลเดอร์ C: \ Config จะไม่ค้นหาไฟล์กำหนดค่าโปรไฟล์โดยเฉพาะ

ฉันคิดว่าฉันขาดอะไรบางอย่างที่นี่ ฉันพยายามคิดออกมา 2 วันที่ผ่านมา แต่ไม่มีโชค ฉันขอขอบคุณความช่วยเหลือใด ๆ


คุณช่วยเพิ่มbootRunบรรทัดคำสั่งของคุณด้วยได้ไหม
Biju Kunjummen

ฉันกำลังเรียกใช้จาก eclipse และไม่ใช่บรรทัดคำสั่งจนถึงตอนนี้ แต่ฉันพยายามเรียกใช้จากการใช้ "gradle bootRun -Dspring.config.location = C: \ Config \ -Dspring.profiles.active = staging" และได้ผลลัพธ์เดียวกัน
O-OF-N

คำตอบ:


343

มีสองวิธีที่แตกต่างกันที่คุณสามารถเพิ่ม / แทนที่คุณสมบัติสปริงบนบรรทัดคำสั่งได้

ตัวเลือก 1: คุณสมบัติระบบ Java (อาร์กิวเมนต์ VM)

สิ่งสำคัญคือพารามิเตอร์ -D อยู่ก่อนหน้าแอ็พพลิเคชันของคุณไม่เช่นนั้นจะไม่รู้จัก

java -jar -Dspring.profiles.active=prod application.jar

ตัวเลือก 2: ข้อโต้แย้งของโปรแกรม

java -jar application.jar --spring.profiles.active = prod --spring.config.location = c: \ config

45
การสั่งซื้อของพารามิเตอร์ -D เป็นจริง :) สำคัญ
มาร์ติน

3
คุณจะทำสิ่งนี้ได้อย่างไรในขณะที่กำลังใช้งานตู้คอนเทนเนอร์ Tomcat? ในกรณีนี้ฉันเพียงวางสงครามลงในโฟลเดอร์ webapps ของ tomcat ฉันจะให้ข้อมูลโปรไฟล์ได้อย่างไร โดยการตั้งค่าคุณสมบัติของระบบ
prayagupd

@prayagupd ใช่คุณสามารถกำหนดคุณสมบัติของระบบไว้ใน bash_profile ของคุณ
ความปรารถนาดีที่สุด

2
@maneesh ใช่ฉันใช้env ตัวแปร ที่ส่งออกผ่านทางSPRING_PROFILES_ACTIVE ~/.bash_profileexport SPRING_PROFILES_ACTIVE=e2e
prayagupd

1
เมื่อคุณพูดคำสั่งซื้อเป็นสิ่งสำคัญ: เราสามารถส่งผ่านทั้ง args: -Dspring.profile.active และ -Dspring.config.location เช่นนั้นโปรไฟล์ถูกตั้งค่าตามอาร์กิวเมนต์แรกและไฟล์คุณสมบัติถูกเลือกตาม args ที่สอง? เช่น:java -Dspring.profiles.active=$ENV -Dspring.config.location=file:///aws-secrets-manager/properties/application-$ENV.properties /code/app.jar
Setlur

26

แนวทางปฏิบัติที่ดีที่สุดของฉันคือการกำหนดสิ่งนี้เป็นอาร์กิวเมนต์ VM "-D" โปรดทราบความแตกต่างระหว่าง spring boot 1.x และ 2.x

โปรไฟล์ที่เปิดใช้งานสามารถระบุได้ในบรรทัดคำสั่ง:

Spring-Boot 2.x

-Dspring-boot.run.profiles=local

Spring-Boot 1.x

-Dspring.profiles.active=local

ตัวอย่างการใช้งานด้วย maven:

Spring-Boot 2.x

mvn spring-boot:run -Dspring-boot.run.profiles=local

Spring-Boot 1.x

mvn spring-boot:run -Dspring.profiles.active=local

ตรวจสอบให้แน่ใจว่าได้คั่นด้วยเครื่องหมายจุลภาคสำหรับหลายโปรไฟล์:

mvn spring-boot:run -Dspring.profiles.active=local,foo,bar
mvn spring-boot:run -Dspring-boot.run.profiles=local,foo,bar

คุณหมายถึง spring / spring-boot ใช่ไหม (สปริง 1x และสปริง 2x)!
smilyface

1
@smilyface spring boot สปริงบูตยังมีอยู่ในรุ่นต่าง ๆ : mvnrepository.com/artifact/org.springframework.boot/spring-boot
Sma Ma

2
ฉันใช้ spring-boot 2.1.3 และ-Dspring-boot.run.profiles=localไม่ทำงานใช้-Dspring.profiles.active=localงานได้
Donghua Liu

spring-boot 2.2.0: ทำงานได้ทั้ง: -Dspring-boot.run.profilesและ-Dspring.profiles.active
Grigory Kislin

18

ฉันต้องเพิ่มสิ่งนี้:

bootRun {
    String activeProfile =  System.properties['spring.profiles.active']
    String confLoc = System.properties['spring.config.location']
    systemProperty "spring.profiles.active", activeProfile
    systemProperty "spring.config.location", "file:$confLoc"
}

และตอนนี้ bootRun เลือกตำแหน่งโปรไฟล์และกำหนดค่า

ขอบคุณมาก @ jst สำหรับตัวชี้


7
สิ่งนี้อาจจะง่ายยิ่งขึ้นดังต่อไปนี้: bootRun { systemProperties = System.properties }. คำสั่งนี้จะคัดลอกพารามิเตอร์ทั้งหมดที่ส่งผ่านด้วย-Dสวิตช์พร้อมกับคีย์เดียวกันในการsystemPropertyจับคู่
edufinn

สิ่งนี้ดูเหมือนจะเป็นวิธีแก้ปัญหาแบบ gradle เท่านั้นไม่มีวิธีการแก้ปัญหาแบบพันธุกรรมหรือไม่?
user1767316

1
คุณกำลังเพิ่มสิ่งนี้อยู่ที่ไหน ทุกที่ในไฟล์ build.gradle หรือในตำแหน่งเฉพาะภายในไฟล์?
Scala ผู้ที่กระตือรือร้น

16
-Dspring.profiles.active=staging -Dspring.config.location=C:\Config

ไม่ถูกต้อง.

ควรจะเป็น:

--spring.profiles.active=staging --spring.config.location=C:\Config

3
สิ่งนี้ทำให้เกิดข้อผิดพลาด "ตัวเลือกที่ไม่รู้จัก: --spring.config.location"
James Watkins

-D เป็นวิธีที่ถูกต้องในการตั้งค่าคุณสมบัติของระบบ Java - บางอย่างเป็นพารามิเตอร์ทุบตี
Xdg

--spring.profiles.active ใช้งานได้สำหรับฉันสิ่งเดียวกันที่ฉันอ้างถึงจากdocs.spring.io/spring-boot/docs/current/reference/html/ …
Pushkar

สิ่งนี้ใช้ได้กับฉันเมื่อใช้ Run As -> Java Application ใน Eclipse
Olivier Boissé

11
จริง ๆ แล้วทั้งสองถูกต้องขึ้นอยู่กับวิธีการใช้งาน: มันสามารถjava -Dspring.profiles.active=staging -Dspring.config.location=C:\Config your-spring-boot-app.jarORjava your-spring-boot.jar --spring.profiles.active=staging --spring.config.location=C:\Config
Dexter Legaspi

9

คุณสามารถใช้บรรทัดคำสั่งต่อไปนี้:

java -jar -Dspring.profiles.active=[yourProfileName] target/[yourJar].jar

9

มีอีกวิธีในการตั้งค่าตัวแปรOSคือSPRING_PROFILES_ACTIVE SPRING_PROFILES_ACTIVE

สำหรับเช่น:

SPRING_PROFILES_ACTIVE=dev gradle clean bootRun

การอ้างอิง: วิธีตั้งค่าโปรไฟล์สปริงที่ใช้งานอยู่


ใช่และสิ่งนี้จะช่วยหลีกเลี่ยงความจำเป็นในการโคลนด้วยวิธีที่ Gradle ส่งมอบคุณสมบัติของระบบผ่านแอปพลิเคชัน
ben3000

นี่เป็นวิธีที่เรียบร้อย ควรใช้เพื่อตั้งค่าผู้ใช้ฐานข้อมูลและรหัสผ่านและการกำหนดค่าที่ละเอียดอ่อนอื่น ๆ เพื่อไม่ให้มีการตรวจสอบในการควบคุมเวอร์ชัน
Igor Donin

7

เมื่อตั้งค่าโปรไฟล์ผ่านปลั๊กอิน Mavenคุณต้องทำผ่านrun.jvmArguments

mvn spring-boot:run -Drun.jvmArguments="-Dspring.profiles.active=production"

ด้วยตัวเลือกการแก้ปัญหา:

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -Dspring.profiles.active=jpa"

ฉันเคยเห็นทริปนี้ผู้คนมากมาย .. หวังว่ามันช่วย


1
ได้เปลี่ยนเป็นmvn spring-boot:run -Dspring-boot.run.profiles=foo,barดูที่: docs.spring.io/spring-boot/docs/current/maven-plugin/examples/…
rwenz3l

@ rwenz3l ขอบคุณ! ที่ใช้งานได้สำหรับฉันเพิ่งอัพเกรดโครงการจาก Spring Boot 1 เป็น 2 ตอนนี้ฉันเพิ่งเพิ่มพวกเขาทั้งหมดใน bashrc ของฉัน ... springmvn="mvn clean spring-boot:run -Dspring.profiles.active=local -Dspring-boot.run.profiles=local"
John Smith

5

ฉันคิดว่าปัญหาของคุณน่าจะเกี่ยวข้องกับ spring.config.location ของคุณที่ไม่ได้ลงท้ายด้วย "/"

อ้างถึงเอกสาร

หาก spring.config.location มีไดเรกทอรี (ตรงข้ามกับไฟล์) พวกเขาควรลงท้ายด้วย / (และจะถูกต่อท้ายด้วยชื่อที่สร้างจาก spring.config.name ก่อนที่จะโหลด)

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-application-property-files


ขอบคุณสำหรับการชี้ให้เห็น อย่างไรก็ตามเมื่อฉันรัน -Dspring.profiles.active = staging -Dspring.config.location = C: \ Config \ ก็ให้ปัญหาเดียวกันกับฉันเช่นกัน แม้โปรไฟล์ที่ใช้งานจะไม่ได้รับการสะท้อน ฉันคิดว่าด้วยเหตุผลบางอย่างบรรทัดคำสั่งของฉันไม่ได้รับการส่งผ่าน
O-OF-N

1
คุณควรทำตามคำแนะนำในคำถามนี้เพื่อส่ง args ไปยัง bootRun stackoverflow.com/questions/25079244/…
jst

ขอบคุณ. นั่นช่วยได้จริงๆ
O-OF-N

4

คำตอบของ Michael Yin นั้นถูกต้อง แต่ต้องมีคำอธิบายที่ดีกว่า!

พวกคุณหลายคนพูดว่านั่น-Dเป็นวิธีที่ถูกต้องในการระบุพารามิเตอร์ JVM และคุณพูดถูก แต่ไมเคิลก็พูดถูกในเอกสารประกอบSpring Boot Profiles

สิ่งที่ไม่ชัดเจนในเอกสารประกอบคือประเภทของพารามิเตอร์คือ: --spring.profiles.activeไม่ใช่พารามิเตอร์ JVM มาตรฐานดังนั้นหากคุณต้องการใช้ใน IDE ของคุณกรอกข้อมูลในฟิลด์ที่ถูกต้อง (เช่นอาร์กิวเมนต์ของโปรแกรม)


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