2012-01-12 13 views
12

मैं एएनटी से आया हूं जहां आप किसी विधि को निष्पादित करके संस्करण संख्या प्राप्त करने के लिए .java फ़ाइल का आह्वान कर सकते हैं। मैं अपने नए pom.xml में स्वचालित रूप से सही संस्करण संख्या प्राप्त करने के लिए कुछ ऐसा करना चाहता हूं। मुझे ऐप को अपने संस्करण के बारे में जानने की ज़रूरत है और साथ ही मैवेन को संस्करण के बारे में जानने के लिए सही बनाता है। संस्करण infomormation दोगुना होल्डिंग कोई विकल्प नहीं है।जावा फ़ाइल में मेवेन संस्करण संख्या

या मेवेन इमारत के दौरान/पहले एक नई .java फ़ाइल बना सकते हैं?

मैं इसे प्राप्त करने के कुछ तरीकेों को चित्रित कर सकता हूं, लेकिन क्या मैवेन प्रोजेक्ट में ऐसा करने का सबसे अच्छा तरीका है?

+0

आप maven - 'pom.xml' – donnior

+0

के लिए कॉन्फ़िगरेशन फ़ाइल में संस्करण निर्दिष्ट कर सकते हैं हां, मुझे पता है, लेकिन मुझे ऐप को संस्करण संख्या के बारे में भी जानने की आवश्यकता है, इसलिए pom.xml को संस्करण संख्या को पढ़ना चाहिए एक जावा फ़ाइल या pom.xml संस्करण संख्या के साथ एक जावा फ़ाइल के निर्माण को ट्रिगर करना चाहिए। –

+0

मेवेन में "फ़िल्टर संसाधन" सुविधा है, यह आपके कोड फ़ाइल में कुछ सामग्री को बिल्ड के दौरान मेवेन चर के साथ प्रतिस्थापित कर सकती है, आपको अपनी फ़ाइलों में '$ {project.version} 'जैसे मार्कअप जोड़ना है। आप इसे http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html – donnior

उत्तर

20

जब एक जार का निर्माण होता है, तो मैवेन pom.xml और pom.properties फ़ाइल META-INF/maven/[group ID]/[artifact ID] निर्देशिका में लिखता है। फिर आप अपने आवेदन में इनमें से किसी एक के संस्करण को पढ़ सकते हैं।

वैकल्पिक रूप से, आप स्पष्ट रूप से resource filtering का उपयोग करके एक नई संस्करण.प्रोपर्टीज फ़ाइल लिख सकते हैं।

आप अपने पोम में निम्नलिखित डाल दिया:

<build> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
     </resource> 
    </resources> 
</build> 

और फिर src/मुख्य/संसाधन निर्देशिका कि लग रहा है में एक version.properties टेम्पलेट डाल की तरह:

version = ${project.version} 

Maven में विकल्प होगा संस्करण पीओएम से पढ़ा गया है, और आपके आवेदन को केवल version.properties संसाधन पढ़ने की आवश्यकता है और version कुंजी से पूछताछ करें।

+0

यह दृष्टिकोण अच्छा लगता है, लेकिन एक बात मैं समझ नहीं पा रहा हूं: यदि मैं एक्प्लीज में विकास कर रहा हूं और सीधे रन बटन के साथ प्रोजेक्ट शुरू करता हूं, तो मैवेन ने अभी तक मूल्य को प्रतिस्थापित नहीं किया होगा। या मैं हमेशा मेवेन के माध्यम से परियोजना शुरू करना चाहिए? –

+0

@ फ्रांज ट्रू, मैवेन को इसे लेने के लिए एक्लिप्स के लिए फ़ाइल को चलाने और फिर से लिखना होगा। आप स्रोत फ़ोल्डर के रूप में लक्ष्य/निर्माण/कक्षा निर्देशिका जोड़ सकते हैं, इसलिए ग्रहण पुन: लिखित फ़ाइल को चुनता है, या आप स्पष्ट रूप से संसाधन प्लगइन को चला सकते हैं और अपनी आउटपुट फ़ाइलों को एक अलग निर्देशिका में उत्पन्न कर सकते हैं, और इसे ग्रहण में स्रोत फ़ोल्डर के रूप में शामिल कर सकते हैं । साथ ही, मुझे नहीं पता कि नवीनतम M2Eclipse कैसे परिष्कृत है, लेकिन हो सकता है कि यह फ़िल्टर किए गए संसाधनों को संभाल सके। (http://stackoverflow.com/questions/2773474/m2eclipse-resource-filtering देखें) – prunge

0

यह स्पष्ट नहीं है कि आप किस संस्करण संख्या का जिक्र कर रहे हैं, और यह जावा फ़ाइल में क्यों होगा। हालांकि यदि आप मानक मेवेन सम्मेलन का पालन करने के बजाय अपनी परियोजना में संस्करण संख्या असाइन करने का प्रयास कर रहे हैं।

<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.myco.abc</groupId> 
    <artifactId>myapp</artifactId> 
    <packaging>war</packaging> 
    <version>1.0.0-SNAPSHOT</version> 

    <name>My App</name> 
    <description>My application description.</description> 
    <url>http://myapp.myco.com</url> 
.... 
+0

पर प्राप्त कर सकते हैं, मैं 1.0.0-स्नैपशॉट का जिक्र कर रहा हूं। ऐप के पुराने संस्करणों के साथ संवाद करते समय ऐप को अलग-अलग काम करने के लिए संस्करण संख्या की आवश्यकता होती है क्योंकि उदा। इंटरफेस बदल सकते हैं। –

1

मैं इतने पर इस सूत्र का उल्लेख होगा: यहाँ एक उदाहरण है How to read an external properties file in Maven। विशेष रूप से, डोग्नुकम से जवाब देखें जो वर्णन करता है कि मैवेन में बाहरी प्रॉपर्टी फ़ाइल को कैसे पढ़ा जाए। आप इसे अपने मेवेन बिल्ड स्क्रिप्ट और अपने जावा एप्लिकेशन दोनों में संस्करण संख्या को नियंत्रित करने के लिए साझा स्रोत के रूप में उपयोग कर सकते हैं।

1

शायद यदि आप इस आवश्यकता पर थोड़ा और विस्तार करते हैं तो हम आपकी समस्या के लिए एक अधिक सुरुचिपूर्ण मैवेनिश समाधान प्रदान करने में और मदद कर सकते हैं। एनएमली, यह दूसरा एप्लिकेशन क्या है, क्या इसे मेवेन से लॉन्च किया गया है, यदि ऐसा है तो बिल्ड प्रक्रिया के किस चरण के दौरान इसे लॉन्च किया गया है? इस एप्लिकेशन और मेवेन की बातचीत क्या है?

इसे पूरा करने के कई तरीके हैं लेकिन सही चुनने पर आपकी विशेष स्थिति पर निर्भर करता है, आपके प्रश्न में पर्याप्त जानकारी में अधिक व्यापक समाधान में गहरी खुदाई करने के लिए पर्याप्त जानकारी नहीं है। जैसा कि कहा गया है, मन के लिए आते हैं निम्नलिखित:

  • External properties: आप इस प्रक्रिया का निर्माण Maven से या तो बाहर से या सीधे एक संपत्ति फ़ाइल बना सकते हैं। फिर आप इस प्रॉपर्टी फ़ाइल को अपने अन्य एप्लिकेशन से पढ़ सकते हैं।

  • फ़िल्टरिंग: जैसा कि अन्य ने उल्लेख किया है कि मेवेन को संसाधन फ़ाइल फ़िल्टर करना संभव है। यह फ़ाइल एक जावा फ़ाइल हो सकती है जिसमें आप वर्तमान संस्करण संख्या डालते हैं और इस फ़ाइल को अपने अन्य एप्लिकेशन से कॉल करते हैं।

  • मेवेन बिल्ड से अपने आवेदन को कॉल करें और तर्क पारित करें: आप exec प्लगइन का उपयोग कर सकते हैं और वर्तमान एप्लिकेशन नंबर $ {project.version} को पार करते हुए मेवेन की उप-प्रक्रिया के रूप में अपना एप्लिकेशन कॉल कर सकते हैं।

  • Integrate मैवेन में आपकी पुरानी चींटी बिल्ड: आप सीधे कुछ चींटी स्निपेट या मेवेन से पूरी चींटी निर्माण को कॉल कर सकते हैं। यह आपको एक हाइब्रिड बिल्ड सिस्टम प्रदान करेगा जो शायद सबसे अच्छा नहीं है लेकिन फिर भी आपको अपनी माइग्रेशन प्रक्रिया में कुछ छूट मिलेगा और पुराने एंट स्क्रिप्ट्स को धीरे-धीरे मैवेन पर कार्यक्षमता के स्लाइस माइग्रेट करने का प्रबंधन करेगा। ऐसा नहीं है कि दोनों का मिश्रण होने के लिए यह आवश्यक नहीं है कि सिर्फ मैवेन बहुत कठिन वायर्ड या अर्ध हार्ड वायर्ड कॉन्फ़िगरेशन सम्मेलन प्रदान करता है जो एंटी स्क्रिप्ट हस्तक्षेप कर सकता है। इस संबंध में दोनों एक दूसरे के साथ अच्छा खेलना मुश्किल हो सकता है।

  • ant से अपने मेवेन बिल्ड को ड्राइव करें: आप इसके विपरीत भी कर सकते हैं, जो मैवेन को एंटी से निर्माण प्रक्रिया चलाता है इस प्रकार आप अपने अन्य सिस्टम को कैसे कॉल करते हैं इस पर नियंत्रण रखते हैं। सही चीजों को एकीकृत करके (जैसे गुण या फ़िल्टर) आप यह सुनिश्चित कर सकते हैं कि मैवेन एक विशिष्ट प्रोजेक्ट से आवश्यक आर्टिफैक्ट उत्पन्न करता है जिसे आप बाद में अपनी एंट स्क्रिप्ट के भीतर उपयोग कर सकते हैं। ध्यान दें कि इस कार्य के लिए दस्तावेज़ बहुत विस्तृत नहीं हैं, आपको इसे काम करने के लिए थोड़ा सा परेशान होना पड़ सकता है लेकिन कम से कम आप एक परिचित माहौल में होंगे।

इन दोनों प्रणालियों पर कैसे बातचीत की जाती है और आपको इस जानकारी की आवश्यकता क्यों है, इस बारे में अधिक जानकारी के बिना आपके लिए गहरी खुदाई करना मुश्किल है।

आशा इस मदद करता है

0

मुझे पता है यह बहुत पहले उत्तर दिया गया है, लेकिन मैं इस सवाल का जवाब है कि कुछ उपयोगी लग सकते पर एक नया मोड़ के साथ आए हैं।

मेरे पास प्रतिलिपि प्लगइन प्रत्येक MAVEN बिल्ड पर जावा फ़ाइल में एक स्ट्रिंग को बदलता है। इसलिए, यदि pom.xml कभी भी पोम प्रोजेक्ट संस्करण संख्या अपडेट करता है, तो यह स्वचालित रूप से जावा स्रोत फ़ाइल में दिखाई देता है।

replace लक्ष्य के बारे में MAVEN बताओ के लिए:

<build> 
    ... 
    <pluginManagement> 
     <plugins> 
      <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.--> 
      <plugin> 
       <groupId>org.eclipse.m2e</groupId> 
       <artifactId>lifecycle-mapping</artifactId> 
       <version>1.0.0</version> 
       <configuration> 
        <lifecycleMappingMetadata> 
         <pluginExecutions> 
          <pluginExecution> 
           <pluginExecutionFilter> 
            <groupId> 
             com.google.code.maven-replacer-plugin 
            </groupId> 
            <artifactId> 
             replacer 
            </artifactId> 
            <versionRange> 
             [1.5.3,) 
            </versionRange> 
            <goals> 
             <goal>replace</goal> 
            </goals> 
           </pluginExecutionFilter> 
           <action> 
            <execute /> 
            <runOnIncremental>true</runOnIncremental> 
           </action> 
          </pluginExecution> 
         </pluginExecutions> 
        </lifecycleMappingMetadata> 
       </configuration> 
      </plugin> 
     </plugins> 
    </pluginManagement> 
    ... 
</build> 

MAVEN बताओ करने के लिए वर्तमान नाम और संस्करण में भरने के:

(यदि आप चाहें, basedir में पूर्ण उप पथ रख दिया और हटाने शामिल फ़ाइल नाम से **/)

<build> 
    ... 
    <plugins> 
     <plugin> 
      <groupId>com.google.code.maven-replacer-plugin</groupId> 
      <artifactId>replacer</artifactId> 
      <version>1.5.3</version> 
      <executions> 
       <execution> 
        <id>replace-version-number</id> 
        <phase>generate-sources</phase> 
        <goals> 
         <goal>replace</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <basedir>${project.basedir}/src/main/java</basedir> 
       <includes> 
        <include>**/Constants.java</include> 
       </includes> 
       <preserveDir>true</preserveDir> 
       <replacements> 
        <replacement> 
         <token>mavenProjectName = ".*"</token> 
         <value>mavenProjectName = "${project.name}"</value> 
        </replacement> 
        <replacement> 
         <token>mavenProjectVersion = ".*"</token> 
         <value>mavenProjectVersion = "${project.version}"</value> 
        </replacement> 
       </replacements> 
      </configuration> 
     </plugin> 
     .... 
    </plugins> 
    ... 
</build> 
Constants.java में

:।

012,
... 
private static final String mavenProjectName = ""; 
private static final String mavenProjectVersion = ""; 
... 

संकलन चरण से पहले generate_sources चरण में मूल्यों को पीओएम के मूल्यों से भर दिया जाता है।

प्रतिकृति के टोकन में वाइल्डकार्ड .* का अर्थ है कि मान अपडेट किया गया है भले ही आप एक अद्यतन प्रति को स्रोत नियंत्रण में जांचें।