Đặt cấu hình hoạt động và vị trí cấu hình từ dòng lệnh trong khởi động mùa xuân


164

Tôi có một ứng dụng khởi động mùa xuân.

Tôi có ba hồ sơ trong ứng dụng của mình-> phát triển, dàn dựng và sản xuất . Vậy là tôi có 3 file.

  1. ứng dụng-phát triển.yml
  2. ứng dụng-staging.yml
  3. ứng dụng-sản xuất.yml

Application.yml của tôi nằm bên trong src/main/resources. Tôi đã thiết lập hồ sơ hoạt động trong application.yml là:

spring:
  profiles.active: development

3 tập tin cấu hình cụ thể hồ sơ khác có trong C:\configthư mục.

Tôi đang sử dụng plugin gradle cho nhật thực. Khi tôi cố gắng thực hiện " bootRun ", tôi đang thiết lập các đối số dòng lệnh trong cấu hình lớp của tôi trong nhật thực là

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

Tuy nhiên, thuộc tính dòng lệnh không được phản ánh và hồ sơ hoạt động của tôi luôn được đặt là phát triển (đó là thuộc tính mà tôi đã đề cập trong tệp application.yml). Ngoài ra, thư mục C: \ Config không được tìm kiếm cho các tệp cấu hình cụ thể của cấu hình.

Tôi nghĩ rằng tôi đang thiếu một cái gì đó ở đây. Tôi đã cố gắng để tìm ra nó trong 2 ngày qua. Nhưng không có may mắn. Tôi thực sự sẽ đánh giá cao bất kỳ sự giúp đỡ.


Bạn có thể vui lòng thêm bootRundòng lệnh của mình không
biju Kunjummen

Tôi đã chạy nó từ nhật thực và không phải dòng lệnh cho đến bây giờ. Nhưng tôi đã thử chạy bằng cách sử dụng "gradle bootRun -Dspring.config.location = C: \ Config \ -Dspring.profiles.active = staging" và nhận được kết quả tương tự.
O-OF-N

Câu trả lời:


341

Có hai cách khác nhau để bạn có thể thêm / ghi đè các thuộc tính lò xo trên dòng lệnh.

Tùy chọn 1: Thuộc tính hệ thống Java (Đối số VM)

Điều quan trọng là các tham số -D nằm trước application.jar của bạn nếu không chúng không được nhận dạng.

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

Lưu ý: Trong Spring Boot 2, bây giờ -Dspring-boot.run.profiles=prod


Tùy chọn 2: Đối số chương trình

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

45
Thứ tự của các tham số -D thực sự quan trọng :)
martin

3
Làm thế nào bạn có thể đạt được điều này trong khi triển khai để nói container tomcat? Trong trường hợp đó, tôi chỉ cần đặt cuộc chiến của mình vào thư mục ứng dụng web của tomcat, làm cách nào để cung cấp thông tin hồ sơ? bằng cách thiết lập thuộc tính hệ thống?
nguyện

@prayagupd có, bạn có thể đặt thuộc tính hệ thống trong bash_profile của mình.
lời chúc tốt nhất

2
@maneesh yeah, tôi đang sử dụng biến env được SPRING_PROFILES_ACTIVE xuất qua ~/.bash_profile. export SPRING_PROFILES_ACTIVE=e2e
nguyện

1
Khi bạn nói thứ tự là quan trọng: Chúng ta có thể vượt qua trong cả hai đối số: -Dspring.profile.active và -Dspring.config.location sao cho, cấu hình được đặt theo đối số đầu tiên và tệp thuộc tính được chọn theo lập luận thứ hai? Ví dụ:java -Dspring.profiles.active=$ENV -Dspring.config.location=file:///aws-secrets-manager/properties/application-$ENV.properties /code/app.jar
Pramod Setlur

26

Cách thực hành tốt nhất của tôi là định nghĩa đây là đối số VM "-D". Xin lưu ý sự khác biệt giữa boot mùa xuân 1.x và 2.x.

Các cấu hình để kích hoạt có thể được chỉ định trên dòng lệnh:

Khởi động mùa xuân 2.x

-Dspring-boot.run.profiles=local

Khởi động mùa xuân 1.x

-Dspring.profiles.active=local

sử dụng ví dụ với maven:

Khởi động mùa xuân 2.x

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

Khởi động mùa xuân 1.x

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

Đảm bảo tách chúng bằng dấu phẩy cho nhiều cấu hình:

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

Bạn có nghĩa là mùa xuân / mùa xuân khởi động? (Mùa xuân 1x và mùa xuân 2x)!
smilyface

1
@smilyface khởi động mùa xuân. boot mùa xuân cũng có sẵn trong các phiên bản khác nhau: mvnreposective.com/artifact/org.springframework.boot/spring-boot
Sma Ma

2
Tôi sử dụng spring-boot 2.1.3 và -Dspring-boot.run.profiles=localkhông hoạt động -Dspring.profiles.active=local.
Lưu Hoa

spring-boot 2.2.0: hoạt động cả hai: -Dspring-boot.run.profiles-Dspring.profiles.active
Grigory Kislin

17

Tôi đã phải thêm điều này:

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

Và bây giờ bootRun chọn vị trí cấu hình và cấu hình.

Cảm ơn rất nhiều @jst cho con trỏ.


7
Điều này có thể thậm chí đơn giản hơn như sau : bootRun { systemProperties = System.properties }. Lệnh này sẽ sao chép tất cả các tham số được truyền bằng -Dcông tắc có cùng các phím để systemPropertyánh xạ.
edufinn

Đây dường như là một giải pháp duy nhất, không có giải pháp nào?
dùng1767316

1
Chính xác thì bạn đang thêm cái này ở đâu? Bất cứ nơi nào trong tệp build.gradle hoặc ở một vị trí cụ thể trong tệp?
Scala nhiệt tình

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

không đúng

nên là:

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

3
Điều này gây ra lỗi "Tùy chọn không được nhận dạng: --spring.config.location"
James Watkins

-D là cách chính xác để đặt các thuộc tính Hệ thống Java. - một cái gì đó là một tham số bash.
Xdg

--spring.profiles. hoạt động tích cực đối với tôi, điều tương tự tôi đã giới thiệu từ docs.spring.io/spring-boot/docs/civerse/reference/html/ít
Pushkar

Điều này cũng hoạt động với tôi khi sử dụng Run As -> Ứng dụng Java trong Eclipse
Olivier Boissé

11
Thật ra cả hai đều đúng, nó phụ thuộc vào cách sử dụng: nó có thể java -Dspring.profiles.active=staging -Dspring.config.location=C:\Config your-spring-boot-app.jarHOẶCjava your-spring-boot.jar --spring.profiles.active=staging --spring.config.location=C:\Config
Dexter Legaspi

9

bạn có thể sử dụng dòng lệnh sau:

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

9

Có một cách khác bằng cách đặt biến hệ điều hành , SPRING_PROFILES_ACTIVE .

ví dụ:

SPRING_PROFILES_ACTIVE=dev gradle clean bootRun

Tham khảo: Cách đặt cấu hình Spring hoạt động


Có, và điều này tránh sự cần thiết phải làm quen với cách Gradle trao các thuộc tính hệ thống cho ứng dụng.
ben3000

Đây là cách gọn gàng. Nó cũng nên được sử dụng để đặt người dùng cơ sở dữ liệu và mật khẩu và các cấu hình nhạy cảm khác để chúng không được kiểm tra trong kiểm soát phiên bản.
Igor Donin

7

Khi thiết lập hồ sơ thông qua plugin Maven, bạn phải thực hiện thông quarun.jvmArguments

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

Với tùy chọn gỡ lỗi:

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

Tôi đã thấy chuyến đi này rất nhiều người .. hy vọng nó sẽ giúp


1
đã thay đổi đến mvn spring-boot:run -Dspring-boot.run.profiles=foo,bar, xem: docs.spring.io/spring-boot/docs/current/maven-plugin/examples/...
rwenz3l

@ rwenz3l Cảm ơn! nó hoạt động với tôi, chỉ cần nâng cấp một dự án từ Spring Boot 1 lên 2. Bây giờ tôi chỉ cần thêm tất cả chúng vào bashrc của mình ... springmvn="mvn clean spring-boot:run -Dspring.profiles.active=local -Dspring-boot.run.profiles=local"
John Smith

5

Tôi nghĩ rằng vấn đề của bạn có thể liên quan đến spring.config.location không kết thúc đường dẫn bằng "/".

Trích dẫn các tài liệu

Nếu spring.config.location chứa các thư mục (trái ngược với các tệp), chúng sẽ kết thúc bằng / (và sẽ được thêm vào với các tên được tạo từ spring.config.name trước khi được tải).

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


Cảm ơn vì chỉ ra điều ấy. Tuy nhiên, khi tôi chạy -Dspring.profiles.active = staging -Dspring.config.location = C: \ Config \ cũng cho tôi vấn đề tương tự. Ngay cả hồ sơ hoạt động không được phản ánh. Tôi nghĩ vì một số lý do mà dòng lệnh của tôi không được thông qua.
O-OF-N

1
Bạn nên làm theo những lời khuyên được đưa ra trong câu hỏi này để vượt qua args để bootRun stackoverflow.com/questions/25079244/...
JST

Cảm ơn bạn. Điều đó thực sự có ích.
O-OF-N

4

Câu trả lời của Michael Yin là đúng nhưng dường như cần phải có một lời giải thích tốt hơn!

Rất nhiều bạn đã đề cập rằng đó -Dlà cách chính xác để xác định các tham số JVM và bạn hoàn toàn đúng. Nhưng Michael cũng đúng như được đề cập trong tài liệu Spring Boot Profiles .

Điều không rõ ràng trong tài liệu này là loại tham số nào: --spring.profiles.activekhông phải là tham số JVM tiêu chuẩn, vì vậy nếu bạn muốn sử dụng nó trong IDE, hãy điền vào các trường chính xác (ví dụ: đối số chương trình)


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.