Cách truy cập maven.build.timestamp để lọc tài nguyên


107

Tôi đang sử dụng maven 3.0.4 và muốn làm cho dấu thời gian xây dựng có thể truy cập được vào ứng dụng của tôi. Đối với điều này, tôi đang đặt một trình giữ chỗ trong một .propertiestệp và để maven lọc trên bản dựng. Trong khi điều này hoạt động tốt ${project.version}, ${maven.build.timestamp}không được thay thế khi lọc.

Thuộc tính dường như có sẵn trên bản dựng - Tôi có thể sử dụng nó để sửa đổi tên tạo tác:

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

Vậy tại sao nó không có sẵn để lọc tài nguyên? Và, quan trọng hơn, làm cách nào để tôi có thể truy cập nó?

Câu trả lời:


220

Tôi đã phát hiện ra bài viết này , giải thích rằng do một lỗi trong maven , dấu thời gian xây dựng không được truyền đến bộ lọc. Cách giải quyết là bọc dấu thời gian trong một thuộc tính khác:

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

Sau đó, bộ lọc hoạt động như mong đợi cho

buildTimestamp=${timestamp}

1
Chỉ là một lưu ý cho những người khác, tôi đã gặp vấn đề với điều đó, bởi vì tôi đang sử dụng Tomcat trong Eclipse và có vẻ như nó không hoạt động tốt - thay thế là ok trong target/${project}thư mục, nhưng trong cấu hình actuall của tôi, Tomcat không sử dụng thư mục này ...
Betlista

3
@Betlista vâng, tích hợp máy chủ trong eclipse dường như sử dụng thư mục nguồn. Đó là một trong những lý do tại sao tôi từ bỏ tích hợp nhật thực và sử dụng maven từ dòng lệnh.
kostja

1
Do có nhiều vị trí trong pom mà tôi cần dấu thời gian, nhưng ở các định dạng khác nhau (ví dụ: tên tệp và chuỗi thời gian xây dựng), làm cách nào tôi có thể sử dụng maven.build.timestamp.formatnhiều lần?
Daniel Alder

13
Không vất vả. Lọc thay thế ${timestamp}bằng chuỗi ký tự ${maven.build.timestamp}.
Kevin Krumwiede

1
Nếu bạn đang sử dụng SpringBoot, bạn phải viếtbuildTimestamp=@timestamp@
Julien Feniou

10

Tôi có thể xác nhận rằng Maven 3.x {maven.build.timestamp}hiện đang "hoạt động". Họ làm việc arounded vấn đề, rõ ràng. Không propertiescần giải pháp thay thế bổ sung nữa.

Tuy nhiên, hãy cẩn thận với plugin "lọc" (maven-resources-plugin) của bạn đã được cập nhật. Nó cần phải tương đối mới, vì vậy nếu mvn help:effective-pomhiển thị phiên bản cũ (ví dụ: 2.6), hãy chuyển nó sang thứ gì đó mới hơn, sửa nó cho tôi, 3.x ex:

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

<properties><timestamp>... giải pháp thay thế không còn cần thiết ...

Điều này cũng làm rõ, đại loại là tại sao nó lại hoạt động trong IntelliJ nhưng không hoạt động trong dòng lệnh. IntelliJ có thể sử dụng hằng số maven "đã sửa đổi / nội bộ" của riêng họ, vì vậy nó đã hoạt động ở đó, nhưng không phải từ dòng lệnh maven.

Cũng lưu ý nếu bạn thêm thư mục tài nguyên lọc vào pom, bạn cũng có thể cần phải "thêm lại" thư mục mặc định, nó sẽ bị mất, ví dụ:

  <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 nếu bạn đang sử dụng Spring boot với tư cách là cha mẹ của mình, bạn phải sử dụng @ maven.build.timestamp @ để thay thế . Cũng lưu ý nếu bạn đang sử dụng Spring boot, có một tệp META-INF/build-info.propertiesđược tùy chọn tạo bởi tệp spring-boot-maven-pluginmà bạn có thể đọc (mùa xuân cung cấp một BuildPropertiesbean để thuận tiện cho việc đọc nó).


1
Thật không may, điều này chưa hoạt động cho maven-war-plugin ( <webResources><resource><filtering>) :-( xem MWAR-415 -> vì vậy vẫn phải sử dụng giải pháp thay thế ở đó
msa

1
Các plugin khác nhau thực hiện lọc khác nhau. Nếu bạn sử dụng tính năng lọc trong maven-assembly-plugin v3.3.0, thì $ {maven.build.timestamp} vẫn không khả dụng trực tiếp và bạn cần sử dụng <properties><timestamp>...giải pháp thay thế. Xem thêm issue.apache.org/jira/browse/MASSEMBLY-603
Cheeso

4

Để làm phong phú nội dung Stackoverflow cho những người khác, giống như tôi, đã tìm thấy bài đăng này như một cách để giải quyết "vấn đề" của ${maven.build.timestamp}. Đây không phải là một lỗi maven, mà là một hành vi mong đợi của m2e, như có thể thấy trong bài đăng này .

Vì vậy, tôi tin rằng chúng ta không thể mong đợi giải pháp được "sửa chữa", vì, theo những gì tôi hiểu, việc sửa chữa liên quan đến các vấn đề khái niệm.

Trong trường hợp của tôi, những gì tôi đã làm là sử dụng plugin ( buildnumber-maven-plugin) như được mô tả trong bài đăng khác này .


Tôi nhận thấy buildnumber-maven-plugincó những vấn đề tương tự, cụ thể là biến mà nó tạo ra chỉ khả dụng trong một số ngữ cảnh nhất định, KHÔNG lọc. Bạn có thể khắc phục được hoặc không thể vượt qua điều đó bằng cách mày mò giai đoạn thực hiện hoặc các mục tiêu, nhưng giải pháp tích hợp có vẻ đơn giản hơn nhiều.
MarkHu

1

Việc thêm thuộc tính Maven ở cấp dự án pom không tính đến Múi giờ cục bộ chính xác, vì vậy dấu thời gian có thể xuất hiện sai:

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

Việc sử dụng build-helper-maven-plugin sẽ áp dụng múi giờ chính xác và tiết kiệm ánh sáng ban ngày hiện tại cho dấu thời gian:

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

Khi đóng gói, Maven sẽ thay thế bất kỳ dấu thời gian mã thông báo nào trong thư mục / resources, ví dụ: resources / version.properties:

build.timestamp = $ {timestamp}

Sau đó, bạn có thể tải tệp thuộc tính này trong Ứng dụng của mình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.