2009-04-20 9 views
24

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

इस काम को करने के लिए दूसरों के लिए कौन सी तंत्र का उपयोग किया जाता है? क्या कोई बॉक्स संस्करण संख्या लाइब्रेरी या चींटी से संबंधित टूल्स का सेट है जिसे मैं अपनी बिल्ड प्रक्रिया में बस छोड़ सकता हूं?

मैं तैनाती विकल्पों की तलाश नहीं कर रहा हूं या फिर भी अपडेट या उसके जैसे कुछ भी जांचने के लिए। मैं बस एक परीक्षक से पूछने में सक्षम होना चाहता हूं कि बॉक्स में कौन सा संस्करण है और एक विश्वसनीय उत्तर प्राप्त करें।

उत्तर

25

मैं यह पोस्ट करके इस पोस्ट को शुरू कर दूंगा कि मैं Apache Maven का निर्माण करने के लिए उपयोग करता हूं। आप चींटी या किसी अन्य उपकरण के साथ भी इसी तरह की चीज कर सकते हैं, लेकिन यह मैंने मैवेन का उपयोग करके किया है।

इसे संभालने का सबसे अच्छा तरीका यह है कि आप अपने प्रोजेक्ट के संस्करण और बिल्ड नंबर के रूप में उपवर्तन संशोधन का उपयोग करें। मेवेन से आप निम्नलिखित शामिल कर सकते हैं। यह आपको subversion संशोधन संख्या $ {scm.revision} के रूप में देगा।

<build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-scm-plugin</artifactId> 
     <executions> 
      <execution> 
      <id>getting-scm.revision</id> 
      <phase>validate</phase> 
      <goals> 
       <goal>update</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 

तब आपके बाद, मैं इसे कार्यान्वयन संस्करण के रूप में जार फ़ाइल मैनिफेस्ट के हिस्से के रूप में उपयोग करता हूं।

<plugin> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.1</version> 
    <configuration> 
     <archive> 
     <manifestEntries> 
      <Implementation-Version>${this.version}.${scm.revision}</Implementation-Version> 
     </manifestEntries> 
     </archive> 
    </configuration> 
    </plugin> 

इस बारे में अच्छी बात यह है कि आप का उपयोग करके कोड से उपयोग कर सकते हैं वह यह है कि निम्नलिखित:

Package p = getClass().getPackage(); 
String version = p.getImplementationVersion(); 

है कि आप की तरह "1.0.13525" पिछले संख्या है, जहां पूर्ण निर्माण संख्या देता है उपवर्तन संशोधन। इसे स्थापित करने के बारे में अधिक जानकारी के लिए आप पूर्ण blog post देख सकते हैं मैंने इस मुद्दे पर थोड़ी देर पहले किया था।

+1

अच्छा जवाब है। धन्यवाद। – toolkit

+0

बढ़िया! क्या यह चींटी का उपयोग करके भी किया जा सकता है? (क्षमा करें, जावा दुनिया में n00b) – Upendra

+2

p.getImplementationVersion(); अशक्त हर मैं इसे कहते हैं – jonney

2

आप इसे बहुत जटिल बना रहे हैं। एसवीएन संस्करण संख्या को मैक्रो के रूप में प्रदान करता है, जैसे सीवीएस।

एक निरंतर युक्त एक सरल inverface बनाएँ, और SVN का दृष्टांत एक मैक्रो के माध्यम से कि,

public interface IVersionNumber { 
    public static final String version = "$Id$" ; 
} 

आप उस फ़ाइल पर कीवर्ड का उपयोग कर SVN बताने की आवश्यकता की तरह,

$ SVN के रूप में है propset SVN: कीवर्ड "आईडी" IVersion.java

आप गुण here के बारे में पढ़ सकते हैं।

+0

हालांकि यह सिर्फ एक फ़ाइल से नहीं हो सकता है। एसवीएन उस फ़ाइल के लिए अंतिम संशोधन संख्या प्राप्त करने के लिए एक मैक्रो प्रदान करता है। मेरा लक्ष्य हर बार जब मैं प्रतिबद्ध करता हूं तो उस फ़ाइल को छूना नहीं है। –

+0

मुझे इच्छित मूल्य प्राप्त करने के लिए svnrevision को कॉल करना होगा। क्रूज़ कंट्रोल से यह कॉल होना बेहतर होगा। –

+2

नहीं, कीवर्ड प्रतिस्थापन स्थापित करना वही है जो आप चाहते हैं। आपको फ़ाइल को छूने की ज़रूरत नहीं है; एसवीएन इसे संभालती है। और याद रखें कि चूंकि एसवीएन परमाणु संशोधन का उपयोग करता है क्योंकि संस्करण संख्या * सभी * फ़ाइलों के लिए समान है। –

7

बिल्ड स्क्रिप्ट संस्करण धारण करने वाली एक संपत्ति फ़ाइल बनाते हैं। सीधे एसवीएन से संशोधन # को पकड़ना अच्छा विचार है। इस तरह आप इसे परीक्षणों में देख सकते हैं। इस संपत्ति फ़ाइल को पैक किए गए जार में रखें और इसे रन टाइम में पढ़ें। हमारे पास आमतौर पर प्रमुख और मामूली संस्करण होते हैं जो चींटी स्क्रैप के पैरामीटर के रूप में सेट होते हैं जबकि संशोधन स्वचालित रूप से एसवीएन द्वारा प्रबंधित किया जाता है और संदर्भों के लिए लगातार निर्माण संख्या देता है।

यह स्निपेट लक्ष्य svn कमांड लाइन चलाता है और एक temp फ़ाइल (svndump) में आउटपुट करता है। फिर xx.yy.zz स्ट्रिंग का निर्माण, इसे किसी अन्य फ़ाइल में रखें जिसे बाद में जार में शामिल किया जाएगा। ध्यान दें कि xx.yy बाहरी पैरामीटर से लिया जाता है, यह प्रमुख-मामूली संस्करण है।

<target name="getrev"> 
    <exec executable="svn" output="svndump"> 
     <arg value="info"/> 
     <arg value="${my.svn.url}"/> 
    </exec> 

    <property file="svndump"/> 
    <property name="my.build" value="${Revision}"/> 
    <property name="my.rev" value="${my.ver}.${my.build}"/> 
    <echo message="current revision is ${my.rev}"/> 

    <property name="my.dir.dist" value="${my.dir.root}/dist/${my.rev}"/> 
    <echo message="${my.rev}" file="${my.dir.projects}/revision"/> 

    <delete file="svndump"/> 
</target> 
+0

+1। मैं भी यह करता हूँ। – Damo

+0

एसवीएन-एंट नामक एक प्रोजेक्ट है जो आपके लिए निष्पादन सामग्री कर सकता है। –

+0

हां, svn-ant भी करेगा .. हालांकि मुझे याद है जब मैंने कोशिश की, निर्भरताओं के साथ कुछ मुद्दे थे।शायद अब यह अधिक परिपक्व है, कोशिश करने लायक है। – Dima

3

Maven के साथ मैं buildnumber-maven-plugin जो सबवर्सन से संशोधन संख्या हो जाता है या एक दृश्य या एक टाइमस्टैम्प, है जो फिर एक ${buildNumber} प्लेसहोल्डर जहां कभी आप की तरह बदलने के लिए प्रयोग किया जाता है का उपयोग करता है का उपयोग किया है। मुझे लगता है कि अन्य निर्माण उपकरण और निरंतर एकीकरण सर्वर में समान विशेषताएं हैं। अपने पसंदीदा खोज इंजन को "< अपने टूल> बिल्ड नंबर" के साथ खोजें।

1

हमने लंबे समय तक JReleaseInfo का उपयोग किया है। आप इसे अपनी एंट स्क्रिप्ट में सेट कर सकते हैं (हम अपनी परियोजनाओं के लिए मेवेन का उपयोग नहीं करते हैं) और यह स्वचालित रूप से संस्करण संख्या को टक्कर देता है। इसमें कुछ अच्छे जोड़ भी हैं जिनमें यह सभी वर्ग वाली कक्षा उत्पन्न करता है। आप उस कोड को अपने कोड के भीतर कॉल करने के लिए तैयार कर सकते हैं ताकि कमांड लाइन से क्लास को कॉल करने के लिए तैयार किया जा सके या इसे कोड नंबर को मुद्रित करने के लिए बिना किसी कोड को बदलने की आवश्यकता हो।

0

चूंकि मैं सब कुछ बनाने के लिए cruise control और Ant का उपयोग कर रहा हूं, इसलिए परियोजना के निर्माण के लिए एंटी कॉल में ${label} संपत्ति का उपयोग करके मैं कम से कम समाप्त हुआ। मेरी चींटी फ़ाइल में, मैं उस फ़ाइल को शामिल करने के लिए Application.version नामक बॉक्स बॉक्स संसाधन वाले गुण फ़ाइल को बदलने के लिए Ant "replace" task का उपयोग करता हूं।

मैं label incrementer से svn label incrementer पर बदलने की योजना बना रहा हूं और फिर उस तरह से svn संशोधन संख्या का उपयोग कर रहा हूं। यह सिर्फ थोड़ा और काम है और इसके लिए यह आवश्यक है कि मैं क्रूज़ कंट्रोल कॉन्फ़िगरेशन फ़ाइल में बदलाव करता हूं।

संबंधित मुद्दे

 संबंधित मुद्दे