programing

maven 프로젝트를 가져올 수 없습니다.Spring 응용 프로그램의 버전 속성(@Value)

instargram 2023. 3. 13. 20:08
반응형

maven 프로젝트를 가져올 수 없습니다.Spring 응용 프로그램의 버전 속성(@Value)

메이븐 프로젝트를 얻는 방법@Value 주석이 있는 Spring Boot 어플리케이션의 버전 속성

SpringBoot 어플리케이션에서 Maven 프로젝트 버전을 얻는 방법에 대한 몇 가지 조사와 시험 결과 나에게 맞는 것을 찾을 수 없었습니다.

매니페스토를 사용하는 것은 클래스 로더의 문제로 인해 확실히 잘못된 경로입니다.즉, 스프링이 최초로 발견한 매니페스토를 얻을 수 있습니다.이것은 제 어플리케이션이 아닙니다.

제가 찾은 해결책 중 하나는 maven resources 플러그인을 사용하여 리소스 파일의 속성을 "필터링"(바꾸기)하는 것입니다.이 경우 스프링은application.properties.

이 작업을 수행하기 위한 단계는 다음과 같습니다.

pom 파일에서 다음 정의를 사용하여 리소스 필터링을 활성화합니다.

<resources>
    <resource>
        <filtering>true</filtering>
        <directory>src/main/resources</directory>
        <includes>
            <include>application.properties</include>
        </includes>
    </resource>
</resources>

에서application.properties파일:

application.name=@project.artifactId@
build.version=@project.version@
build.timestamp=@timestamp@

${property} 대신 @property@가 표시됩니다.에서application.properties파일.

spring-boot-starter-parent기준을 재정의하다${}로 구분하다.@:

<resource.delimiter>@</resource.delimiter>
<!-- delimiter that doesn't clash with Spring ${} placeholders -->
<delimiters>
    <delimiter>${resource.delimiter}</delimiter>
</delimiters>

그런 다음 봄철에 이러한 특성에 액세스할 수 있습니다.@Value다음과 같습니다.

@Value("${application.name}")
private String applicationName;

@Value("${build.version}")
private String buildVersion;

@Value("${build.timestamp}")
private String buildTimestamp;

샘플 프로젝트는 이쪽에서 이용하실 수 있습니다.

Spring Boot 응용 프로그램에서 Maven 속성에 액세스하려면 구분 기호로 매핑하기만 하면 됩니다.@에서application.properties다음과 같습니다.

app.version=@project.version@
app.name=@project.name@

그런 다음 앱에서 일반 속성처럼 사용합니다. 예를 들어 다음과 같습니다.

@Service
public class SomeService {

   @Value("${app.version}")
   private String appVersion;

   // other stuff
}

출처: Maven을 사용한 자동 자산 확장

그러나 yaml을 사용하여 응용 프로그램 속성을 저장하는 경우 구분 기호를 교체해야 할 수 있습니다.@예를 들어 다른 누군가와 함께^우리 회사에서는pom.xml:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.7</version>
    <configuration>
        <delimiters>
            <delimiter>^</delimiter>
        </delimiters>
        <useDefaultDelimiters>false</useDefaultDelimiters>
    </configuration>
</plugin>

또는 더 단순합니다. 변수만 바꾸면 됩니다.resource.delimiterpropetiespom.xml 블록:

<properties>
    <java.version>11</java.version>
    <resource.delimiter>^</resource.delimiter>
</properties>

그런 다음 속성 파일에서 다음과 같이 사용합니다.

app:
  version: ^project.version^
  name: ^project.name^

application.properties나 딜리미터 변경을 추가할 필요가 없습니다.목표 빌드 정보가 포함된 플러그인과 bean Build Properties가 포함된 자동 배선 시작 클래스를 추가합니다.

<plugin>
<groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-maven-plugin</artifactId>
   <version>2.1.3.RELEASE</version>
   <executions>
     <execution>
       <goals>
         <goal>build-info</goal>
       </goals>
     </execution>
   </executions>
</plugin>

스타트업 클래스에는

@Autowired
  BuildProperties buildProperties;

나중에@PostConstruct시작 클래스에서 여러 메서드를 호출하여 빌드 타임스탬프, 버전, 아티팩트 이름, 그룹 등을 검색할 수 있습니다.


private static final Logger LOGGER = LoggerFactory.getLogger(YourSpringApplication.class);

@Autowired
BuildProperties buildProperties;

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

@PostConstruct
  private void logVersion() {
    LOGGER.info(buildProperties.getName());
    LOGGER.info(buildProperties.getVersion());
    LOGGER.info(buildProperties.get("time"));
    LOGGER.info(buildProperties.getGroup());
}

info액튜에이터는 이 정보를 자동으로 사용하고, 검출되면 표시하며, 검출되면 git 정보를 표시합니다.

그것은 아마도 당신의 메인 폼이 스프링 부츠 스타터-부모를 부모 폼으로 선언하지 않기 때문일 것이다.이 경우 필터링은 기본적으로 실행되므로 필터링을 명시적으로 선언할 필요가 없습니다.

에서 변경하는 나의 경우:

<parent>
    <groupId>com.mycompany</groupId>
    <artifactId>mycompany-parent</artifactId>
    <version>20</version>
</parent>

대상:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.RELEASE</version>
</parent>

내 어플리케이션에서 main pom.xml은 필터링을 선언하지 않고 문제를 해결했습니다.

It works with @charactor.
 <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
</resource>

application.properties 또는 application.yml 파일에 저장...

버전: @project.version@name: @project.name@

언급URL : https://stackoverflow.com/questions/38983934/cannot-get-maven-project-version-property-in-a-spring-application-with-value

반응형