ฉันจะเปิดใช้งานโปรไฟล์ Spring Boot ได้อย่างไรเมื่อเรียกใช้จาก IntelliJ


133

ฉันมี 5 สภาพแวดล้อม:

 - local (my development machine)
 - dev
 - qc
 - uat
 - live
 - staging

ฉันต้องการใช้คุณสมบัติแอปพลิเคชันที่แตกต่างกันสำหรับแต่ละสภาพแวดล้อมดังนั้นฉันมีไฟล์คุณสมบัติต่อไปนี้ซึ่งแต่ละไฟล์มี URL ที่แตกต่างกันสำหรับแหล่งข้อมูล:

 - application.properties  (containing common properties)
 - application-local.properties
 - application-dev.properties
 - application-qc.properties
 - application-uat.properties
 - application-live.properties

ฉันใช้ IntelliJ และเรียกใช้แอปของฉันโดยใช้ bootRun ในปลั๊กอิน Gradle บนเครื่องของฉัน ฉันจะใช้การปรับใช้ไฟล์แอปพลิเคชั่นไฟล์เดียวกันบนสภาพแวดล้อมอื่น ๆ ทั้งหมดที่รัน Tomcat

ฉันได้ลองเพิ่ม:

--spring.profiles.active = ท้องถิ่น

กับคอนฟิกูเรชันรันภายใต้พารามิเตอร์สคริปต์

ฉันลองเพิ่มแล้ว

-Dspring.profiles.active = ท้องถิ่น

สู่การกำหนดค่าการรันภายใต้ตัวเลือก VM

ไม่ทำงาน ฉันเห็นข้อความ INFO เมื่อเริ่มต้นพูดว่า: ไม่มีการตั้งค่าโปรไฟล์ที่ใช้งานอยู่กลับไปที่โปรไฟล์เริ่มต้น: เริ่มต้น

หากฉันเรียกใช้แอพจากบรรทัดคำสั่งของ windows โดยใช้

gradle bootRun

แต่ก่อนอื่นฉันตั้งค่าตัวแปรสภาพแวดล้อม

set SPRING_PROFILES_ACTIVE=local

จากนั้นทุกอย่างทำงานได้

ดังนั้นคำถามของฉันคือฉันจะเปิดใช้งานโปรไฟล์บูตฤดูใบไม้ผลิท้องถิ่นของฉันเมื่อใช้ bootRun จาก IntelliJ ได้อย่างไร


1
เหตุใดคุณจึงเรียกใช้แอปพลิเคชันผ่านการไล่ระดับที่นั่น การใช้การกำหนดค่าการเรียกใช้จะสะดวกกว่านี้อีก 10 เท่าหรือไม่ มีฟิลด์ที่คุณสามารถตั้งค่าโปรไฟล์เป็น ...
Stephane Nicoll

ฉันใช้การกำหนดค่าการทำงานใน IntelliJ ดังที่อธิบายไว้ข้างต้น มันไม่ทำงาน
dleerob

2
ไม่คุณไม่ได้ สิ่งที่ฉันกำลังพูดถึงคือ "Run Spring Configuration" Run -> Edit configuration> New> Spring Boot
Stephane Nicoll

ใช่ฉันย้ายออกจากการกำหนดค่าการเรียกใช้ Spring Boot เนื่องจากฉันต้องการขยาย project.properties ไปยัง application.properties ใน build.gradle ของฉันและถ้าฉันใช้การกำหนดค่าการเรียกใช้ Spring Boot ดูเหมือนว่าจะไม่ทำงาน ฉันจะมองเข้าไปในการแก้ไขปัญหานั้นและบางทีฉันก็สามารถใช้ข้อมูลรายละเอียดการใช้งานตามที่คุณแนะนำ
dleerob

1
การใช้การกำหนดค่าของ Spring Boot ดูเหมือนจะมีปัญหามากกว่าความคุ้มค่า 'สร้าง' เพียงคัดลอกข้ามแหล่งข้อมูลและไม่กรอง / แก้ไขตามที่สร้างโดยสคริปต์ จากนั้นบอกให้เรียกใช้ 'บิลด์' จากการไล่ระดับสีแทน 'สร้าง' เพียงแค่ทำให้การทำงานหยุดลง ถ้าฉันใช้ bootRun แทนพร้อมกับรายการสภาพแวดล้อมของฉันตามคำตอบด้านล่างทั้งหมดทำงานได้ดี
dleerob

คำตอบ:


194

ฉันเพิ่มลง-Dspring.profiles.active=testในตัวเลือกของ VM แล้วเรียกใช้การกำหนดค่านั้นอีกครั้ง มันทำงานได้อย่างสมบูรณ์

สิ่งนี้สามารถกำหนดได้โดย

  • เลือก Run | Edit Configurations...
  • ไปที่Configurationแท็บ
  • ขยายEnvironmentส่วนที่จะเปิดเผยVM options

ฉันติดอยู่ในสถานการณ์เดียวกัน แต่สำหรับโครงการ Maven ขอบคุณสำหรับความช่วยเหลือ เราได้ตั้งค่าตัวเลือก VM สำหรับไฟล์ทดสอบแต่ละไฟล์
Sri9911

2
มันไม่ทำงานสำหรับฉันด้วย ฉันใช้ gradle และสองโมดูล (api และ ui)
Virkom

1
ไม่ได้ผลสำหรับฉันเช่นกันโดยใช้การไล่ระดับสีที่นี่
IARI

สวัสดีฉันมีปัญหาเดียวกัน แต่การแก้ไขนี้ไม่สามารถแก้ไขปัญหาได้ เรียกใช้การกำหนดค่าใหม่ที่นี่ มันเป็นเช่นเดียวกับการทำงานซ้ำ?
user1456110

ฉันรันการทดสอบนั้นหลังจากแก้ไขตามที่แสดง
Thom

82

หากคุณใช้ประโยชน์จากการกำหนดค่าการทำงานของ Spring boot (ปัจจุบันรองรับเฉพาะใน Ultimate Edition) เป็นเรื่องง่ายที่จะกำหนดค่าโปรไฟล์ล่วงหน้าในการตั้งค่า "Active Profiles"

ป้อนคำอธิบายรูปภาพที่นี่


1
ขอบคุณฉันแน่ใจว่าจะใช้งานได้ แต่ฉันไม่ได้ใช้การกำหนดค่าการทำงานของ Spring Boot ฉันกำลังใช้การกำหนดค่าการเรียกใช้แบบ Gradle ซึ่งไม่มีฟิลด์ "โปรไฟล์ที่ใช้งานอยู่" ตัวกรอง gradle ของฉันและแก้ไขไฟล์คุณสมบัติบางไฟล์ที่คัดลอกไปยังไดเรกทอรีการสร้างดังนั้นฉันจึงใช้การกำหนดค่าการเรียกใช้เกรดสำหรับสิ่งนี้
dleerob

ดังที่คำตอบข้างต้นชี้ให้เห็น: หากสิ่งนี้ไม่ได้ผลสำหรับคุณตรวจสอบให้แน่ใจว่าคุณกำลังผ่านเข้ามาargsในApplication.main()ตัวอย่างของคุณSpringApplication.run( Application.class, args );
Xaero Degreaz

คุณสมบัตินี้รองรับใน Ultimate edition เท่านั้น
Julien Malige

ขอบคุณ @JulienMalige สำหรับการชี้เรื่องนี้ ฉันจะแก้ไขคำตอบของฉัน
Daniel Bubenheim

11

ลองเพิ่มคำสั่งนี้ใน build.gradle ของคุณ

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นสำหรับการรันการกำหนดค่ารูปร่างนั้น:

ป้อนคำอธิบายรูปภาพที่นี่


9

ดูเหมือนว่า Spring Boot ได้เปลี่ยนวิธีการอ่านตัวเลือก VM ในขณะที่วิวัฒนาการ นี่คือวิธีที่จะลองเมื่อคุณเปิดใช้งานแอปพลิเคชันใน Intellij และต้องการเปิดใช้งานโปรไฟล์:

1. เปลี่ยนตัวเลือก VM

เปิด "แก้ไขการกำหนดค่า" ใน "เรียกใช้" และใน "ตัวเลือก VM" ให้เพิ่ม: -Dspring.profiles.active=local

มันใช้งานได้จริงกับโครงการหนึ่งของฉันด้วยSpring Boot v2.0.3.RELEASEและSpring v5.0.7.RELEASEไม่ใช่กับอีกโครงการหนึ่งที่มีSpring Boot v2.1.1.RELEASEและSpring v5.1.3.RELEASEและ

นอกจากนี้เมื่อทำงานกับ Maven หรือ JAR ผู้คนพูดถึงสิ่งนี้:

mvn spring-boot:run -Drun.profiles=dev

หรือ

java -jar -Dspring.profiles.active=dev XXX.jar

(ดูที่นี่: วิธีใช้โปรไฟล์ Spring Boot )

2. การผ่าน JVM

มีการกล่าวถึงบางที่สปริงเปลี่ยนวิธีการเปิดใช้กระบวนการของแอปพลิเคชันหากคุณระบุตัวเลือก JVM บางตัว; มันใช้กระบวนการอื่นและจะไม่ผ่าน ARG ที่ได้รับดังนั้นจึงไม่ทำงาน วิธีเดียวที่จะผ่าน args ไปที่มันคือ:

mvn spring-boot:run -Dspring-boot.run.jvmArguments="..."

อีกครั้งสำหรับ Maven https://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/run-debug.html

3. การตั้งค่า (แอปพลิเคชัน) env var

อะไรที่เหมาะกับฉันสำหรับโครงการที่สองคือการตั้งค่าตัวแปรสภาพแวดล้อมตามที่กล่าวไว้ในคำตอบข้างต้น: "แก้ไขการกำหนดค่า" - "ตัวแปรสภาพแวดล้อม" และ:

SPRING_PROFILES_ACTIVE=local

1
วา env SPRING_PROFILES_ACTIVEจริงควรจะเป็น
Josh M.

ฉันเพิ่มมันใน "Run configuration" ของ IDEA "VM options" เช่น "spring.profiles.active" และใช้งานได้ อาจใช้รูปแบบอื่นเช่น urs ที่ใช้ทั้งระบบในคุณสมบัติของระบบหรือไม่
WesternGun

หากคุณเพิ่มไปยัง~/.profileหรือที่คล้ายกันคุณจะต้องใช้SPRING_PROFILES_ACTIVE- spring.profiles.activeมีแนวโน้มที่จะทำงานเป็นอาร์กิวเมนต์ในบรรทัดคำสั่งเท่านั้น
Josh M.

1
อ่า .. คุณหมายถึงอย่างเดียวกับที่ฉันสงสัย ระบบจริง env ไม่เพียง แต่แอปพลิเคชัน env ตกลงฉันทำการแก้ไข
WesternGun

8

ฉันลงเอยด้วยการเพิ่มสิ่งต่อไปนี้ใน build.gradle ของฉัน:

bootRun {
  environment SPRING_PROFILES_ACTIVE: environment.SPRING_PROFILES_ACTIVE ?: "local"
}

test {
  environment SPRING_PROFILES_ACTIVE: environment.SPRING_PROFILES_ACTIVE ?: "test"
}

ดังนั้นเมื่อรัน bootRun จาก IntelliJ ค่าเริ่มต้นจะไปที่โปรไฟล์ "local"

ในสภาพแวดล้อมอื่น ๆ ของเราเราจะตั้งค่าตัวแปรสภาพแวดล้อม 'SPRING_PROFILES_ACTIVE' ใน Tomcat

ฉันได้รับสิ่งนี้จากความคิดเห็นที่นี่: https://github.com/spring-projects/spring-boot/pull/592


6

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

public static final void main(String... args) {
    SpringApplication.run(Application.class, args);
}

ขอบคุณสำหรับการตอบกลับและข้อเสนอแนะ แต่ฉันผ่านข้อโต้แย้งมา
dleerob

นี่แก้ไขปัญหาของฉันได้จริง ด้วยเหตุผลบางอย่างเมื่อฉันสร้างโครงการโดยใช้ Gradle มันไม่ได้สร้างApplicationคลาสของฉันโดยอัตโนมัติด้วยมือจากหน่วยความจำ พลาดargsขั้นตอนไปดังนั้นกล่อง "Active Profiles" ในการกำหนดค่าการทำงานไม่ทำงาน - ฉันต้องผ่านด้วยตนเองใน-Dspring.profiles.activeกล่องตัวเลือก VM
Xaero Degreaz

3

ฉันใช้ Intellij Community Edition ไปที่ "Run / Debug Configurations"> แท็บ Runner> ตัวแปรสภาพแวดล้อม> คลิกปุ่ม "... " เพิ่ม: SPRING_PROFILES_ACTIVE = ท้องถิ่น

spring.profiles.active



2

ในกรณีของฉันฉันใช้การกำหนดค่าด้านล่างที่ตัวเลือก VM ในIntelliJมันไม่ได้เลือกการกำหนดค่าท้องถิ่น แต่หลังจากรีสตาร์ทIntelliJมันเลือกรายละเอียดการกำหนดค่าจากIntelliJและบริการเริ่มทำงาน

-Dspring.profiles.active=local

0

ลองสิ่งนี้ แก้ไขไฟล์ build.gradle ของคุณดังต่อไปนี้

ext { profile = project.hasProperty('profile') ? project['profile'] : 'local' }


-3

ตั้งค่า-Dspring.profiles.active=localภายใต้อาร์กิวเมนต์ของโปรแกรม


ฉันได้ลบคำพูดออกจากคำถามด้านบน ฉันไม่ได้ใช้อัญประกาศจริง ๆ ฉันเพียงแค่พยายามแสดงสิ่งที่ฉันใส่ลงในเขตข้อมูลการกำหนดค่าการเรียกใช้อย่างสมบูรณ์
dleerob

5
คุณหมายถึงตัวเลือก VM!
Michail Michailidis

คำตอบนี้ทำให้เข้าใจผิดมากเนื่องจากข้อโต้แย้งของโปรแกรมจะไม่ได้รับการยอมรับจากแอปพลิเคชัน!
yuranos

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