Môi trường tệp application.properties cụ thể trong ứng dụng Spring Boot [đã đóng]


85

Trong ứng dụng Spring Boot của tôi, tôi muốn tạo tệp thuộc tính môi trường cụ thể. Loại đóng gói ứng dụng của tôi trong chiến tranh và tôi đang thực thi nó trong tomcat được nhúng. Tôi sử dụng sts và thực hiện chính từ sts chính nó.

  1. Tôi có thể có tệp thuộc tính môi trường cụ thể như ứng dụng - $ {env-value} .properties không?

Trong trường hợp trên, env-value sẽ có các giá trị là local / devl / test / prod

  1. Đặt tệp env-value ở đâu? Đối với cục bộ, tôi có thể đặt nó làm đối số jvm thông qua sts

  2. Ai đọc ứng dụng application.properties trong ứng dụng Spring Boot.

  3. Làm thế nào để tải tệp thuộc tính môi trường cụ thể? Ví dụ: nếu tôi đặt cơ sở dữ liệu uid, pwd, lược đồ, v.v. trong tệp thuộc tính môi trường cụ thể, trong trường hợp đó nguồn dữ liệu có thể hiểu các thuộc tính trong đó không?

  4. Tôi có thể sử dụng tệp application.properties và application-local.properties cùng một lúc không?


Bạn đã đọc cái này chưa? Về cơ bản, nó được hỗ trợ bên ngoài.
M. Deinum

Tôi đã làm nhưng điều đó không hoạt động. Vì vậy, tôi có tệp application.properties và tệp application-local.properties ở cùng một vị trí. Tệp application-local.properties chứa các thuộc tính liên quan đến db. application.properties có một thuộc tính duy nhất liên quan đến Spring mvc. Ngoài ra tôi thêm -Dprofile = địa phương như cấu hình debug nhưng giá trị này là không nhận được nhặt
user3534483

bởi vì bạn cần thiết lập spring.active.profilesđể sử dụng -Dspring.active.profiles=local. thay thế.
M. Deinum

Không thành công thưa ông. vì vậy thay vì -Dprofile, tôi hiện đang sử dụng -Dspring.active.profiles = local. Và sau đó trong tệp cấu hình của tôi, tôi cố gắng tìm nạp giá trị String driverClassName = env.getProperty ("driverClassName"); env là môi trường từ mùa xuân
user3534483

1
Xin lỗi tôi xấu, trộn nó xung quanh :).
M. Deinum

Câu trả lời:


170

Spring Boot đã hỗ trợ các thuộc tính dựa trên cấu hình .

Chỉ cần thêm application-[profile].propertiestệp và chỉ định cấu hình để sử dụng bằng thuộc spring.profiles.activetính.

-Dspring.profiles.active=local

Điều này sẽ tải application.propertiesapplication-local.propertiesvới các thuộc tính ghi đè sau từ đầu tiên.


1
Chúng ta có thể ghi đè việc sử dụng các thuộc tính ứng dụng bằng một tệp khác cho hồ sơ cụ thể mà không cần tải cả hai không? Đối với các bài kiểm tra hoặc nhà phát triển chẳng hạn?
Hassam Abdelillah

1
M. Deinum, tôi cũng gặp vấn đề tương tự, tôi có application.yml và application-qa.yml và tôi đã đưa -Dspring.profiles.active = qa, cả hai tệp đều được đọc nhưng các thuộc tính từ application-qa.yml không ghi đè thuộc tính từ application.yml, tôi luôn chỉ thấy các thuộc tính từ application.yml? có cách nào để chỉ định mức độ ưu tiên?
Suresh Chaganti

5
Xin chào cả hai, Điều này có thể giải quyết vấn đề của bạn. docs.spring.io/spring-boot/docs/current/reference/html/… Ví dụ: mkyong.com/spring-boot/…
Anand Varkey Philips

Tôi đang viết mã cho aws lambda và có thể chuyển key = value này làm giá trị môi trường - có thể được truy cập bằng cách sử dụng System.getenv () - nó sẽ hoạt động chứ?
Abdeali Chandanwala

Tôi có 4 tệp ứng dụng- {profile} .properties. Và tôi muốn chạy cùng một tệp jar trong môi trường khác nhau, giả sử như dev, test, prod. Vì vậy, tôi không thể sử dụng -Dspring.profiles.active = local. Vui lòng sửa cho tôi nếu tôi thiếu một cái gì đó.
Ashish Burnwal

24

Có bạn có thể. Vì bạn đang sử dụng mùa xuân, hãy kiểm tra @PropertySourcechú thích.

Chú thích cấu hình của bạn với

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

Bạn có thể gọi nó là bất cứ khi nào bạn thích và thêm nhiều tệp tài sản nhà trọ nếu bạn cũng muốn. Có thể tốt nếu bạn có nhiều bộ và / hoặc mặc định hơn thuộc về tất cả các môi trường (cũng có thể được viết bằng @PropertySource {..., ..., ...}).

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

Sau đó, bạn có thể khởi động ứng dụng với môi trường

-Dspring.active.profiles=test

Trong ví dụ này, tên sẽ được thay thế bằng ứng dụng-test-thuộc tính, v.v.


2
Vấn đề là đó $spring.profiles.active}là một chuỗi được phân tách bằng mảng / dấu phẩy. Vì vậy, nó có thể không làm những gì bạn mong đợi / muốn nó làm khi có nhiều cấu hình hoạt động.
M. Deinum

Điều đó đúng, nhưng hoạt động tốt đối với hai cấu hình - một mặc định và một được xác định bằng PropertySource. Để xử lý tài sản nâng cao hơn, tôi nghĩ bạn sẽ phải xem bên ngoài Spring. Ngoài ra, PropertySource chỉ được đọc trong khi khởi động. Các thư viện khác, nâng cao hơn để xử lý thuộc tính, cũng có thể thay đổi thời gian chạy thuộc tính.
Tzen

2
Điều này đã hiệu quả, nhưng tôi vẫn không hiểu tại sao tôi phải làm điều này theo cách thủ công. Trong một trong những kho lưu trữ khác của tôi, tôi không phải làm điều này.
The Java Guy

7

chúng ta có thể làm như thế này:

trong application.yml :

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

trong application-test.yml :

server:
  port: 5000

và trong application-local.yml :

server:
  address: 0.0.0.0
  port: 8080

sau đó khởi động mùa xuân sẽ khởi động ứng dụng của chúng tôi như chúng tôi muốn.


2
Không phải bạn đang mã hóa hồ sơ hoạt động theo cách này sao ?? :(
Anna Medyukh

0

Quan điểm của tôi, Ở đây không phải là cách yêu cầu nhà phát triển tạo tất cả môi trường liên quan đến một lượt, dẫn đến nguy cơ để lộ Cấu hình sản xuất cho nhà phát triển cuối

theo 12-Factor, không nên là môi trường cụ thể chỉ nằm trong Enviornment.

Làm thế nào để chúng tôi làm cho CI CD

  • Xây dựng Spring một lần và quảng bá cho môi trường khác, trong trường hợp đó, nếu chúng ta có Spring jar có tất cả môi trường, nó sẽ có nguy cơ bảo mật, có tất cả các biến môi trường trong GIT
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.