Como acessar maven.build.timestamp para filtragem de recursos

107

Estou usando o maven 3.0.4 e gostaria de tornar o carimbo de data / hora de construção acessível ao meu aplicativo. Para isso, estou colocando um espaço reservado em um .propertiesarquivo e vou deixar o maven filtrar na compilação. Embora esteja funcionando bem para ${project.version}, ${maven.build.timestamp}não é substituído na filtragem.

A propriedade parece estar disponível na construção - posso usá-la para modificar o nome do artefato:

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

Então, por que ele não está disponível para filtragem de recursos? E, mais importante, como faço para torná-lo acessível?

Kostja
fonte

Respostas:

220

Eu descobri este artigo , explicando que devido a um bug no maven , o timestamp de compilação não é propagado para a filtragem. A solução alternativa é envolver o carimbo de data / hora em outra propriedade:

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

A filtragem funciona conforme o esperado para

buildTimestamp=${timestamp}
Kostja
fonte
1
Só uma observação para os outros, tive problemas com isso, porque estou usando o Tomcat dentro do Eclipse e parece que não está funcionando bem - a substituição está ok na target/${project}pasta, mas na minha configuração atual o Tomcat não está usando esta pasta ...
Betlista
3
@Betlista sim, a integração do servidor no eclipse parece usar o diretório de origem. Foi uma das razões pelas quais abandonei a integração do eclipse e usei o maven na linha de comando.
kostja
1
Considerando que há vários lugares em um pom onde preciso de um carimbo de data / hora, mas em formatos diferentes (por exemplo, um nome de arquivo e uma string de tempo de construção), como posso usar maven.build.timestamp.formatvárias vezes?
Daniel Alder
13
Não funciona. A filtragem é substituída ${timestamp}pela string literal ${maven.build.timestamp}.
Kevin Krumwiede de
1
Se você estiver usando SpringBoot, você deve escreverbuildTimestamp=@timestamp@
Julien Feniou
10

Posso confirmar que o Maven 3.x {maven.build.timestamp}está "funcionando" agora. Eles contornaram o problema, aparentemente. Nenhuma propertiessolução alternativa adicional necessária.

No entanto, tome cuidado com o plugin de "filtragem" (maven-resources-plugin) atualizado. Ele precisa ser relativamente novo, então se mvn help:effective-pommostrar uma versão antiga (ex: 2.6), coloque algo mais novo, conserte para mim, 3.x ex:

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

<properties><timestamp>... a solução alternativa não é mais necessária ...

Isso também esclareceu, mais ou menos, por que estava funcionando no IntelliJ, mas não na linha de comando. O IntelliJ provavelmente usa suas próprias constantes do maven "modificadas / internas", então estava funcionando lá, mas não na linha de comando do maven.

Observe também que se você adicionar um diretório de recursos de filtragem ao seu pom, pode ser necessário "adicionar novamente" o diretório padrão, ele se perde, por exemplo:

  <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 se você estiver usando uma bota de primavera como seu pai, você deve usar @ maven.build.timestamp @ em seu lugar . Observe também que se você estiver usando o spring boot, há um arquivo META-INF/build-info.propertiesque é criado opcionalmente pelo spring-boot-maven-pluginque você pode ler (o spring fornece um BuildPropertiesbean para facilitar a leitura).

rogerdpack
fonte
1
Infelizmente, isso ainda não funciona para maven-war-plugin ( <webResources><resource><filtering>) :-( consulte MWAR-415 -> então ainda tenho que usar a solução alternativa lá
msa
1
Plug-ins diferentes filtram de maneira diferente. Se você usar a filtragem no maven-assembly-plugin v3.3.0, o $ {maven.build.timestamp} ainda não está diretamente disponível e você precisa usar a <properties><timestamp>...solução alternativa. Veja também issues.apache.org/jira/browse/MASSEMBLY-603
Cheeso
4

Com o intuito de enriquecer o conteúdo do Stackoverflow para outras pessoas, que como eu, encontrei este post como forma de resolver o "problema" da ${maven.build.timestamp}. Este não é um bug maven, mas um comportamento esperado de m2e, como pode ser visto neste post .

Portanto, acredito que não podemos esperar que a solução seja “corrigida”, pois, pelo que entendi, a correção envolve questões conceituais.

No meu caso, o que fiz foi usar o plugin ( buildnumber-maven-plugin) conforme descrito neste outro post .

Bob Rivers
fonte
Descobri buildnumber-maven-pluginque tenho problemas semelhantes, nomeadamente que a variável que gera só está disponível em determinados contextos, NÃO filtragem. Você pode ou não ser capaz de superar isso mexendo na fase de execução ou nas metas, mas a solução integrada parece muito mais simples.
MarkHu
1

Adicionar propriedades Maven no nível do projeto pom não leva em consideração o fuso horário local correto, portanto, o carimbo de data / hora pode parecer errado:

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

O uso do build-helper-maven-plugin aplica o fuso horário correto e o horário de verão atual ao carimbo de data / hora:

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

Ao empacotar, o Maven substituirá qualquer carimbo de data / hora do token na pasta / resources, por exemplo, resources / version.properties:

build.timestamp = $ {timestamp}

Você pode então carregar esse arquivo de propriedades em seu aplicativo.

skay
fonte