[maven] 리소스 필터링을 위해 maven.build.timestamp에 액세스하는 방법

maven 3.0.4를 사용하고 있으며 내 애플리케이션에서 빌드 타임 스탬프에 액세스 할 수 있도록하고 싶습니다. 이를 위해 .properties파일에 자리 표시자를 넣고 maven이 빌드시 필터링하도록합니다. 이것에 대해 잘 작동하지만 ${project.version}, ${maven.build.timestamp}필터링 치환되지 않는다.

이 속성은 빌드에서 사용할 수있는 것 같습니다.이 속성을 사용하여 아티팩트 이름을 수정할 수 있습니다.

<finalName>${project.artifactId}-${maven.build.timestamp}</finalName>

그렇다면 왜 리소스 필터링에 사용할 수 없습니까? 그리고 더 중요한 것은 어떻게 액세스 할 수있게 만들까요?



답변

이 기사를 발견 하여 maven버그 로 인해 빌드 타임 스탬프가 필터링에 전파되지 않는다고 설명했습니다 . 해결 방법은 타임 스탬프를 다른 속성으로 래핑하는 것입니다.

<properties>
   <timestamp>${maven.build.timestamp}</timestamp>
   <maven.build.timestamp.format>yyyy-MM-dd HH:mm</maven.build.timestamp.format>
</properties>

그러면 필터링이 예상대로 작동합니다.

buildTimestamp=${timestamp}


답변

이제 Maven 3.x {maven.build.timestamp}가 “작동 중” 임을 확인할 수 있습니다 . 그들은 arounded 일 분명히 문제를. properties더 이상 추가 해결 방법이 필요하지 않습니다.

그러나 “필터링”플러그인 (maven-resources-plugin)이 최신 상태임을주의하십시오. 비교적 새 mvn help:effective-pom버전 이어야하므로 이전 버전 (예 : 2.6)이 표시되면 더 새로운 버전으로 변경하고 3.x 예를 들어 수정했습니다.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-resources-plugin</artifactId>
  <version>3.1.0</version>
</plugin>

<properties><timestamp>... 해결 방법이 더 이상 필요하지 않습니다 …

이것은 또한 IntelliJ에서 작동하지만 명령 줄에서는 작동하지 않는 이유를 정리했습니다. IntelliJ는 아마도 자신의 “수정 된 / 내부”maven 상수를 사용하므로 거기에서 작동했지만 maven 명령 줄에서는 작동하지 않았습니다.

또한 필터링 리소스 디렉터리를 pom에 추가하면 기본 디렉터리를 “다시 추가”해야 할 수도 있습니다. 예를 들어 다음과 같이 손실됩니다.

  <resource>
    <directory>src/main/resources-filtered</directory> <!-- to get "maven.build.timestamp" into resource properties file -->
    <filtering>true</filtering>
  </resource>
  <resource>
    <directory>src/main/resources</directory> <!-- apparently have to add this is you have the other... -->
  </resource>

NB 부모로 스프링 부트를 사용하는 경우 @ maven.build.timestamp @ 대신 사용해야 합니다 . 또한 스프링 부트를 사용하는 경우 읽을 수있는에 META-INF/build-info.properties의해 선택적으로 생성 된 파일 이 spring-boot-maven-plugin있습니다 (스프링은 읽기 편의를 위해 빈을 제공합니다).BuildProperties


답변

저와 같은 다른 사람들을 위해 Stackoverflow 콘텐츠를 풍부하게하기 위해이 게시물이의 “문제”를 해결하는 방법으로 발견되었습니다 ${maven.build.timestamp}. 이것은 maven 버그가 아니지만 이 게시물 에서 볼 수 있듯이 m2e의 예상되는 동작입니다 .

따라서 내가 이해 한 바에 따르면 수정에는 개념적 문제가 포함되기 때문에 해결책이 “수정”될 것으로 기대할 수 없다고 생각합니다.

제 경우에는 다른 게시물에buildnumber-maven-plugin 설명 된대로 플러그인 ( )을 사용 했습니다 .


답변

pom 프로젝트 수준에서 Maven 속성을 추가하면 올바른 로컬 시간대가 고려되지 않으므로 타임 스탬프가 잘못 표시 될 수 있습니다.

<properties><timestamp>${maven.build.timestamp}</timestamp></properties>

build-helper-maven-plugin을 사용하면 올바른 시간대와 현재 일광 절약 시간이 타임 스탬프에 적용됩니다.

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.9.1</version>
            <executions>
                <execution>
                    <id>timestamp-property</id>
                    <goals>
                        <goal>timestamp-property</goal>
                    </goals>
                    <configuration>
                        <name>timestamp</name>
                        <pattern>yyyy-MM-dd HH:mm:ss</pattern>
                        <timeZone>Europe/Zurich</timeZone>
                    </configuration>
                </execution>
            </executions>
        </plugin>
     </plugins>
     <resources>
         <resource>
             <directory>src/main/resources</directory>
             <filtering>true</filtering>
         </resource>
     </resources>
 </build>

패키징 할 때 Maven은 / resources 폴더의 모든 토큰 타임 스탬프 (예 : resources / version.properties)를 대체합니다.

build.timestamp = $ {timestamp}

그런 다음 응용 프로그램에서이 속성 파일을로드 할 수 있습니다.


답변