programing

봄에 application.properties에서 상대 경로 지정

firstcheck 2023. 6. 22. 23:27
반응형

봄에 application.properties에서 상대 경로 지정

아래 지정된 대로 Spring boot application의 application.properties 파일에서 상대 경로를 사용하여 파일 리소스를 조회할 수 있는 방법이 있습니까?

spring.datasource.url=jdbc:hsqldb:file:${project.basedir}/db/init

Spring boot을 사용하여 업로드 샘플을 빌드하고 있는데 동일한 문제가 발생하면 프로젝트 루트 경로만 가져오려고 합니다. (예: /sring-boot-upload)

아래 코드가 작동한다는 것을 알게 되었습니다.

upload.dir.location=${user.dir}\\uploadFolder

@membersound 답변은 하드코드된 경로를 두 부분으로 나누는 것일 뿐 속성을 동적으로 해결하는 것은 아닙니다.당신이 원하는 것을 달성하는 방법을 알려줄 수 있지만, 당신은 이해해야 합니다. project.basedir응용프로그램을 병 또는 전쟁으로 실행할 때.로컬 작업 영역 외부에 소스 코드 구조가 없습니다.

만약 당신이 여전히 테스트를 위해 이것을 하고 싶다면, 그것은 실현 가능하며 당신이 필요로 하는 것은 조작하는 것입니다.PropertySource가장 간단한 옵션은 다음과 같습니다.

정의ApplicationContextInitializer그리고 거기에 재산을 설정합니다.다음과 같은 것이 있습니다.

    public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    @Override
    public void initialize(ConfigurableApplicationContext appCtx) {
        try {
            // should be /<path-to-projectBasedir>/build/classes/main/
            File pwd = new File(getClass().getResource("/").toURI());
            String projectDir = pwd.getParentFile().getParentFile().getParent();
            String conf = new File(projectDir, "db/init").getAbsolutePath();
            Map<String, Object> props = new HashMap<>();
            props.put("spring.datasource.url", conf);
            MapPropertySource mapPropertySource = new MapPropertySource("db-props", props);
            appCtx.getEnvironment().getPropertySources().addFirst(mapPropertySource);
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }}

부팅을 사용 중인 것 같으니 그냥 선언하면 됩니다.context.initializer.classes=com.example.MyApplicationContextInitializer당신의application.properties부팅은 시작할 때 이 클래스를 실행합니다.

다시 한 번 주의할 사항:

  1. 소스 코드 구조에 따라 다르므로 로컬 작업 공간 외부에서는 작동하지 않습니다.

  2. 저는 여기서 Gradle 프로젝트 구조를 가정했습니다./build/classes/main필요한 경우 빌드 도구에 따라 조정합니다.

  3. 한다면MyApplicationContextInitializer에 있습니다.src/test/java,pwd될 것이다<projectBasedir>/build/classes/test/,것은 아니다.<projectBasedir>/build/classes/main/.

your.basedir=${project.basedir}/db/init
spring.datasource.url=jdbc:hsqldb:file:${your.basedir}

@Value("${your.basedir}")
private String file;

new ClassPathResource(file).getURI().toString()

언급URL : https://stackoverflow.com/questions/36940458/specifying-relative-path-in-application-properties-in-spring

반응형