संसाधन फ़िल्टरिंग के लिए maven.build.timestamp का उपयोग कैसे करें


107

मैं मावेन 3.0.4 का उपयोग कर रहा हूं और बिल्ड टाइमस्टैम्प को अपने आवेदन के लिए सुलभ बनाना चाहूंगा। इसके लिए, मैं एक .propertiesफ़ाइल में एक प्लेसहोल्डर डाल रहा हूं और बिल्ड पर मावेन फ़िल्टर करने देता हूं । जबकि यह ठीक काम कर रहा है ${project.version}, ${maven.build.timestamp}फ़िल्टरिंग पर प्रतिस्थापित नहीं है।

संपत्ति बिल्ड पर उपलब्ध लगती है - मैं इसका उपयोग विरूपण साक्ष्य नाम को संशोधित करने के लिए कर सकता हूं:

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

तो यह संसाधन फ़िल्टरिंग के लिए क्यों उपलब्ध नहीं है? और, इससे भी महत्वपूर्ण बात यह है कि मैं इसे कैसे सुलभ करूं?

जवाबों:


220

मैंने इस लेख की खोज की है , यह बताते हुए कि मावेन में एक बग के कारण , टाइमस्टैम्प को फ़िल्टरिंग के लिए प्रचारित नहीं किया जाता है। वर्कअराउंड टाइमस्टैम्प को दूसरी प्रॉपर्टी में लपेटना है:

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

फिर छानना अपेक्षा के अनुसार काम करता है

buildTimestamp=${timestamp}

1
बस दूसरों के लिए एक नोट, मुझे इसके साथ समस्या थी, क्योंकि मैं एक्लिप्स के भीतर टॉमकैट का उपयोग कर रहा हूं और ऐसा लगता है, कि यह ठीक काम नहीं कर रहा है - प्रतिस्थापन target/${project}फ़ोल्डर में ठीक है , लेकिन मेरे एक्टुअल कॉन्फ़िगरेशन में टॉमकैट इस फ़ोल्डर का उपयोग नहीं कर रहा है ...
बेतालिस्ता

3
@Betlista हाँ, ग्रहण में सर्वर एकीकरण स्रोत निर्देशिका का उपयोग करने लगता है। यह एक कारण था कि मैंने ग्रहण एकीकरण को त्याग दिया और कमांड लाइन से मावेन का उपयोग किया।
कोस्तजा

1
यह देखते हुए कि एक पोम में कई जगह हैं जहां मुझे टाइमस्टैम्प की आवश्यकता है, लेकिन विभिन्न स्वरूपों में (उदाहरण के लिए एक फ़ाइल नाम और बिल्ड टाइम स्ट्रिंग), मैं maven.build.timestamp.formatकई बार कैसे उपयोग कर सकता हूं ?
डैनियल एल्डर

13
कोई काम नहीं। फ़िल्टरिंग ${timestamp}शाब्दिक स्ट्रिंग के साथ बदल जाती है ${maven.build.timestamp}
केविन क्रुमविडे

1
यदि आप स्प्रिंगबूट का उपयोग कर रहे हैं, तो आपको लिखना होगाbuildTimestamp=@timestamp@
जूलियन फेनीउ

10

मैं इस बात की पुष्टि कर सकता हूं कि मावेन 3.x {maven.build.timestamp}अभी "काम" कर रहा है। वे समस्या के आसपास काम करते हैं , जाहिरा तौर पर। अतिरिक्त कुछ नहींpropertiesअब समाधान की आवश्यकता नहीं है।

हालांकि, अपने "फ़िल्टरिंग" प्लगइन (मावेन-रिसोर्स-प्लगइन) से सावधान रहें। इसे अपेक्षाकृत नया होना चाहिए, इसलिए यदि 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>... वर्कअराउंड की अब आवश्यकता नहीं है ...

इससे यह भी साफ हो गया कि यह किस तरह से इंटेलीज में काम कर रहा है, लेकिन कमांड लाइन में नहीं। इंटेलीज शायद अपने स्वयं के "संशोधित / आंतरिक" मावेन स्थिरांक का उपयोग करता है, इसलिए यह वहां काम कर रहा था, लेकिन मावेन कमांड लाइन से नहीं।

यह भी ध्यान दें कि यदि आप किसी फ़िल्टरिंग संसाधन निर्देशिका को पोम में जोड़ते हैं, तो आपको डिफ़ॉल्ट निर्देशिका को "पुनः जोड़ने" की भी आवश्यकता हो सकती है, यह खो जाता है, पूर्व:

  <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
दुर्भाग्य से यह मावन -युद्ध-प्लगइन के लिए अभी तक काम नहीं करता है ( <webResources><resource><filtering>) :-( MWAR-415 देखें -> तो अभी भी वहाँ पर वर्कअराउंड का उपयोग करना है
msa

1
अलग-अलग प्लगइन्स अलग-अलग फ़िल्टरिंग करते हैं। यदि आप मावेन-असेंबली-प्लगइन v3.3.0 के भीतर फ़िल्टरिंग का उपयोग करते हैं, तो $ {maven.build.timestamp} अभी भी सीधे उपलब्ध नहीं है, और आपको <properties><timestamp>...वर्कअराउंड का उपयोग करने की आवश्यकता है । यह भी देखें issues.apache.org/jira/browse/MASSEMBLY-603
Cheeso

4

दूसरों के लिए Stackoverflow सामग्री को समृद्ध करने के लिए, कि मेरी तरह, इस पोस्ट को "समस्या" को हल करने के तरीके के रूप में मिला ${maven.build.timestamp}। यह मावेन बग नहीं है, लेकिन एम 2 का एक अपेक्षित व्यवहार है, जैसा कि इस पोस्ट में देखा जा सकता है

इसलिए, मेरा मानना ​​है कि हम समाधान को "सही" होने की उम्मीद नहीं कर सकते हैं, क्योंकि, जो मैं समझता हूं, उसमें सुधार में वैचारिक मुद्दे शामिल हैं।

मेरे मामले में, मैंने जो किया वह buildnumber-maven-pluginइस अन्य पोस्ट में वर्णित प्लगइन ( ) का उपयोग था ।


मुझे buildnumber-maven-pluginऐसी ही समस्याएं मिलीं , अर्थात् यह जो चर उत्पन्न करता है, वह केवल कुछ संदर्भों में उपलब्ध होता है, न कि छानने के लिए। आप निष्पादन चरण या लक्ष्यों के साथ छेड़छाड़ करके उस पर काबू पाने में सक्षम नहीं हो सकते हैं, लेकिन अंतर्निहित समाधान इतना सरल लगता है।
MarkHu

1

पोम परियोजना के स्तर पर मावेन के गुणों को जोड़ना स्थानीय टाइमज़ोन को सही नहीं बनाता है, इसलिए टाइमस्टैम्प गलत हो सकता है:

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

बिल्ड-हेल्पर-मावेन-प्लगइन का उपयोग टाइमस्टैम्प पर सही टाइमज़ोन और वर्तमान डेलाइट बचत को लागू करता है:

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

पैकेजिंग करते समय, मावेन किसी भी टोकन टाइमस्टैम्प को / रिसोर्स फ़ोल्डर, जैसे संसाधनों / version.properties में बदल देगा:

build.timestamp = $ {} टाइमस्टैम्प

आप इस गुण फ़ाइल को अपने अनुप्रयोग में लोड कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.