2010-11-11 11 views
5

हमें उस स्थान पर एक समस्या है जिसे मैं अपने कोड में एकाधिक परियोजनाओं के संदर्भ में काम करता हूं। असल में, हमारे पास एक उत्पाद है, जिसे मैं लेविथन कहूंगा। इस परियोजना में कई अन्य संस्करण हैं, जिनमें से प्रत्येक हम ग्रहण में अलग परियोजनाओं के रूप में बनाए रखते हैं। डेवलपर्स के रूप में, हमारे पास आमतौर पर ग्रहण में कई परियोजनाएं (एकाधिक संस्करण) खुली होती हैं, क्योंकि हमें पुराने संस्करणों के साथ हेल्पलाइन कॉल मिलती है (साथ ही साथ कई संस्करणों को विकसित करना)।ग्रहण हेलीओस के भीतर किसी अन्य प्रोजेक्ट में पुस्तकालयों का संदर्भ कैसे दे सकता हूं?

हमारे पास टेस्ट कोड भी है, जो लेविथन के प्रत्येक वितरण के लिए एक अलग परियोजना में है। मैं अपनी परियोजनाओं का नाम Leviathan_<branch name> नाम देता हूं। तो, उदाहरण के लिए, मेरी ग्रहण कार्यक्षेत्र में, मैं जैसी परियोजनाओं हो सकता है:

 
Leviathan_scott\ (my branch) 
Leviathan_9.2\ 
Leviathan_9.3\ 
Leviathan_10.0\ 
Leviathan_10.1\ 
Test_scott\ 
Test_10.0 

मेरे शाखा हमारे ट्रंक की एक प्रति है, इसलिए हम चाहते हैं कि सबसे अधिक सक्रिय विकास लाइन पर विचार कर सकते हैं।

समस्या यह है कि हम अपने परीक्षण कोड में Leviathan \ lib में कुछ पुस्तकालयों का संदर्भ देते हैं। प्रत्येक डेवलपर अपनी परियोजनाओं को थोड़ा अलग तरीके से नाम दे सकता है। तो, परीक्षण परियोजना के विकास में। क्लासपाथ, हम प्रोजेक्ट लेविथन \ (कोई जोड़ नहीं) का संदर्भ देते हैं। की तरह इस परियोजना के लिए classpath (जो हमारे स्रोत नियंत्रण प्रणाली में चेक किया गया है) दिख सकता है:

<?xml version="1.0" encoding="UTF-8"?> 
<classpath> 
    <classpathentry excluding="**/*.MySCMServerInfo" kind="src" path="src"/> 
    <classpathentry kind="lib" path="lib/abbot-1.0.2/abbot.jar"/> 
    <classpathentry kind="lib" path="lib/abbot-1.0.2/costello.jar"/> 
    <classpathentry kind="lib" path="lib/dbunit-2.4.8/dbunit-2.4.8.jar"/> 
    <classpathentry kind="lib" path="lib/easymock-3.0/easymock-3.0.jar" sourcepath="lib/easymock-3.0/easymock-3.0-sources.jar"> 
     <attributes> 
      <attribute name="javadoc_location" value="jar:platform:/resource/Test/lib/easymock-3.0/easymock-3.0-javadoc.jar!/"/> 
     </attributes> 
    </classpathentry> 
    <classpathentry kind="lib" path="lib/objenesis-1.2/objenesis-1.2.jar"/> 
    <classpathentry kind="lib" path="lib/privilegedAccessor-1.0.2/privilegedAccessor_1.0.2.jar"/> 
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-core/unitils-core-3.1.jar" sourcepath="lib/unitils-3.1/unitils-core/src"/> 
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-database/unitils-database-3.1.jar"/> 
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-dbmaintainer/unitils-dbmaintainer-3.1.jar"/> 
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-dbunit/unitils-dbunit-3.1.jar" sourcepath="lib/unitils-3.1/unitils-dbunit/src"/> 
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-inject/unitils-inject-3.1.jar"/> 
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-mock/unitils-mock-3.1.jar" sourcepath="lib/unitils-3.1/unitils-mock/src"/> 
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-orm/unitils-orm-3.1.jar"/> 
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-spring/unitils-spring-3.1.jar" sourcepath="lib/unitils-3.1/unitils-spring/src"/> 
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-testng/unitils-testng-3.1.jar" sourcepath="lib/unitils-3.1/unitils-testng/src"/> 
    <classpathentry kind="lib" path="data"/> 
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> 
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-core/lib/ognl-2.6.9.jar"/> 
    <classpathentry kind="lib" path="lib/testng-5.14.1/testng-5.14.1.jar" sourcepath="lib/testng-5.14.1/testng-5.14.1-src.zip"/> 
    <classpathentry combineaccessrules="false" kind="src" path="/Leviathan"/> 
    <classpathentry kind="lib" path="/Leviathan/lib/slf4j-api-1.6.1.jar"/> 
    <classpathentry kind="lib" path="/Leviathan/lib/hibernate3.jar" sourcepath="/Leviathan/lib/src/hibernate-3.6.0-src.zip"/> 
    <classpathentry kind="output" path="classes"/> 
</classpath> 

एक डेवलपर उसकी/उसके व्यक्तिगत ग्रहण कार्यक्षेत्र में टेस्ट परियोजना लोड करता है, वह/वह परियोजना से जोड़ने के लिए की आवश्यकता होगी वरीयता प्राप्त करने के लिए मूल लेविथन परियोजना के लिए-> जावा बिल्ड पथ-> प्रोजेक्ट्स और लेविथन_स्कॉट परियोजना जोड़ें।

बात यह है कि, यह निश्चित रूप से <classpathentry ... > प्रविष्टियों में से कोई भी नहीं बदलता है जो "लेविथन \ lib" का संदर्भ देता है।/बदलें

  1. बदलें एक पाठ संपादक को खोजने का उपयोग कर मेरी .classpath में Leviathan_<branch name> को Leviathan से संदर्भ के सभी: तो, हम दो चीजों में से एक क्या करना है।
  2. जावा बिल्डिंग पथ में लेविथन * .jar के सभी संदर्भों को हटाएं और लेविथन_स्कॉट * .jar में जार फिर से जोड़ें।

इन के साथ समस्या यह है कि यह हर बार .classpath बदल गया है, बनाता है जो इन दोनों के आदर्श से कम लग रहे हैं किया जाना चाहिए है। हमारा क्लासपाथ सुपर-नियमित रूप से नहीं बदला जाता है, लेकिन मैं कहूंगा कि यह हर दो सप्ताह में एक या दो बार बदल जाता है। मैं अपनी परियोजना को जोड़ने में सक्षम होना चाहता हूं और इन परियोजनाओं को जोड़ने के लिए केवल एक ही कदम करना है।

ऐसा लगता है कि हम एक्लिप्स के भीतर एक पर्यावरण परिवर्तक स्थापित कर सकते हैं और इसे .classpath प्रविष्टियों में जोड़ सकते हैं। लेकिन, अब हमें एक समस्या है क्योंकि अगर हमारे पास हमारे कार्यक्षेत्र में कई टेस्ट प्रोजेक्ट हैं जो हम संकलित करना चाहते हैं, तो यह काम नहीं करेगा। दोनों परीक्षण परियोजनाओं '.classpath प्रविष्टियों में एक ही पर्यावरण चर का उल्लेख किया जाएगा, जो निश्चित रूप से केवल एक सुपर परियोजना स्थान को इंगित कर सकता है।

ऐसा लगता है कि मुझे ऐसा करने में सक्षम होना चाहिए, लेकिन मुझे नहीं पता कि ग्रहण में इसे कैसे पूरा किया जाए। किसी भी विचार की बहुत सराहना की जाएगी।

~ स्कॉट

+0

अपाचे मैवेन इस तरह की समस्याओं को एक आकर्षण की तरह बताता है। –

+0

सहमत हुए, लेकिन 20 डेवलपर्स को एक नई बिल्ड सिस्टम पर स्विच करना मुश्किल है ... अगर हमें * बिल्कुल * करना है, तो मैं इसके लिए मामला बनाने में सक्षम हो सकता हूं, लेकिन यदि इसके बिना ऐसा करना संभव है, तो मैं इसे इस तरह से पूरा करना पसंद है। – jwir3

उत्तर

2

ग्रहण के 'क्लासपाथ वैरिएबल' का उपयोग करने का प्रयास करें।

Window->Preferences->Java->Build Path->Classpath Variables 

"Leviathan_under_test" की तरह एक या अधिक चरों को परिभाषित करना और संस्करण आप परीक्षण करना चाहते करने के लिए यह इशारा करते हैं। फिर, प्रोजेक्ट बिल्ड पथ में, वैरिएबल को शामिल करने के लिए लाइब्रेरी संदर्भ बदलें।

जब आप लेविथन के संस्करण को बदलते हैं तो आप परीक्षण करना चाहते हैं, तो आप चर बदलते हैं और जाते हैं। यदि आपको करना है, तो आपके पास संस्करणों के लिए कई चर भी हो सकते हैं, यानी "LEVIATHAN_LATEST", या "LEVIATHAN_PROBLEM_CHILD", आदि

+0

काम करेगा, ठीक है, मेरा मतलब यह था कि जब मैंने पर्यावरण चर के बारे में बात की थी। तो, यहां समस्या यह है कि मुझे अभी भी बिल्ड पथ को बदलने की जरूरत है - उदाहरण के लिए, मैं Test_10.0 और Test_scott डाउनलोड करना चाहता था, और उन्हें एक ही कार्यक्षेत्र में संकलित करना है, मुझे चर में परिवर्तन करना होगा दो टेस्ट परियोजनाओं में से कम से कम एक में .classpath फ़ाइल। आदर्श रूप में, हम इससे बचना चाहते हैं, क्योंकि इस समय हमारे पास वास्तव में कोई भी बेहतर नहीं है - लेविथन को लेविथनथनस्कॉट या कुछ ऐसा ही बदलना है। – jwir3

+0

असल में, एक बार चर .classpath फ़ाइल में है, तो आप इसे बदल नहीं सकते हैं; उदाहरण के लिए कम से कम $ LEVIATHAN के मामले में। बिल्ड आपके वर्कस्पेस में सेट किए गए क्लासपाथ वैरिएबल वैल्यू के साथ काम करता है। आप इसे अपने प्रोजेक्ट में फ़ाइलों को संपादित किए बिना किसी भिन्न लक्ष्य पर इंगित कर सकते हैं। –

+0

ठीक है, बिल्कुल नहीं। मैं अपने कार्यक्षेत्र में Leviathan_10.0, Leviathan_scott, और Leviathan_test_scott की समस्या को हल कैसे करूं, सभी एक ही समय में खुले हैं, और मैं Leviathan_test_scott Leviathan_scott और Leviathan_test_10 को Leviathan_10.0 पर इंगित करने के लिए इंगित करना चाहता हूं? – jwir3

2

यह एक निर्भरता प्रबंधन मुद्दा है और वहाँ वास्तविक मानक उपकरण में मदद करने के बहुत सारे है! मैं दृढ़ता से सुझाव देता हूं कि ANTIvy's निर्भरता प्रबंधन के साथ उपयोग करें या Maven (या किसी भी otehr निर्माण उपकरण जिसमें निर्भरता प्रबंधन है) का उपयोग करें।

उनमें से किसी एक के साथ मैं Nexus या आर्टिफैक्टरी जैसे आर्टिफैक्ट रिपोजिटरी मैनेजर का उपयोग करता हूं, इसलिए आपके आंतरिक रूप से निर्मित कलाकृतियों के लिए आपके पास एक वास्तविक स्रोत है।

इस तरह आप लाइब्रेरी के कैनोलिक संस्करण को हमेशा प्राप्त करेंगे, जब आप चाहें।

1

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

+0

एचएम ... यह आशाजनक लग रहा है। तो, आप एक परीक्षण परियोजना के भीतर अलग-अलग पुस्तकालयों को अलग-अलग आयात करने के बजाय कह रहे हैं, उन्हें मूल लेविथन परियोजना के भीतर से निर्यात करें, तो मुझे केवल टेस्ट प्रोजेक्ट में लेविथन परियोजना आयात करना है? – jwir3

+0

हां, यह – pbanfi

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

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