Helpex - Trao đổi & giúp đỡ Đăng nhập
85

Tôi có nhiều tệp thuộc tính mà tôi muốn tải từ classpath. Có một bộ mặc định theo /src/main/resourcesđó là một phần của myapp.jar. Tôi springcontexthy vọng các tập tin sẽ được trên classpath. I E

<util:properties id="Job1Props"
    location="classpath:job1.properties"></util:properties>

<util:properties id="Job2Props"
    location="classpath:job2.properties"></util:properties>

Tôi cũng cần tùy chọn ghi đè các thuộc tính này bằng một bộ bên ngoài. Tôi có một thư mục cấu hình bên ngoài cwd. Theo thư mục cấu hình khởi động mùa xuân nên trên classpath. Nhưng nó không rõ ràng từ doc nếu nó sẽ chỉ ghi đè applicaiton.propertiestừ đó hoặc tất cả các thuộc tính trong cấu hình.

Khi tôi kiểm tra nó, chỉ application.propertiesđược chọn và phần còn lại của các thuộc tính vẫn được chọn từ đó /src/main/resources. Tôi đã thử cung cấp chúng dưới dạng danh sách được phân tách bằng dấu phẩy spring.config.locationnhưng bộ mặc định vẫn không bị ghi đè.

Làm cách nào để tạo tập tin cấu hình bên ngoài ghi đè lên tập tin mặc định?

Như cách giải quyết tôi hiện đang sử dụng app.config.location(thuộc tính ứng dụng cụ thể) mà tôi cung cấp thông qua dòng lệnh. I E

java -jar myapp.jar app.config.location=file:./config

và tôi đã thay đổi tôi applicationcontextđể

<util:properties id="Job2Props"
    location="{app.config.location}/job2.properties"></util:properties>

Và đây là cách tôi tạo sự tách biệt giữa tệp và classpath trong khi tải Ứng dụng.
CHỈNH SỬA:

//psuedo code

if (StringUtils.isBlank(app.config.location)) {
            System.setProperty(APP_CONFIG_LOCATION, "classpath:");
}

Tôi thực sự muốn không sử dụng cách giải quyết ở trên và có ghi đè tất cả các tệp cấu hình bên ngoài trên đường dẫn lớp giống như đối với application.propertiestệp.

85 hữu ích 1 bình luận 274k xem chia sẻ
11 trả lời 11
114

Khi sử dụng Spring Boot, các thuộc tính được tải theo thứ tự sau (xem Cấu hình ngoài trong hướng dẫn tham chiếu Spring Boot).

  1. Đối số dòng lệnh.
  2. Thuộc tính hệ thống Java (System.getProperIES ()).
  3. Biến môi trường hệ điều hành.
  4. Thuộc tính JNDI từ java: comp / env
  5. Một RandomValuePropertySource chỉ có các thuộc tính ngẫu nhiên. *.
  6. Các thuộc tính ứng dụng bên ngoài bình được đóng gói của bạn (application.properations bao gồm YAML và các biến thể hồ sơ).
  7. Các thuộc tính ứng dụng được đóng gói bên trong bình của bạn (application.properations bao gồm YAML và các biến thể hồ sơ).
  8. Chú thích @PropertySource trên các lớp @Configuration của bạn.
  9. Thuộc tính mặc định (được chỉ định bằng SpringApplication.setDefaultProperIES).

Khi giải quyết các thuộc tính (nghĩa là @Value("${myprop}")giải quyết được thực hiện theo thứ tự ngược lại (bắt đầu bằng 9).

Để thêm các tệp khác nhau, bạn có thể sử dụng các spring.config.locationthuộc tính có danh sách tệp thuộc tính hoặc vị trí tệp (thư mục) được phân tách bằng dấu phẩy.

-Dspring.config.location=your/config/dir/

Một ở trên sẽ thêm một thư mục sẽ được tư vấn cho application.propertiescác tập tin.

-Dspring.config.location=classpath:job1.properties,classpath:job2.properties

Điều này sẽ thêm tệp 2 thuộc tính vào các tệp được tải.

Các tệp và vị trí cấu hình mặc định được tải trước các tệp được chỉ định bổ sung spring.config.locationcó nghĩa là tệp sau sẽ luôn ghi đè các thuộc tính được đặt trong các thuộc tính trước đó. (Xem thêm phần này của Hướng dẫn tham khảo khởi động mùa xuân).

Nếu spring.config.locationchứ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 các tên được tạo từ spring.config.nametrước khi được tải). Đường dẫn tìm kiếm mặc định classpath:,classpath:/config,file:,file:config/luôn được sử dụng, không phân biệt giá trị của spring.config.location. Theo cách đó, bạn có thể thiết lập các giá trị mặc định cho ứng dụng của mình application.properties(hoặc bất kỳ tên cơ sở nào khác bạn chọn spring.config.name) và ghi đè lên nó trong thời gian chạy bằng một tệp khác, giữ nguyên mặc định.

CẬP NHẬT: Vì hành vi của spring.config.location hiện ghi đè mặc định thay vì thêm vào nó. Bạn cần sử dụng spring.config.additable-location để giữ mặc định. Đây là thay đổi hành vi từ 1.x sang 2.x

114 hữu ích 5 bình luận chia sẻ
27

Với Spring boot, spring.config.location hoạt động, chỉ cần cung cấp các tệp thuộc tính được phân tách bằng dấu phẩy.

xem mã dưới đây

@PropertySource(ignoreResourceNotFound=true,value="classpath:jdbc-${spring.profiles.active}.properties")
public class DBConfig{

     @Value("${jdbc.host}")
        private String jdbcHostName;
     }
}

người ta có thể đặt phiên bản mặc định của jdbc.properies trong ứng dụng. Các phiên bản bên ngoài có thể được đặt nằm ở đây.

java -jar target/myapp.jar --spring.config.location=classpath:file:///C:/Apps/springtest/jdbc.properties,classpath:file:///C:/Apps/springtest/jdbc-dev.properties

Dựa trên giá trị cấu hình được đặt bằng thuộc tính spring.profiles.active, giá trị của jdbc.host sẽ được chọn. Vì vậy, khi (trên windows)

set spring.profiles.active=dev

jdbc.host sẽ lấy giá trị từ jdbc-dev.properies.

cho

set spring.profiles.active=default

jdbc.host sẽ lấy giá trị từ jdbc.properies.

27 hữu ích 1 bình luận chia sẻ
20

Hãy nhìn vào PropertyPlaceholderConfigker, tôi thấy việc sử dụng rõ ràng hơn chú thích.

ví dụ

@Configuration
public class PropertiesConfiguration {


    @Bean
    public PropertyPlaceholderConfigurer properties() {
        final PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
//        ppc.setIgnoreUnresolvablePlaceholders(true);
        ppc.setIgnoreResourceNotFound(true);

        final List<Resource> resourceLst = new ArrayList<Resource>();

        resourceLst.add(new ClassPathResource("myapp_base.properties"));
        resourceLst.add(new FileSystemResource("/etc/myapp/overriding.propertie"));
        resourceLst.add(new ClassPathResource("myapp_test.properties"));
        resourceLst.add(new ClassPathResource("myapp_developer_overrides.properties")); // for Developer debugging.

        ppc.setLocations(resourceLst.toArray(new Resource[]{}));

        return ppc;
    }
20 hữu ích 1 bình luận chia sẻ
11

Spring boot 1.X và Spring Boot 2.X không cung cấp các tùy chọn và hành vi tương tự về Externalized Configuration.

Câu trả lời rất hay của M. Deinum đề cập đến các đặc điểm của Spring Boot 1.
Tôi sẽ cập nhật cho Spring Boot 2 tại đây.

Nguồn và tính chất môi trường

Spring Boot 2 sử dụng một PropertySourcethứ tự rất đặc biệt được thiết kế để cho phép ghi đè các giá trị hợp lý. Các thuộc tính được xem xét theo thứ tự sau:

  • Thuộc tính cài đặt toàn cầu của Devtools trên thư mục chính của bạn (~ / .spring-boot-devtools.properies khi devtools đang hoạt động).

  • @TestPropertySource chú thích trong bài kiểm tra của bạn.

  • @SpringBootTest#propertiesthuộc tính chú thích trong bài kiểm tra của bạn. Đối số dòng lệnh.

  • Thuộc tính từ SPRING_APPLICATION_JSON(JSON nội tuyến được nhúng trong một biến môi trường hoặc thuộc tính hệ thống).

  • ServletConfig tham số init.

  • ServletContext tham số init.

  • Thuộc tính JNDI từ java:comp/env.

  • Thuộc tính hệ thống Java ( System.getProperties()).

  • Biến môi trường hệ điều hành.

  • A RandomValuePropertySourcechỉ có các thuộc tính ngẫu nhiên. *.

  • Thuộc tính ứng dụng dành riêng cho hồ sơ bên ngoài bình đóng gói của bạn ( application-{profile}.propertiesvà các biến thể YAML).

  • Thuộc tính ứng dụng dành riêng cho hồ sơ được đóng gói bên trong bình của bạn ( application-{profile}.propertiesvà các biến thể YAML).

  • Các thuộc tính ứng dụng bên ngoài bình đóng gói của bạn ( application.propertiesvà các biến thể YAML).

  • Các thuộc tính ứng dụng được đóng gói bên trong bình của bạn ( application.propertiesvà các biến thể YAML).

  • @PropertySourcechú thích trên các @Configurationlớp học của bạn . Thuộc tính mặc định (được chỉ định bởi cài đặt SpringApplication.setDefaultProperties).

Để chỉ định các tệp thuộc tính bên ngoài, các tùy chọn này sẽ khiến bạn quan tâm:

  • Thuộc tính ứng dụng dành riêng cho hồ sơ bên ngoài bình đóng gói của bạn ( application-{profile}.propertiesvà các biến thể YAML).

  • Các thuộc tính ứng dụng bên ngoài bình đóng gói của bạn ( application.propertiesvà các biến thể YAML).

  • @PropertySourcechú thích trên các @Configurationlớp học của bạn . Thuộc tính mặc định (được chỉ định bởi cài đặt SpringApplication.setDefaultProperties).

Bạn chỉ có thể sử dụng một trong 3 tùy chọn này hoặc kết hợp chúng theo yêu cầu của bạn.
Ví dụ: đối với các trường hợp rất đơn giản, chỉ sử dụng các thuộc tính dành riêng cho cấu hình là đủ nhưng trong các trường hợp khác, bạn có thể muốn sử dụng cả thuộc tính dành riêng cho cấu hình, thuộc tính mặc định và @PropertySource.

Vị trí mặc định cho các tệp application.properIES

Về application.propertiescác tệp (và biến thể), theo mặc định, Spring tải chúng và thêm các thuộc tính của chúng trong môi trường từ các tệp này theo thứ tự sau:

  • Thư mục con / config của thư mục hiện tại

  • Thư mục hiện tại

  • Gói classpath / config

  • Các rootpath gốc

Các ưu tiên cao hơn theo nghĩa đen là :
classpath:/,classpath:/config/,file:./,file:./config/.

Làm thế nào để sử dụng tập tin thuộc tính với tên cụ thể?

Các vị trí mặc định không phải lúc nào cũng đủ: các vị trí mặc định như tên tệp mặc định ( application.properties) có thể không phù hợp. Ngoài ra, như trong câu hỏi OP, bạn có thể cần chỉ định nhiều tệp cấu hình khác với application.properties(và biến thể).
Như vậy spring.config.namesẽ không đủ.

Trong trường hợp này, bạn nên cung cấp một vị trí rõ ràng bằng cách sử dụng thuộc tính spring.config.locationmôi trường (là danh sách các vị trí thư mục hoặc đường dẫn tệp được phân tách bằng dấu phẩy).
Để được miễn phí về mẫu tên tệp, hãy ưu tiên danh sách các đường dẫn tệp qua danh sách các thư mục.
Ví dụ làm như thế:

java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties

Đó là cách dài dòng nhất chỉ xác định thư mục nhưng nó cũng là cách để xác định rất rõ các tệp cấu hình của chúng tôi và ghi lại rõ ràng các thuộc tính được sử dụng một cách hiệu quả.

spring.config.location hiện thay thế các vị trí mặc định thay vì thêm vào chúng

Với Spring Boot 1, spring.config.locationđối số sẽ thêm các vị trí được chỉ định trong môi trường Spring.
Nhưng từ Spring Boot 2, spring.config.locationthay thế các vị trí mặc định được Spring sử dụng bởi các vị trí đã chỉ định trong môi trường Spring như được nêu trong tài liệu .

Khi các vị trí cấu hình tùy chỉnh được cấu hình bằng cách sử dụng spring.config.location, chúng sẽ thay thế các vị trí mặc định. Ví dụ: nếu spring.config.locationđược định cấu hình với giá trị classpath:/custom-config/, file:./custom-config/thứ tự tìm kiếm sẽ trở thành như sau:

  1. file:./custom-config/

  2. classpath:custom-config/

spring.config.locationbây giờ là một cách để đảm bảo rằng bất kỳ application.propertiestệp nào phải được chỉ định rõ ràng.
Đối với các JAR uber không được yêu cầu đóng gói application.propertiescác tệp, điều đó khá hay.

Để giữ hành vi cũ spring.config.locationtrong khi sử dụng Spring Boot 2, bạn có thể sử dụng thuộc tính mới spring.config.additional-locationthay vì spring.config.locationvẫn thêm các vị trí như được nêu trong tài liệu :

Ngoài ra, khi các vị trí cấu hình tùy chỉnh được cấu hình bằng cách sử dụng spring.config.additional-location, chúng được sử dụng ngoài các vị trí mặc định.


Trong thực tế

Vì vậy, giả sử như trong câu hỏi OP, bạn có 2 tệp thuộc tính bên ngoài để chỉ định và 1 tệp thuộc tính được bao gồm trong tệp uber.

Để chỉ sử dụng các tệp cấu hình bạn đã chỉ định:

-Dspring.config.location=classpath:/job1.properties,classpath:/job2.properties,classpath:/applications.properties   

Để thêm các tệp cấu hình vào các vị trí này trong các vị trí mặc định:

-Dspring.config.additional-location=classpath:/job1.properties,classpath:/job2.properties

classpath:/applications.properties là trong ví dụ cuối cùng không bắt buộc vì các vị trí mặc định có vị trí đó và các vị trí mặc định ở đây không bị ghi đè mà được mở rộng.

11 hữu ích 0 bình luận chia sẻ
6

Tôi đã từng gặp vấn đề tương tự. Tôi muốn có khả năng ghi đè lên tệp cấu hình bên trong khi khởi động bằng tệp bên ngoài, tương tự như phát hiện ứng dụng Spring Boot.properations. Trong trường hợp của tôi, đó là tệp user.properations nơi người dùng ứng dụng của tôi được lưu trữ.

Yêu cầu của tôi:

Tải tệp từ các vị trí sau (theo thứ tự này)

  1. Lớp học
  2. Thư mục con / config của thư mục hiện tại.
  3. Thư mục hiện tại
  4. Từ thư mục hoặc vị trí tệp được cung cấp bởi tham số dòng lệnh khi khởi động

Tôi đã đưa ra giải pháp sau đây:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.PathResource;
import org.springframework.core.io.Resource;

import java.io.IOException;
import java.util.Properties;

import static java.util.Arrays.stream;

@Configuration
public class PropertiesConfig {

    private static final Logger LOG = LoggerFactory.getLogger(PropertiesConfig.class);

    private final static String PROPERTIES_FILENAME = "user.properties";

    @Value("${properties.location:}")
    private String propertiesLocation;

    @Bean
    Properties userProperties() throws IOException {
        final Resource[] possiblePropertiesResources = {
                new ClassPathResource(PROPERTIES_FILENAME),
                new PathResource("config/" + PROPERTIES_FILENAME),
                new PathResource(PROPERTIES_FILENAME),
                new PathResource(getCustomPath())
        };
        // Find the last existing properties location to emulate spring boot application.properties discovery
        final Resource propertiesResource = stream(possiblePropertiesResources)
                .filter(Resource::exists)
                .reduce((previous, current) -> current)
                .get();
        final Properties userProperties = new Properties();

        userProperties.load(propertiesResource.getInputStream());

        LOG.info("Using {} as user resource", propertiesResource);

        return userProperties;
    }

    private String getCustomPath() {
        return propertiesLocation.endsWith(".properties") ? propertiesLocation : propertiesLocation + PROPERTIES_FILENAME;
    }

}

Bây giờ ứng dụng sử dụng tài nguyên đường dẫn lớp, nhưng cũng kiểm tra tài nguyên tại các vị trí đã cho khác. Tài nguyên cuối cùng tồn tại sẽ được chọn và sử dụng. Tôi có thể khởi động ứng dụng của mình với java -jar myapp.jar --properIES.location = / thư mục / myproperIES.properies để sử dụng vị trí thuộc tính nổi trên thuyền của tôi.

Một chi tiết quan trọng ở đây: Sử dụng một chuỗi rỗng làm giá trị mặc định cho các thuộc tính.location trong chú thích @Value để tránh lỗi khi thuộc tính không được đặt.

Quy ước cho một thuộc tính.location là: Sử dụng một thư mục hoặc một đường dẫn đến một tệp thuộc tính như property.location.

Nếu bạn muốn ghi đè chỉ các thuộc tính cụ thể, một PropertiesFactoryBean với setIgnoreResourceNotFound (true) có thể được sử dụng với mảng tài nguyên được đặt làm vị trí.

Tôi chắc chắn rằng giải pháp này có thể được mở rộng để xử lý nhiều tệp ...

CHỈNH SỬA

Đây là giải pháp của tôi cho nhiều tệp :) Giống như trước đây, điều này có thể được kết hợp với PropertiesFactoryBean.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.PathResource;
import org.springframework.core.io.Resource;

import java.io.IOException;
import java.util.Map;
import java.util.Properties;

import static java.util.Arrays.stream;
import static java.util.stream.Collectors.toMap;

@Configuration
class PropertiesConfig {

    private final static Logger LOG = LoggerFactory.getLogger(PropertiesConfig.class);
    private final static String[] PROPERTIES_FILENAMES = {"job1.properties", "job2.properties", "job3.properties"};

    @Value("${properties.location:}")
    private String propertiesLocation;

    @Bean
    Map<String, Properties> myProperties() {
        return stream(PROPERTIES_FILENAMES)
                .collect(toMap(filename -> filename, this::loadProperties));
    }

    private Properties loadProperties(final String filename) {
        final Resource[] possiblePropertiesResources = {
                new ClassPathResource(filename),
                new PathResource("config/" + filename),
                new PathResource(filename),
                new PathResource(getCustomPath(filename))
        };
        final Resource resource = stream(possiblePropertiesResources)
                .filter(Resource::exists)
                .reduce((previous, current) -> current)
                .get();
        final Properties properties = new Properties();

        try {
            properties.load(resource.getInputStream());
        } catch(final IOException exception) {
            throw new RuntimeException(exception);
        }

        LOG.info("Using {} as user resource", resource);

        return properties;
    }

    private String getCustomPath(final String filename) {
        return propertiesLocation.endsWith(".properties") ? propertiesLocation : propertiesLocation + filename;
    }

}
6 hữu ích 2 bình luận chia sẻ
6

Đây là một cách tiếp cận đơn giản bằng cách sử dụng boot mùa xuân

TestClass.java

@Configuration
@Profile("one")
@PropertySource("file:/{selected location}/app.properties")
public class TestClass {

    @Autowired
    Environment env;

    @Bean
    public boolean test() {
        System.out.println(env.getProperty("test.one"));
        return true;
    }
}

các app.properties bối cảnh này, trong vị trí đã chọn

test.one = 1234

ứng dụng khởi động mùa xuân của bạn

@SpringBootApplication

public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(testApplication.class, args);
    }
}

bối cảnh application.properations được xác định trước

spring.profiles.active = one

bạn có thể viết bao nhiêu lớp cấu hình tùy thích và bật / tắt chúng chỉ bằng cách đặt spring.profiles.active = tên / tên hồ sơ {cách nhau bằng dấu phẩy}

như bạn có thể thấy boot mùa xuân thật tuyệt, đôi khi chỉ cần làm quen, điều đáng nói là bạn cũng có thể sử dụng @Value trên các lĩnh vực của mình

@Value("${test.one}")
String str;
6 hữu ích 0 bình luận chia sẻ
6

spring boot cho phép chúng ta viết các hồ sơ khác nhau để viết cho các môi trường khác nhau, ví dụ: chúng ta có thể có các tệp thuộc tính riêng cho sản xuất, qa và môi trường cục bộ

tập tin application-local.properIES với cấu hình theo máy cục bộ của tôi là

spring.profiles.active=local

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=users
spring.data.mongodb.username=humble_freak
spring.data.mongodb.password=freakone

spring.rabbitmq.host=localhost
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.port=5672

rabbitmq.publish=true

Tương tự, chúng ta có thể viết application-prod.properies và application-qa.properies như nhiều tệp thuộc tính mà chúng ta muốn

sau đó viết một số tập lệnh để khởi động ứng dụng cho các môi trường khác nhau, ví dụ:

mvn spring-boot:run -Drun.profiles=local
mvn spring-boot:run -Drun.profiles=qa
mvn spring-boot:run -Drun.profiles=prod
6 hữu ích 0 bình luận chia sẻ
5

Tôi vừa gặp một vấn đề tương tự như vậy và cuối cùng đã tìm ra nguyên nhân: tệp application.properations có quyền sở hữu và thuộc tính rwx sai. Vì vậy, khi tomcat khởi động tệp application.properIES ở đúng vị trí, nhưng thuộc sở hữu của người dùng khác:

$ chmod 766 application.properties

$ chown tomcat application.properties
5 hữu ích 1 bình luận chia sẻ
0

Tôi đã thấy đây là một mẫu hữu ích để làm theo:

@RunWith(SpringRunner)
@SpringBootTest(classes = [ TestConfiguration, MyApplication ],
        properties = [
                "spring.config.name=application-MyTest_LowerImportance,application-MyTest_MostImportant"
                ,"debug=true", "trace=true"
        ]
)

Ở đây, chúng tôi ghi đè việc sử dụng "application.yml" để sử dụng "application-MyTest_LowerImportance.yml" và cả "application-MyTest_MostImportant.yml"
(Spring cũng sẽ tìm các tệp .properations)

Cũng bao gồm như một phần thưởng bổ sung là các cài đặt gỡ lỗi và theo dõi, trên một dòng riêng biệt để bạn có thể nhận xét chúng nếu cần;]

Gỡ lỗi / theo dõi rất hữu ích vì Spring sẽ kết xuất tên của tất cả các tệp mà nó tải và những tệp mà nó cố tải.
Bạn sẽ thấy các dòng như thế này trong bảng điều khiển trong thời gian chạy:

TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'file:./config/application-MyTest_MostImportant.properties' (file:./config/application-MyTest_MostImportant.properties) resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'file:./config/application-MyTest_MostImportant.xml' (file:./config/application-MyTest_MostImportant.xml) resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'file:./config/application-MyTest_MostImportant.yml' (file:./config/application-MyTest_MostImportant.yml) resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'file:./config/application-MyTest_MostImportant.yaml' (file:./config/application-MyTest_MostImportant.yaml) resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'file:./config/application-MyTest_LowerImportance.properties' (file:./config/application-MyTest_LowerImportance.properties) resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'file:./config/application-MyTest_LowerImportance.xml' (file:./config/application-MyTest_LowerImportance.xml) resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'file:./config/application-MyTest_LowerImportance.yml' (file:./config/application-MyTest_LowerImportance.yml) resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'file:./config/application-MyTest_LowerImportance.yaml' (file:./config/application-MyTest_LowerImportance.yaml) resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'file:./application-MyTest_MostImportant.properties' (file:./application-MyTest_MostImportant.properties) resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'file:./application-MyTest_MostImportant.xml' (file:./application-MyTest_MostImportant.xml) resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'file:./application-MyTest_MostImportant.yml' (file:./application-MyTest_MostImportant.yml) resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'file:./application-MyTest_MostImportant.yaml' (file:./application-MyTest_MostImportant.yaml) resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'file:./application-MyTest_LowerImportance.properties' (file:./application-MyTest_LowerImportance.properties) resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'file:./application-MyTest_LowerImportance.xml' (file:./application-MyTest_LowerImportance.xml) resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'file:./application-MyTest_LowerImportance.yml' (file:./application-MyTest_LowerImportance.yml) resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'file:./application-MyTest_LowerImportance.yaml' (file:./application-MyTest_LowerImportance.yaml) resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'classpath:/config/application-MyTest_MostImportant.properties' resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'classpath:/config/application-MyTest_MostImportant.xml' resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'classpath:/config/application-MyTest_MostImportant.yml' resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'classpath:/config/application-MyTest_MostImportant.yaml' resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'classpath:/config/application-MyTest_LowerImportance.properties' resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'classpath:/config/application-MyTest_LowerImportance.xml' resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'classpath:/config/application-MyTest_LowerImportance.yml' resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'classpath:/config/application-MyTest_LowerImportance.yaml' resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'classpath:/application-MyTest_MostImportant.properties' resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'classpath:/application-MyTest_MostImportant.xml' resource not found
DEBUG 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Loaded config file 'file:/Users/xxx/dev/myproject/target/test-classes/application-MyTest_MostImportant.yml' (classpath:/application-MyTest_MostImportant.yml)
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'classpath:/application-MyTest_MostImportant.yaml' resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'classpath:/application-MyTest_LowerImportance.properties' resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'classpath:/application-MyTest_LowerImportance.xml' resource not found
DEBUG 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Loaded config file 'file:/Users/xxx/dev/myproject/target/test-classes/application-MyTest_LowerImportance.yml' (classpath:/application-MyTest_LowerImportance.yml)
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'classpath:/application-MyTest_LowerImportance.yaml' resource not found
TRACE 93941 --- [   main] o.s.b.c.c.ConfigFileApplicationListener  : Skipped config file 'file:./config/application-MyTest_MostImportant-test.properties' (file:./config/application-MyTest_MostImportant-test.properties) resource not found
0 hữu ích 0 bình luận chia sẻ
0

Một phiên bản sửa đổi của giải pháp @mxsb cho phép chúng tôi xác định nhiều tệp và trong trường hợp của tôi đây là các tệp yml.

Trong ứng dụng của tôi - dev.yml, tôi đã thêm cấu hình này cho phép tôi tiêm tất cả các yml có -dev.yml trong đó. Đây có thể là một danh sách các tập tin cụ thể cũng có. "classpath: /test/test.yml, classpath: /test2/test.yml"

application:
  properties:
    locations: "classpath*:/**/*-dev.yml"

Điều này giúp để có được một bản đồ tài sản.

@Configuration

public class PropertiesConfig {

private final static Logger LOG = LoggerFactory.getLogger(PropertiesConfig.class);

@Value("${application.properties.locations}")
private String[] locations;

@Autowired
private ResourceLoader rl;

@Bean
Map<String, Properties> myProperties() {
    return stream(locations)
            .collect(toMap(filename -> filename, this::loadProperties));
}

private Properties loadProperties(final String filename) {

    YamlPropertySourceLoader loader = new YamlPropertySourceLoader();
    try {
        final Resource[] possiblePropertiesResources = ResourcePatternUtils.getResourcePatternResolver(rl).getResources(filename);
        final Properties properties = new Properties();
        stream(possiblePropertiesResources)
                .filter(Resource::exists)
                .map(resource1 -> {
                    try {
                        return loader.load(resource1.getFilename(), resource1);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }).flatMap(l -> l.stream())
                .forEach(propertySource -> {
                    Map source = ((MapPropertySource) propertySource).getSource();
                    properties.putAll(source);
                });

        return properties;
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}
}

Tuy nhiên, nếu như trong trường hợp của tôi, tôi muốn phải chia các tệp yml cho mỗi cấu hình và tải chúng và tiêm trực tiếp vào cấu hình mùa xuân trước khi khởi tạo đậu.

config
    - application.yml
    - application-dev.yml
    - application-prod.yml
management
    - management-dev.yml
    - management-prod.yml

... bạn hiểu ý

Thành phần hơi khác

@Component
public class PropertiesConfigurer extends     PropertySourcesPlaceholderConfigurer
    implements EnvironmentAware, InitializingBean {

private final static Logger LOG = LoggerFactory.getLogger(PropertiesConfigurer.class);

private String[] locations;

@Autowired
private ResourceLoader rl;
private Environment environment;

@Override
public void setEnvironment(Environment environment) {
    // save off Environment for later use
    this.environment = environment;
    super.setEnvironment(environment);
}

@Override
public void afterPropertiesSet() throws Exception {
    // Copy property sources to Environment
    MutablePropertySources envPropSources = ((ConfigurableEnvironment) environment).getPropertySources();
    envPropSources.forEach(propertySource -> {
        if (propertySource.containsProperty("application.properties.locations")) {
            locations = ((String) propertySource.getProperty("application.properties.locations")).split(",");
            stream(locations).forEach(filename -> loadProperties(filename).forEach(source ->{
                envPropSources.addFirst(source);
            }));
        }
    });
}


private List<PropertySource> loadProperties(final String filename) {
    YamlPropertySourceLoader loader = new YamlPropertySourceLoader();
    try {
        final Resource[] possiblePropertiesResources = ResourcePatternUtils.getResourcePatternResolver(rl).getResources(filename);
        final Properties properties = new Properties();
        return stream(possiblePropertiesResources)
                .filter(Resource::exists)
                .map(resource1 -> {
                    try {
                        return loader.load(resource1.getFilename(), resource1);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }).flatMap(l -> l.stream())
                .collect(Collectors.toList());
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

}

0 hữu ích 0 bình luận chia sẻ
0

Nếu bạn muốn ghi đè các giá trị được chỉ định trong tệp application.properIES, bạn có thể thay đổi hồ sơ hoạt động của mình trong khi bạn chạy ứng dụng của mình và tạo tệp thuộc tính ứng dụng cho hồ sơ. Vì vậy, ví dụ: hãy chỉ định "ghi đè" hồ sơ hoạt động và sau đó, giả sử bạn đã tạo tệp thuộc tính ứng dụng mới của mình được gọi là "application-override.properies" trong / tmp, sau đó bạn có thể chạy

java -jar yourApp.jar --spring.profiles.active="override" --spring.config.location="file:/tmp/,classpath:/" 

Các giá trị được đặc biệt hóa theo spring.config.location được đánh giá theo thứ tự ngược lại. Vì vậy, trong ví dụ của tôi, classpat được đánh giá đầu tiên, sau đó là giá trị tệp.

Nếu tệp jar và tệp "application-override.properIES" nằm trong thư mục hiện tại, bạn thực sự có thể sử dụng một cách đơn giản

java -jar yourApp.jar --spring.profiles.active="override"

vì Spring Boot sẽ tìm tệp thuộc tính cho bạn

0 hữu ích 2 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ java spring config spring-boot , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading