2009-04-15 14 views
6

ऐसा लगता है कि सटीक उसी स्रोत फ़ाइलों से एक जार या ज़िप बनाना हमेशा एक अलग फ़ाइल उत्पन्न करेगा। मैंने जावा जार कमांड और चींटी में जार और ज़िप कार्यों का उपयोग करके दोनों की कोशिश की।ज़िप/जार फ़ाइल में बाइनरी अंतर

ऐसा लगता है कि नए जार/ज़िपों में प्रत्येक संग्रहित फ़ाइल पर वर्तमान समय पर टाइमस्टैम्प सेट होता है।

क्या फाइल सिस्टम पर फ़ाइल पर टाइमस्टैम्प का उपयोग करने के लिए ज़िप उपकरण को मजबूर करने का कोई तरीका है यह सुनिश्चित करने के लिए कि सटीक उसी स्रोत से निर्मित एक जार बिल्कुल वही दिखाई देगा?

+0

यदि आप एक निर्धारक जेएआर (दोहराने योग्य SHA1 हस्ताक्षर) बनाने के लिए चरण-दर-चरण निर्देशों की तलाश में हैं तो यहां एक लेख है: http: //gary-rowe.com/agilestack/2013/08/08/how-to-create-a-deterministic-jar/ –

+0

जेएआर ज़िप से थोड़ा अलग प्रारूप है। जेएआर ज़िप पर आधारित है, लेकिन इसमें मैनिफेस्ट फाइलें और हस्ताक्षर शामिल हैं, जबकि ज़िप डो नहीं है। – jww

उत्तर

1

ठीक है, एक सहकर्मी और मैं एक समाधान के साथ आया जो हमारे लिए काम करता है।

  1. नई कलाकृतियों बिल्ड:

    इसके बजाय हमारे पूरे निर्माण प्रक्रिया पुनर्रचना किसी भी वर्ग या जार फ़ाइलें नष्ट नहीं करने की

    , हम इस प्रक्रिया का उपयोग करें।

  2. पिछले निर्माण से परिवर्तन की तुलना करने के लिए जार्डिफ़ (jnlp का हिस्सा) का उपयोग करें।
  3. यदि जेफिफ़ पैदा करने वाले diff जार में कोई बदलाव नहीं है, तो पिछले निर्माण से आर्टिफैक्ट प्राप्त करें।

हाँ, मुझे पता है कि यह kludgy लगता है, लेकिन यह निश्चित रूप से इसे ध्यान में रखने के लिए स्क्रिप्ट लेखन स्क्रिप्ट को धड़कता है। इसके अलावा, हम एक ताजा मशीन (सर्वर विफलता के मामले में) पर पूरी तरह से साफ निर्माण कर सकते हैं, और यह प्रक्रिया सुनिश्चित करेगी कि केवल वास्तव में अपडेट किए गए जार का उत्पादन किया जाए।

1

मुझे नहीं लगता कि ज़िप करने के लिए एक तरीका है, लेकिन आप निश्चित रूप से फाइल सिस्टम पर फाइलों पर टाइमस्टैम्प को एक ज्ञात तारीख (हथौड़ा के नीचे 'स्पर्श' कमांड का उपयोग करके - विंडोज़ के तहत क्या कर सकते हैं) आप जार बनाने से पहले।

+1

विंडोज पर टच यूटिल उपलब्ध हैं। लेकिन यह समस्या को हल नहीं करेगा, क्योंकि मैं इसे समझता हूं। सवाल यह कहता है कि ज़िप के भीतर प्रविष्टियां फ़ाइल के समय के बजाय वर्तमान समय प्राप्त करती हैं। टच इसे ठीक नहीं करेगा। – Cheeso

+0

नहीं, वास्तविक समस्या यह है कि यदि आप एक फ़ाइल को regen करते हैं - भले ही आप इसे एक ही सामग्री के साथ उत्पन्न करते हैं - यह अंतिम पुनर्जन्म का एक समय टाइमस्टैम्प प्राप्त करता है, इसलिए यदि आप उस फ़ाइल को ज़िप करते हैं, क्योंकि ज़िप एमआईटी स्टोर करता है, तो यह सामग्री अलग-अलग होंगी, भले ही सामग्री समान हों। – pjz

+0

चीसो सही है। यहां तक ​​कि सटीक एक ही स्रोत फाइलें लेना और दो बार एक जार बनाने से जार के अंदर टाइमस्टैम्प बदल जाएंगे। –

1

मुझे एक ही समस्या थी और, जैसा कि पीजेजे सुझाव देता है, मैंने इसे जार में जोड़ने से पहले फ़ाइलों को 'स्पर्श' करके हल किया (इसलिए, यह मेरे लिए काम करता है :-))। यदि आपको इसकी आवश्यकता है, तो आप विंडोज़ के लिए स्पर्श पा सकते हैं, या तो जीएनयू विंडोज यूटिलिटीज, कोर यूटिल्स: http://gnuwin32.sourceforge.net/packages/coreutils.htm में, लेकिन यह सिर्फ एक ही पैकेज के लिए एक बड़ा पैकेज है (हालांकि वहां कई अन्य उपयोगी सुविधाएं हैं जिन्हें आप पसंद कर सकते हैं), या वैकल्पिक रूप से , http://www.softpedia.com/progClean/Touch-for-Windows-Clean-41086.html जैसे कुछ डाउनलोड करें।

+0

मैंने पहले यह कोशिश की, दुख की बात है, यह काम नहीं करता है। चेसो की टिप्पणी ऊपर देखें। –

3

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

आप से इसे हल कर सकते हैं:
1. एक प्रकट न जोड़ें (यदि आपके चींटी का उपयोग कर आप जार के बजाय जिप उपयोग करना चाहिए)
2. प्रकट जोड़े की तरह आप सामान्य फ़ाइलें जोड़ें। (तो मैनिफेस्ट आपके फाइल सिस्टम पर एक फाइल है और यह फ्लाई पर नहीं बनाया गया है)

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