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


107

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

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

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

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

답변:


220

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

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

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

buildTimestamp=${timestamp}

1
다른 사람들을위한 메모, 나는 Eclipse 내에서 Tomcat을 사용하고 있고 잘 작동하지 않는 것처럼 보이기 때문에 문제가 발생했습니다. target/${project}폴더 에서 교체는 괜찮지 만 실제 구성에서는 Tomcat 이이 폴더를 사용하지 않습니다 ...
Betlista 2013 년

3
@Betlista 예, 이클립스의 서버 통합은 소스 디렉토리를 사용하는 것 같습니다. 이클립스 통합을 포기하고 명령 줄에서 maven을 사용하는 이유 중 하나였습니다.
kostja 2013 년

1
타임 스탬프가 필요한 pom에 여러 위치가 있지만 다른 형식 (예 : 파일 이름 및 빌드 시간 문자열) 인 경우 어떻게 maven.build.timestamp.format여러 번 사용할 수 있습니까?
Daniel Alder

13
작동하지 않습니다. 필터링은 ${timestamp}리터럴 문자열로 대체 됩니다 ${maven.build.timestamp}.
Kevin Krumwiede 2014 년

1
SpringBoot를 사용하는 경우 다음과 같이 작성해야합니다.buildTimestamp=@timestamp@
Julien Feniou

10

이제 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


1
불행하게도이 아직 작동하지 않습니다 받는다는 전쟁 - 플러그인 ( <webResources><resource><filtering>) :-( 참조 MWAR-415 > 그래서 여전히 해결 방법을 사용해야합니다 -
MSA

1
다른 플러그인은 필터링을 다르게 수행합니다. maven-assembly-plugin v3.3.0 내에서 필터링을 사용하는 경우 $ {maven.build.timestamp}는 여전히 직접 사용할 수 없으며 <properties><timestamp>...해결 방법 을 사용해야합니다 . 참조 issues.apache.org/jira/browse/MASSEMBLY-603
Cheeso

4

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

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

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


buildnumber-maven-plugin비슷한 문제가있는 것으로 나타났습니다 . 즉, 생성하는 변수는 필터링이 아닌 특정 컨텍스트에서만 사용할 수 있다는 것입니다. 실행 단계 나 목표를 수정하여이를 극복 할 수도 있고 그렇지 않을 수도 있지만 기본 제공 솔루션은 훨씬 더 간단 해 보입니다.
MarkHu

1

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}

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.