it-roy-ru.com

Как получить доступ к maven.build.timestamp для фильтрации ресурсов

Я использую maven 3.0.4 и хотел бы сделать метку времени сборки доступной для моего приложения. Для этого я помещаю заполнитель в файл .properties и позволяю maven фильтровать при сборке. Хотя это работает нормально для ${project.version}, ${maven.build.timestamp} не заменяется на фильтрацию. 

Похоже, что свойство доступно при сборке - я могу использовать его для изменения имени артефакта: 

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

Так почему же он не доступен для фильтрации ресурсов? И, что более важно, как я могу сделать это доступным?

92
kostja

Я обнаружил this article , объясняя, что из-за bug в maven метка времени сборки не распространяется на фильтрацию. Обходной путь должен обернуть метку времени в другое свойство:

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

Фильтрация тогда работает как ожидалось для

buildTimestamp=${timestamp}
194
kostja

Для того, чтобы обогатить контент Stackoverflow для других, таких как я, этот пост был найден как способ решения «проблемы» ${maven.build.timestamp}. Это не ошибка Maven, а ожидаемое поведение m2e, как можно увидеть в этом посте .

Поэтому я считаю, что мы не можем ожидать, что решение будет «исправлено», поскольку, насколько я понимаю, исправление связано с концептуальными проблемами.

В моем случае я использовал плагин (buildnumber-maven-plugin), как описано в этом другом посте .

2
Bob Rivers

Я могу подтвердить, что с Maven 3.x {maven.build.timestamp} сейчас «работает». Они работают обоснованно проблема, по-видимому. Никаких дополнительных properties не требуется.

Однако, будьте осторожны, ваш плагин «фильтрации» (maven-resources-plugin) обновлен. Он должен быть относительно новым, поэтому, если mvn help:effective-pom показывает старую версию (например, 2.6), увеличьте ее до чего-то более нового, исправьте для меня 3.x ex:

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

Добавление свойств Maven на уровне проекта pom не учитывает правильный местный часовой пояс, поэтому временная метка может отображаться неправильно:

<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 = $ {} Отметка времени

Затем вы можете загрузить этот файл свойств в вашем приложении.

0
skay