programing

속성 파일의 Spring boot 외부 구성

magicmemo 2023. 6. 25. 18:38
반응형

속성 파일의 Spring boot 외부 구성

다른 환경에 배포하려는 전쟁 시 패키지로 사용할 수 있는 스프링 부트 애플리케이션이 있습니다.이 배포를 자동화하려면 구성 파일을 외부로 보다 쉽게 이동할 수 있습니다.

현재 src/main/resources에 있는 application.properties 파일에서 모든 것이 정상적으로 작동합니다.그런 다음 'mvn install'을 사용하여 Tomcat에 배치할 수 있는 전쟁을 만듭니다.하지만 저는 mvn 설치에 존재할 필요는 없지만 전쟁을 전개하는 동안 읽혀질 수 있는 .yml 파일을 사용하고 싶습니다.

외부화된 구성은 스프링 부트가 파일을 찾는 위치를 보여주고 72.3 응용 프로그램의 외부 속성 위치 변경은 이를 구성하는 방법에 대한 자세한 내용을 제공하지만 이를 내 코드로 변환하는 방법을 이해하지 못합니다.

제 애플리케이션 클래스는 다음과 같습니다: package be.ugent.lca;

Updated below

이 파일에 @PropertySource를 추가해야 합니까?특정 상대 경로를 어떻게 지칭합니까?

아마도 대부분의 봄 부츠 설명서에 기록되어 있는 것처럼 느껴지지만, 어떻게 해야 하는지 이해할 수 없습니다.

편집

이것이 별개의 문제인지는 잘 모르겠지만, 저는 여전히 관련이 있다고 생각합니다.
때 not os는 yaml 파일을 찾을 수 없습니다.하지만 application .properties 또는 .yml 파일이 없을 때와 같은 오류가 다시 발생합니다.이제 애플리케이션은 다음과 같습니다.

@Configuration
**@PropertySource("file:${application_home}/application.yml")**
@ComponentScan({"be.ugent.lca","be.ugent.sherpa.configuration"})
@EnableAutoConfiguration
@EnableSpringDataWebSupport
public class Application extends SpringBootServletInitializer{
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);

    }

application_home OS 변수

$ echo $application_home  
C:\Masterproef\clones\la15-lca-web\rest-service\target

my application.yml 파일(불만 부분):

sherpa:
  package:
    base: be.ugent.lca

java -jar *.war 오류 모든 변형:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'sherpa.package.base' in string value "${sherpa.package.base}"
    at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174)
    at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126)
    at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:204)
    at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:178)
    at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:172)
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:808)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1027)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545)
    ... 142 more

외부 속성 파일 사용

답은 스프링 부트 문서에 있습니다. 제가 설명해 드리겠습니다.

요, , 사면안됩다를 하면 안 .@PropertySource여기 Yaml 단점 아래에 언급된 것처럼 Yaml 구성으로 작업할 때:

@PropertySource 주석을 통해 YAML 파일을 로드할 수 없습니다.따라서 이러한 방식으로 값을 로드해야 하는 경우에는 속성 파일을 사용해야 합니다.

그러면 속성 파일을 로드하는 방법은 무엇입니까?응용 프로그램 속성 파일에 대해 설명합니다.

하나는 다음과 같이 로드됩니다.application.yml위의 링크에서 언급한 것처럼 디렉토리 중 하나에 배치합니다.이것은 일반적인 구성에 적합합니다.

외부 속성 파일을 사용하려는 환경별 구성(및 암호 등)에 대해서도 설명합니다.

application.properties를 구성 파일 이름으로 사용하지 않으려면 spring.config.name 환경 속성을 지정하여 다른 이름으로 전환할 수 있습니다.spring.config.location 환경 속성(쉼표로 구분된 디렉토리 위치 또는 파일 경로 목록)을 사용하여 명시적 위치를 참조할 수도 있습니다.

그래서 당신은 그것을 사용합니다.spring.config.location환경 재산외부 구성 파일이 있다고 가정합니다.application-external.yml에 다음과.-Dspring.config.location=file:${home}/conf/application-external.ymlJVM의 시작 매개 변수로 사용할 수 있습니다.파일이 여러 개인 경우 쉼표로 구분합니다.이와 같은 외부 속성을 사용하여 속성을 추가할 뿐만 아니라 속성을 쉽게 덮어쓸 수 있습니다.

저는 당신의 애플리케이션을 당신의 내부 application.yml 파일로만 작동하게 한 다음, 당신의 외부 속성 파일에서 (테스트) 속성을 덮어쓰고 그 값을 어딘가에 기록하는 것으로 이것을 테스트하는 것을 조언하고 싶습니다.

객체에 Yaml 속성 바인딩

때 Yaml 속성과 함께 합니다.@ConfigurationProperties예를 들어 목록이나 더 복잡한 속성 구조를 사용할 때 유용합니다.(따라서 Yaml 속성을 사용해야 합니다. 간단한 속성의 경우 일반 속성 파일을 사용하는 것이 더 나을 수 있습니다.자세한 내용은 다음을 참조하십시오.유형 안전 구성 속성

추가: IntelliJ, Maven 및 JUNit 테스트에서 이러한 속성 로드

때때로 이러한 특성을 메이븐 빌드에 로드하거나 테스트를 수행할 때 로드할 수 있습니다.또는 IDE를 사용한 지역 개발용으로만 사용할 수 있습니다.

개발에 IntelliJ를 사용하는 경우 Tomcat Run Configuration: "Run" -> "Edit Configurations"에 IntelliJ를 추가하여 쉽게 추가할 수 있습니다. "Tomcat Server"에서 실행 구성을 선택한 후 Server 탭을 확인하고 "VM Options" 아래에 추가합니다.

Maven 빌드에서 외부 구성 파일을 사용하려면: pom.xml에서 maven surefire 플러그인을 다음과 같이 구성합니다.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
     <argLine>-Dspring.config.location=file:${home}/conf/application-external.yml</argLine>
   </configuration>
</plugin>    

IntelliJ에서 JUNit 테스트를 실행하는 경우:

  • 실행 → 구성 편집
  • 기본값 → JUNit
  • VM 옵션 추가 ->-ea -Dspring.config.location=file:${home}/conf/application-external.yml

예, 사용해야 합니다.@PropertySource아래와 같이

여기서 중요한 점은 OS 환경 변수 또는 시스템 속성으로 속성을 제공(또는 다른 이름을 선택)하거나 Spring boot을 시작하는 동안 명령줄 인수로 전달할 수 있다는 것입니다.이 속성은 구성 파일의 위치를 알려줍니다..properties또는.yaml)가 정확하게 위치합니다(예:/usr/local/my_project/등)

@Configuration
@PropertySource("file:${application_home}config.properties")//or specify yaml file
@ComponentScan({"be.ugent.lca","be.ugent.sherpa.configuration"})
@EnableAutoConfiguration
@EnableSpringDataWebSupport
public class Application extends SpringBootServletInitializer{
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

이를 달성하기 위한 아주 간단한 방법이 있습니다.

원래 application.properties 파일 내에서 다음 행을 지정할 수 있습니다.

spring.config.import=파일:디렉터리_수신인__File/Property_Name.properties

그러면 외부 속성 파일의 모든 속성이 자동으로 동기화됩니다.

이제 여러 속성 파일에서 속성을 가져와야 하는 상황이 발생했다고 가정해 보겠습니다.이 경우 외부 속성 파일에서 동일한 행을 언급하면 두 번째 속성 파일에서 나머지 속성을 가져오는 등의 작업을 수행할 수 있습니다.

다음 예를 생각해 보십시오.

application.properties:

spring.config.import=파일:리소스/사용자 정의1.속성

사용자 지정 1.속성:

server.port=8090
.
.
.
spring.config.import=file:Resources/Custom2.properties

시스템 환경 변수를 사용하여 외부화된 속성 파일을 사용하는 가장 쉬운 방법 중 하나는 application.properties 파일에서 다음 구문을 사용할 수 있습니다.

spring.datasource.url = ${OPENSHIFT_MYSQL_DB_HOST}:${OPENSHIFT_MYSQL_DB_PORT}/"nameofDB"
spring.datasource.username = ${OPENSHIFT_MYSQL_DB_USERNAME}
spring.datasource.password = ${OPENSHIFT_MYSQL_DB_PORT}

이제 위의 사용된 환경 변수를 선언합니다.

export OPENSHIFT_MYSQL_DB_HOST="jdbc:mysql://localhost"
export OPENSHIFT_MYSQL_DB_PORT="3306"
export OPENSHIFT_MYSQL_DB_USERNAME="root"
export OPENSHIFT_MYSQL_DB_PASSWORD="123asd" 

이렇게 하면 다른 환경에서 동일한 변수에 대해 다른 값을 사용할 수 있습니다.

부트 클래스에서 다음 코드를 사용합니다.

@PropertySource({"classpath:omnicell-health.properties"})

컨트롤러에서 아래 코드를 사용합니다.

@Autowired
    private Environment env;

언급URL : https://stackoverflow.com/questions/43020491/spring-boot-external-configuration-of-property-file

반응형