วิธีเข้าถึง 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}โฟลเดอร์ก็โอเคแต่ในการกำหนดค่าแอคทูออลของฉัน Tomcat ไม่ได้ใช้โฟลเดอร์นี้ ...
Betlista

3
@ Betlista ใช่การรวมเซิร์ฟเวอร์ใน eclipse ดูเหมือนจะใช้ไดเร็กทอรีต้นทาง มันเป็นสาเหตุหนึ่งที่ทำให้ฉันยกเลิกการรวม eclipse และใช้ maven จากบรรทัดคำสั่ง
kostja

1
เนื่องจากมีหลายที่ใน pom ที่ฉันต้องการการประทับเวลา แต่ในรูปแบบที่แตกต่างกัน (เช่นชื่อไฟล์และสตริงเวลาสร้าง) ฉันจะใช้maven.build.timestamp.formatหลายครั้งได้อย่างไร
Daniel Alder

13
ไม่เวิร์ค การกรองจะแทนที่${timestamp}ด้วยสตริงลิเทอรั${maven.build.timestamp}
Kevin Krumwiede

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 "modified / internal" ของตัวเองดังนั้นจึงใช้งานได้ที่นั่น แต่ไม่ใช่จากบรรทัดคำสั่ง 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>

หมายเหตุถ้าคุณกำลังใช้บูตฤดูใบไม้ผลิเป็นพ่อแม่ของคุณคุณต้องใช้ @ @ 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-plugin v3.3.0 $ {maven.build.timestamp} จะยังไม่สามารถใช้งานได้โดยตรงและคุณต้องใช้<properties><timestamp>...วิธีแก้ปัญหา ดูissue.apache.org/jira/browse/MASSEMBLY-603
Cheeso

4

เพื่อที่จะเสริมสร้างเนื้อหา Stackoverflow สำหรับคนอื่น ๆ ที่ชอบฉันพบโพสต์นี้เป็นวิธีการแก้ "ปัญหา" ${maven.build.timestamp}ของ นี่ไม่ใช่ข้อผิดพลาดของ maven แต่เป็นพฤติกรรมที่คาดหวังของ m2e ดังที่เห็นในโพสต์นี้

ดังนั้นฉันเชื่อว่าเราไม่สามารถคาดหวังว่าโซลูชันจะ "แก้ไข" ได้เนื่องจากจากสิ่งที่ฉันเข้าใจการแก้ไขนั้นเกี่ยวข้องกับประเด็นทางความคิด

ในกรณีของฉันสิ่งที่ฉันทำคือใช้ปลั๊กอิน ( buildnumber-maven-plugin) ตามที่อธิบายไว้ในโพสต์อื่นนี้


ฉันพบว่าbuildnumber-maven-pluginมีปัญหาที่คล้ายกันกล่าวคือตัวแปรที่สร้างขึ้นนั้นใช้ได้เฉพาะในบางบริบทเท่านั้นไม่ได้กรอง คุณอาจหรือไม่สามารถเอาชนะได้โดยการแก้ไขขั้นตอนการดำเนินการหรือเป้าหมาย แต่โซลูชันในตัวดูเหมือนจะง่ายกว่ามาก
MarkHu

1

การเพิ่มคุณสมบัติ 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 = $ {timestamp}

จากนั้นคุณสามารถโหลดไฟล์คุณสมบัตินี้ในแอปพลิเคชันของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.