2012-10-01 9 views
11

क्या कोई यह समझा सकता है कि जावा जावा स्रोत बाइनरी भिन्न वर्ग फ़ाइलों को संकलित कैसे कर सकते हैं?बाइनरी भिन्न वर्गों के लिए समान जावा स्रोत संकलित

प्रश्न निम्न स्थिति से उत्पन्न होती है:

हम एक काफी बड़े आवेदन (800 वर्ग) जो को बांटा गया है, तो पुनर्गठन ट्रंक में वापस reintegrated है। पुनर्संरचना से पहले, हमने ट्रंक को शाखा में विलय कर दिया, जो मानक प्रक्रिया है।

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

हम हम एक ही जावा स्रोत के साथ समाप्त हो गया, अंतिम परिणाम के मामले में ऐसा है, तो इससे कोई फर्क नहीं लगता है जाहिरा तौर पर विभिन्न वर्ग फ़ाइलों की प्रत्येक जोड़ी के लिए स्रोत decompiled है। लेकिन ऐसा क्यों है कि फाइलों में से कुछ अलग हैं?

धन्यवाद।


अतिरिक्त सोचा:

Maven/javac एक अलग क्रम में फ़ाइलों को संकलित करता है, तो उस अंतिम परिणाम को प्रभावित कर सकता है?

+1

विभिन्न जेडीके संस्करण? मुझे लगता है कि अनुकूलन विभिन्न संस्करणों के लिए अलग हो सकता है। – RNJ

+1

का उपयोग javap -c -v (धन्यवाद पीटर Lawrey) और परे की तुलना का उपयोग कर संबंधित outputs (महान उपकरण, इसे प्यार करता हूँ!) मैं स्टीफन सी (धन्यवाद स्टीफन सी) प्रतिक्रिया पर है कि आइटम 5 पुष्टि कर सकते हैं देखने के जवाब यहाँ का हिस्सा देता है। कई मामलों में, निरंतर पूल आदेश अलग है। हालांकि, मैं काफी यकीन है कि classpath दोनों के लिए समान है, लेकिन संकलन के आदेश अलग हो सकता है। – Vicki

उत्तर

5

यह मानते हुए कि JDKs और संकलन विकल्पों समान हैं, मैं 5 संभव मतभेद के स्रोतों के बारे में सोच सकते हैं:

  1. मुहर - हर वर्ग फ़ाइल संकलन timestamps शामिल हैं। जब तक आप एक ही समय में संकलन चलाते हैं, उसी फ़ाइल के विभिन्न संकलनों में अलग-अलग टाइमस्टैम्प होंगे।

  2. स्रोत फ़ाइल नाम पथ - प्रत्येक वर्ग फ़ाइल में स्रोत फ़ाइल का पथनाम शामिल है। यदि आप अलग-अलग पथनामों के साथ दो पेड़ों को संकलित करते हैं तो कक्षा फ़ाइलों में अलग-अलग स्रोत पथनाम होंगे।

  3. आयातित संकलन समय स्थिरांक की मान - जब एक वर्ग A एक संकलन समय निरंतर अन्य वर्ग B, निरंतर का मूल्य शामिल किया जाता है (एक "समय निरंतर संकलन" परिभाषा के लिए JLS देखें) में परिभाषित का उपयोग करता है A एस वर्ग फ़ाइल में। तो यदि आप B (स्थिरांक के लिए अलग-अलग मानों के साथ) के विभिन्न संस्करणों के विरुद्ध A संकलित करते हैं, तो A का कोड अलग होने की संभावना है।

  4. बाहरी कक्षाओं/विधियों के हस्ताक्षर में मतभेद; जैसे अगर आपने अपनी पीओएम फाइलों में से एक में निर्भरता संस्करण बदल दिया है।

  5. बिल्ड क्लासपाथ में मतभेदों के परिणामस्वरूप आयातित वर्ग पाए जाते हैं जिसके परिणामस्वरूप कक्षा फ़ाइल के कॉन्स्टेंट पूल में प्रविष्टियों के क्रम में गैर-महत्वपूर्ण अंतर हो सकते हैं।

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

ध्यान दें कि आप सामान्य रूप से एफएस निर्देशिकाओं की फ़ाइलें की वास्तविक आदेश नहीं दिख रहा है, क्योंकि ls और dir उपकरण की तरह उन्हें प्रदर्शित करने से पहले प्रविष्टियों छँटाई करने के लिए डिफ़ॉल्ट।


मुझे जोड़ना चाहिए कि मतभेदों के कारण की पहचान करने का पहला कदम यह है कि वे वास्तव में क्या काम कर रहे हैं। आपको संभवत: कठिन तरीके से करने के लिए (आवश्यक) की आवश्यकता है - क्लास फाइलों की एक जोड़ी को मैन्युअल रूप से डीकोड करके उन स्थानों की पहचान करने के लिए जहां वे वास्तव में अंतर करते हैं ... और अंतर वास्तव में क्या मतलब है।

+0

स्टीफन (यानी वहाँ संकलन करने से पहले मौजूदा कोई वर्ग फ़ाइलों थे), मैं नहीं देख सकते हैं 1,2 वस्तुओं और 3 और 4 मदों के लिए decompilation में सबूत यहां लागू नहीं होते (स्रोतों, poms सहित, याद एक जैसे हैं)। हालांकि, मुझे लगता है कि आइटम 5 संभव है क्योंकि अनुक्रम संकलक संकलन किसी भी मामले में भिन्न हो सकता है। – Vicki

+0

धन्यवाद स्टीफन। मुझे लगता है कि आइटम 5 और बाद में मेरे प्रश्न का उत्तर देता है। – Vicki

1

अलग JDK अलग द्विआधारी वर्गों (अनुकूलन, लेकिन यह भी वर्ग संस्करण संख्या) का उत्पादन। संकलन विकल्प भी हैं (एक जेडीके पुराने प्रारूप में संकलित हो सकता है, या यह डीबग जानकारी जोड़ सकता है)।

+0

मैं एक ही JDK और संकलन के लिए विकल्पों की पुष्टि करने, आदि संपादित किया है – Vicki

1

जावा के विभिन्न संस्करणों विभिन्न मेटा डेटा जो अक्सर एक decompiler द्वारा नजरअंदाज कर दिया है जोड़ सकते हैं।

मैं तुम्हें एक फ़ाइल में विवरण की अधिक के लिए javap -c -v उपयोग करने का प्रयास सुझाव देते हैं। यदि इससे मदद नहीं मिलती है तो आप ASMifierClassVisitor का उपयोग कर सकते हैं जो प्रत्येक बाइट को देखता है।

2

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

+0

मैं स्पष्ट किया जाना चाहिए था कि सभी फाइलों सूत्रों के दोनों सेट के लिए संकलित किया गया – Vicki

1

ही JDK भी आप कैसे संकलन के आधार पर विभिन्न उत्पादन हो सकता है। आप डीबग जानकारी के साथ या बिना संकलित कर सकते हैं, आप पुराने संस्करण में चलाने के लिए संकलित कर सकते हैं, प्रत्येक विकल्प के परिणामस्वरूप अन्य कक्षाएं होंगी।

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