Як отримати доступ до 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
Лише зауваження для інших, у мене виникли проблеми з цим, оскільки я використовую Tomcat в межах Eclipse і, здається, він не працює нормально - заміна в target/${project}папці нормальна , але в моїй конфігурації actuall Tomcat не використовує цю папку ...
Betlista

3
@Betlista Так, інтеграція серверів у затемнення, здається, використовує вихідний каталог. Це було однією з причин, чому я відмовився від інтеграції затемнення і використовував maven з командного рядка.
костя

1
З огляду на те, що в пам’яті є кілька місць, де мені потрібна мітка часу, але в різних форматах (наприклад, ім’я файлу та часовий рядок побудови), як я можу використовувати maven.build.timestamp.formatкілька разів?
Даніель Олдер

13
Ніякого трудомісткого. Фільтрування замінюється ${timestamp}буквальним рядком ${maven.build.timestamp}.
Кевін Крумвіде

1
Якщо ви використовуєте SpringBoot, вам доведеться написатиbuildTimestamp=@timestamp@
Жульєн Феніу

10

Я можу підтвердити, що Maven 3.x {maven.build.timestamp}зараз "працює". Вони , мабуть, обійшли проблему. Ніяких додаткових propertiesрішень більше не потрібно.

Однак будьте уважні, що ваш «фільтруючий» плагін (maven-ресурси-плагін) оновлений. Він повинен бути відносно новим, тому, якщо 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.

Також зверніть увагу, якщо ви додасте до себе каталог ресурсів фільтрації, вам може знадобитися також "повторно додати" каталог за замовчуванням, він втрачається, наприклад:

  <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
На жаль, це ще не працює для Maven-war-plugin ( <webResources><resource><filtering>) :-( див. MWAR-415 -> тому все одно доведеться використовувати там вирішення
msa

1
Різні плагіни фільтрують по-різному. Якщо ви використовуєте фільтрування в maven-Assembly-плагіні v3.3.0, $ {maven.build.timestamp} все ще не доступний безпосередньо, і вам потрібно скористатися способом <properties><timestamp>...вирішення. Дивіться також проблеми.apache.org
jira/

4

Щоб збагатити вміст Stackoverflow для інших, хто, як я, знайшов цю публікацію як спосіб вирішити "проблему" ${maven.build.timestamp}. Це не помилка Maven, а очікувана поведінка m2e, як видно у цій публікації .

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

У моєму випадку я використовував плагін ( buildnumber-maven-plugin), як описано в цій іншій публікації .


Я виявив buildnumber-maven-pluginподібні проблеми, а саме те, що змінна, яку вона генерує, доступна лише в певних контекстах, НЕ фільтруючи. Ви можете або не зможете подолати це, поводячись із етапом виконання або цілями, але вбудоване рішення здається набагато простішим.
MarkHu

1

Додавання властивостей Maven на рівні пом-проекту не враховує правильний локальний часовий пояс, тому часова мітка може відображатися неправильно:

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

Використовуючи плагін build-helper-maven, застосовується правильний часовий пояс та поточне літнє світло до часової позначки:

<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, наприклад ресурси / version.properties:

build.timestamp = $ {timestamp}

Потім ви можете завантажити цей файл властивостей у Вашій програмі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.