Menyetel profil aktif dan lokasi konfigurasi dari baris perintah di boot musim semi

164

Saya punya aplikasi boot musim semi.

Saya memiliki tiga profil dalam aplikasi saya - pengembangan, pementasan dan produksi . Jadi saya punya 3 file

  1. application-development.yml
  2. application-staging.yml
  3. application-production.yml

Application.yml saya berada di dalam src/main/resources. Saya telah menetapkan profil aktif di application.yml sebagai:

spring:
  profiles.active: development

3 file konfigurasi khusus profil lainnya ada di C:\configfolder.

Saya menggunakan plugin gradle untuk gerhana. Ketika saya mencoba melakukan " bootRun ", saya mengatur argumen baris perintah dalam konfigurasi gradle saya di gerhana sebagai

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

Namun, properti baris perintah tidak tercermin dan profil aktif saya selalu ditetapkan sebagai pengembangan (yang merupakan yang saya sebutkan dalam file application.yml). Juga C: \ Config folder tidak mencari file konfigurasi khusus profil.

Saya pikir saya kehilangan sesuatu di sini. Saya telah mencoba mencari tahu selama 2 hari terakhir. Tapi tidak berhasil. Saya sangat menghargai setiap bantuan.

O-OF-N
sumber
Bisakah Anda menambahkan bootRunbaris perintah Anda juga
Biju Kunjummen
Saya menjalankannya dari gerhana dan bukan baris perintah sampai sekarang. Tetapi saya mencoba menjalankan dari menggunakan "gradle bootRun -Dspring.config.location = C: \ Config \ -Dspring.profiles.active = staging" dan mendapatkan hasil yang sama.
O-OF-N

Jawaban:

341

Ada dua cara berbeda yang bisa Anda tambahkan / timpa properti pegas di baris perintah.

Opsi 1: Properti Sistem Java (Argumen VM)

Penting bahwa parameter -D ada sebelum aplikasi Anda. Jika tidak, mereka tidak dikenali.

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

Opsi 2: Argumen program

java -jar application.jar --spring.profiles.active = prod --spring.config.location = c: \ config
RenRen
sumber
45
Urutan parameter -D benar-benar penting :)
martin
3
bagaimana Anda bisa mencapai ini saat menggunakan untuk mengatakan wadah kucing jantan? Dalam hal ini saya hanya menempatkan perang saya ke folder aplikasi tomcat webapps, bagaimana cara saya memberikan info profil? dengan mengatur properti sistem?
prayagupd
@prayagupd ya, Anda dapat mengatur properti sistem di bash_profile Anda.
Salam sejahtera
2
@maneesh ya, saya menggunakan variabel env yang SPRING_PROFILES_ACTIVE diekspor via ~/.bash_profile. export SPRING_PROFILES_ACTIVE=e2e
prayagupd
1
Ketika Anda mengatakan bahwa urutan itu penting: Bisakah kita mengirimkan kedua argumen: -Dspring.profile.active dan -Dspring.config.lokasi sedemikian rupa sehingga, profil diatur sesuai dengan argumen pertama dan file properti diambil sesuai dengan args kedua? Misalnya:java -Dspring.profiles.active=$ENV -Dspring.config.location=file:///aws-secrets-manager/properties/application-$ENV.properties /code/app.jar
Pramod Setlur
26

Praktik terbaik saya adalah mendefinisikan ini sebagai argumen VM "-D". Harap perhatikan perbedaan antara spring boot 1.x dan 2.x.

Profil yang akan diaktifkan dapat ditentukan pada baris perintah:

Spring-Boot 2.x

-Dspring-boot.run.profiles=local

Spring-Boot 1.x

-Dspring.profiles.active=local

contoh penggunaan dengan pakar:

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

Pastikan untuk memisahkannya dengan koma untuk beberapa profil:

mvn spring-boot:run -Dspring.profiles.active=local,foo,bar
mvn spring-boot:run -Dspring-boot.run.profiles=local,foo,bar
Sma Ma
sumber
Maksud Anda spring / spring-boot? (Pegas 1x dan Pegas 2x)!
smilyface
1
@smilyface spring boot. spring boot juga tersedia dalam berbagai versi: mvnrepository.com/artifact/org.springframework.boot/spring-boot
Sma Ma
2
Saya menggunakan spring-boot 2.1.3, dan -Dspring-boot.run.profiles=localtidak berhasil, -Dspring.profiles.active=localberfungsi.
Donghua Liu
spring-boot 2.2.0: bekerja baik: -Dspring-boot.run.profilesdan-Dspring.profiles.active
Grigory Kislin
17

Saya harus menambahkan ini:

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

Dan sekarang bootRun mengambil profil dan mengkonfigurasi lokasi.

Terima kasih banyak @jst untuk penunjuknya.

O-OF-N
sumber
7
Hal ini dapat menjadi lebih sederhana sebagai berikut: bootRun { systemProperties = System.properties }. Perintah ini akan menyalin semua parameter yang diteruskan dengan -Dsakelar dengan tombol yang sama untuk systemPropertydipetakan.
edufinn
ini sepertinya hanya solusi gradle, apakah tidak ada solusi genik?
user1767316
1
Di mana tepatnya Anda menambahkan ini? Di mana saja di file build.gradle atau di lokasi tertentu di dalam file?
Scala Enthusiast
16
-Dspring.profiles.active=staging -Dspring.config.location=C:\Config

tidak benar.

seharusnya:

--spring.profiles.active=staging --spring.config.location=C:\Config
Michael Yin
sumber
3
Ini menyebabkan kesalahan "Opsi tidak dikenal: --spring.config.location"
James Watkins
-D adalah cara yang benar untuk mengatur properti Sistem Java. --sesuatu adalah parameter bash.
Xdg
--spring.profiles.active bekerja untuk saya, hal yang sama saya rujuk dari docs.spring.io/spring-boot/docs/current/reference/html/…
Pushkar
Ini juga berfungsi untuk saya ketika menggunakan Run As -> Java Application in Eclipse
Olivier Boissé
11
sebenarnya KEDUA benar, itu tergantung pada bagaimana ia digunakan: itu bisa java -Dspring.profiles.active=staging -Dspring.config.location=C:\Config your-spring-boot-app.jarATAUjava your-spring-boot.jar --spring.profiles.active=staging --spring.config.location=C:\Config
Dexter Legaspi
9

Anda dapat menggunakan baris perintah berikut:

java -jar -Dspring.profiles.active=[yourProfileName] target/[yourJar].jar
Rollen Holt
sumber
9

Ada cara lain dengan mengatur variabel OS , SPRING_PROFILES_ACTIVE .

untuk misalnya:

SPRING_PROFILES_ACTIVE=dev gradle clean bootRun

Referensi: Cara mengatur profil Spring aktif

Rothin Sen
sumber
Ya, dan ini menghindari perlunya muck berkeliling dengan cara Gradle menyerahkan properti sistem ke aplikasi.
ben3000
Ini cara yang rapi. Ini juga harus digunakan untuk mengatur pengguna basis data dan kata sandi dan konfigurasi sensitif lainnya sehingga mereka tidak diperiksa dalam kontrol versi.
Igor Donin
7

Saat mengatur profil melalui plugin Maven, Anda harus melakukannya viarun.jvmArguments

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

Dengan opsi debug:

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

Saya telah melihat perjalanan ini banyak orang. Semoga ini membantu

JARC
sumber
1
telah berubah menjadi mvn spring-boot:run -Dspring-boot.run.profiles=foo,bar, lihat: docs.spring.io/spring-boot/docs/current/maven-plugin/examples/…
rwenz3l
@ rwenz3l Terima kasih! yang bekerja untuk saya, baru saja meningkatkan proyek dari Spring Boot 1 ke 2. Sekarang saya hanya menambahkan semuanya di bashrc saya ... springmvn="mvn clean spring-boot:run -Dspring.profiles.active=local -Dspring-boot.run.profiles=local"
John Smith
5

Saya pikir masalah Anda kemungkinan terkait dengan spring.config.location Anda tidak mengakhiri jalan dengan "/".

Kutip dokumen

Jika spring.config.location berisi direktori (tidak seperti file) mereka harus diakhiri dengan / (dan akan ditambahkan dengan nama-nama yang dihasilkan dari spring.config.name sebelum dimuat).

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

pertama
sumber
terimakasih telah menunjukkan itu. Namun, ketika saya menjalankan -Dspring.profiles.active = staging -Dspring.config.location = C: \ Config \ juga memberi saya masalah yang sama. Bahkan profil aktif tidak tercermin. Saya pikir untuk beberapa alasan baris perintah saya tidak dilewati.
O-OF-N
1
Anda harus mengikuti saran yang diberikan dalam pertanyaan ini untuk meneruskan argumen ke bootRun stackoverflow.com/questions/25079244/...
jst
Terima kasih. Itu sangat membantu.
O-OF-N
4

Jawaban Michael Yin benar tetapi penjelasan yang lebih baik tampaknya diperlukan!

Banyak dari Anda menyebutkan itu -Dadalah cara yang benar untuk menentukan parameter JVM dan Anda benar sekali. Tetapi Michael juga benar seperti yang disebutkan dalam dokumentasi Spring Boot Profiles .

Apa yang tidak jelas dalam dokumentasi, adalah seperti apa parameternya: --spring.profiles.activebukan parameter JVM standar jadi jika Anda ingin menggunakannya dalam IDE Anda, isilah bidang yang benar (mis. Argumen program)

Eric Taix
sumber
0

Jika Anda menggunakan Gradle:

-Pspring.profiles.active=local
FredFlinstone
sumber