2016-10-14 14 views
8

मैं निम्नलिखित संरचना के 3 परियोजनाएं हैं:अपाचे आइवी। सकर्मक पुनः प्राप्त नहीं निर्भरता

App 
| | 
    ... 
| | 
| +--lib 
| | | 
| | +--... 
| | 
| +--dist 
| 
Lib 
| | 
    ... 
| | 
| +--lib 
| | | 
| | +--sublib-1.0.jar 
| | 
| +--dist 
|  | 
|  +--lib-1.0.jar 
| 
SubLib 
    | 
    ... 
    | 
    +--dist 
     | 
     +--sublib-1.0.jar 

निम्नलिखित रिश्ता नहीं है कौन सा:

App <-- Lib <-- SubLib 

मैं अपाचे आइवी लता उपयोग कर रहा हूँ App और Lib दोनों के लिए निर्भरता को पुनः प्राप्त करने। निर्भरता निम्नानुसार हैं: Lib की ivy.xml:

App की
<ivy-module version = "2.0"> 
    <info organisation = "com.test.lib" module = "lib"/> 
    <dependencies> 
     <dependency org = "com.test.sub.lib" name = "sublib" rev = "1.0" conf = "compile->default"/> 
    </dependencies> 
</ivy-module> 

ivy.xml:

<ivy-module version = "2.0"> 
    <info organisation = "com.test.app" module = "App"/> 
    <dependencies> 
     <dependency org = "com.test.lib" name = "lib" rev = "1.0" conf = "compile->default"/> 
    </dependencies> 
</ivy-module> 

ivysettings.xml:

<ivysettings> 
    <settings defaultResolver = "local"/>  
    <resolvers> 
     <filesystem name = "local"> 
      <artifact pattern = "${ivy.settings.dir}/SubLib/dist/[artifact]-[revision].[ext]"/> 
      <artifact pattern = "${ivy.settings.dir}/Lib/dist/[artifact]-[revision].[ext]"/> 
     </filesystem> 
    </resolvers>  
    <modules> 
     <module organisation = "com.test.ivytest" resolver = "local"/> 
    </modules> 
</ivysettings> 

अपेक्षित परिणाम:ivy:retrieve को क्रियान्वित करने के बाद, ख अन्य संगठनों के sublib-1.0.jar और lib-1.0.jarApp/lib

वास्तविक परिणाम में उपस्थित होने के लिए: केवल lib-1.0.jarApp/lib में मौजूद है। App के लिए उत्पन्न आईवी-रिपोर्ट में subliblib की निर्भरता होने का कोई उल्लेख नहीं है। निर्माण के दौरान चींटी + ivy लॉग में एक तरह का कुछ भी नहीं है।

नोट:lib-1.0.jar एक वसा-जार के रूप में नहीं बनाया जा रहा है।

इस कॉन्फ़िगरेशन में मुझे क्या याद आ रही है?


अद्यतन

मैं कुछ सोच किया है, और केवल निष्कर्ष मैं के साथ आया था कि इस समस्या वास्तव में गलत कॉन्फ़िगरेशन है। इस तथ्य के आधार पर, कि पारस्परिक निर्भरता को पुनर्प्राप्त नहीं किया गया है, हम सकारात्मक रूप से कह सकते हैं कि lib को हल करते समय आईवी के पास कोई जानकारी नहीं है। और यह समझ में आता है, क्योंकि Lib/dist फ़ोल्डर फ़ाइल सिस्टम में कहीं भी हो सकता है। पारस्परिक निर्भरता के बारे में जानकारी रखने का एकमात्र तरीका उस जार के करीब कहीं ivy.xml संबंधित होगा। जो नहीं है। [ivy:retrieve] local: no ivy file found for com.test.lib#lib;1.0: using default data लॉग में संदेश द्वारा इसकी पुष्टि की गई है। सूचना को संरक्षित करने का एकमात्र तरीका %user%/.ivy/cache में कैश डेटा है। वहां उत्पन्न [org]-[artifact]-[conf].xml फ़ाइलों में निर्भरता जानकारी होती है। इसलिए मैं इसके लिए सही तरीके से काम करने का अनुमान लगा रहा हूं, मुझे ऐप के रिज़ॉल्यूशन स्तर पर कैश का उपयोग करना होगा।

क्या इससे कोई समझ आती है या क्या मैं फिर से गलत हूं?

+0

आईवी: पुनर्प्राप्ति से पहले हल किया जाना चाहिए। आपको क्या त्रुटियां मिलती हैं? क्या "कॉन्फ़िगरेशन गायब" जैसी कुछ है? – cantSleepNow

+0

जो मैं समझने में सक्षम था वह यह है कि यह आवश्यक नहीं है। मैं लॉग में '[ivy: पुनर्प्राप्ति]' अनुभागों के लिए देखता हूं कि यह एक संकल्प करता है। मुझे कोई गलती नहीं है, यह सिर्फ संक्रमणीय जार निर्भरता गायब है। – HighPredator

+1

ठीक है (अद्यतन भाग भी पढ़ रहा है) कृपया आईवी कैश साफ़ कर सकते हैं और इसे फिर से चला सकते हैं। 'Lib' और' sublib' प्रकाशित करने के लिए आप जिस एंटी स्क्रिप्ट का उपयोग कर रहे हैं, उस प्रश्न को भी जोड़ें। – cantSleepNow

उत्तर

0

ठीक है, तो समस्या वास्तव में खराब कॉन्फ़िगरेशन और समझने की मेरी कमी थी। यहां विस्तृत विवरण दिया गया है कि इसे कैसे काम किया जाए। मैं शब्दावली के साथ वास्तव में अच्छा नहीं हूं, इसलिए मैंने यहां कुछ शब्दों का दुरुपयोग किया होगा। आइए प्रोजेक्ट कॉन्फ़िगरेशन देखें और क्या है।

SublibLibएक संकलन समय निर्भरता guava है कि के लिए एक क्रम निर्भरता होने जा रहा है।

SubLib 
    | `lib 
    |  `guava-19.0.jar 
    | 
    `dist 
    | `--sublib-1.0.jar 
    | 
    `src 
     `... 

तो, हम SubLib के ivy.xml में उपयुक्त विन्यास बनाने की जरूरत है:

<ivy-module version="2.0"> 
    <info organisation="com.test.sub.lib" module="sublib"/> 

    <configurations> 
     <conf name="runtime" visibility="public"/> 
    </configurations> 

    <dependencies> 
     <dependency org="com.google" name="guava" rev="19.0" conf="runtime->default"/> 
    </dependencies> 
</ivy-module> 

यहाँ, एक runtime विन्यास की घोषणा के द्वारा हम कहते हैं कि इस ivy.xml एक मॉड्यूल एक क्रम समय निर्भरता है कि वर्णन करता है। और चूंकि अमरूद की ऐसी कोई फ़ाइल नहीं है, इसलिए हम इसे डिफ़ॉल्ट रूप से वर्णित करते हैं। यहां बहुत मानक है। अब, दूसरों के लिए यह जानना कि sublib-1.0.jar वास्तव में guava-19.0.jar से निर्भरता है, हमें इसे एक भंडार में प्रकाशित करने की आवश्यकता है, ताकि ऐसी जानकारी जार के बगल में फ़ाइल ivy-[version].xml के रूप में मौजूद हो। मैंने build फ़ोल्डर में प्रकाशित करना चुना है। ऐसा करने के लिए, ivysettings.xml में एक रिज़ॉल्यूवर होना आवश्यक है जो प्रकाशन के लिए फ़ाइल पैटर्न से मिलान करने में मदद करता है और बाद में पुनर्प्राप्ति पर हम Lib से हल करेंगे।

<ivysettings> 
    <settings defaultResolver="filesystem-resolver"/> 

    <resolvers> 
     <filesystem name="sublib-resolver"> 
      <ivy pattern="${ivy.settings.dir}/SubLib/dist/repo/ivy-[revision].xml"/> 
      <artifact pattern="${ivy.settings.dir}/SubLib/dist/repo/[artifact]-[revision].[ext]"/> 
     </filesystem> 

     <filesystem name="filesystem-resolver"> 
      <artifact pattern="${ivy.settings.dir}/SubLib/lib/[artifact]-[revision].[ext]"/> 
     </filesystem> 
    </resolvers> 

    <modules> 
     <module name="sublib" organisation="com.test.sub.lib" resolver="sublib-resolver"/> 
    </modules> 
</ivysettings> 

sublib-resolver इसी ivy-[revision].xml निर्भरता और jar के स्थान के बारे में जानकारी है कि खोजने के लिए अनुमति देगा। जबकि filesystem-resolver हमारी guava निर्भरता पायेगा। अब Lib को

<target name="publish"> 
     <ivy:publish artifactspattern="${dist.dir}/[artifact]-[revision].[ext]" 
        resolver="sublib-resolver" 
        overwrite="true" 
        pubrevision="${revision}" 
     /> 
</target> 

: अब हम सिर्फ ant साथ sublib हमारे रिसोल्वर लागू द्वारा प्रकाशित करते हैं। लिब App के लिए एक संकलन समय निर्भरता होने जा रहा है और हम एक क्रम निर्भरता रूप ivy.xml में इस तरह के रूप में वर्णन और घोषित SubLib इसके लिए:

<ivy-module version="2.0"> 
    <info organisation="com.test.lib" module="lib"/> 

    <configurations> 
     <conf name="compile" visibility="public"/> 
     <conf name="runtime" extends="compile" visibility="public"/> 
    </configurations> 

    <dependencies> 
     <dependency org="com.test.sub.lib" name="sublib" rev="2.0" conf="runtime->compile"/> 
    </dependencies> 
</ivy-module> 

यहाँ जहां विन्यास खेलने में आता है और क्या मैं पहले समझ में नहीं आया। runtime->compile बाएं हाथ की तरफ समझ में आता है: sublib को रनटाइम निर्भरता के रूप में घोषित किया गया था और हमने इसे runtime को अपनी आईवी फ़ाइल में कनवर्ट किया था। तीर के दाईं ओर हम कहते हैं कि हम sublib की संकलन-समय निर्भरता भी चाहते हैं। और जिस तरह से कॉन्फ़िगर किया गया था वह guava है। यह संकल्पकर्ता द्वारा पाया जाएगा और साथ ही पुनर्प्राप्त किया जाएगा। तो, हम के रूप में अच्छी Lib के लिए एक समाधानकर्ता आवश्यकता है, तो पूरा ivysettings.xml फ़ाइल इस तरह दिखेगा:

<ivysettings> 
    <properties file="${ivy.settings.dir}/ivysettings.properties"/> 

    <settings defaultResolver="filesystem-resolver"/> 

    <resolvers> 
     <filesystem name="sublib-resolver"> 
      <ivy pattern="${ivy.settings.dir}/SubLib/dist/repo/ivy-[revision].xml"/> 
      <artifact pattern="${ivy.settings.dir}/SubLib/dist/repo/[artifact]-[revision].[ext]"/> 
     </filesystem> 

     <filesystem name="lib-resolver"> 
      <ivy pattern="${ivy.settings.dir}/Lib/dist/repo/ivy-[revision].xml"/> 
      <artifact pattern="${ivy.settings.dir}/Lib/dist/repo/[artifact]-[revision].[ext]"/> 
     </filesystem> 

     <filesystem name="filesystem-resolver"> 
      <artifact pattern="${ivy.settings.dir}/SubLib/lib/[artifact]-[revision].[ext]"/> 
     </filesystem> 
    </resolvers> 

    <modules> 
     <module name="sublib" organisation="com.test.sub.lib" resolver="sublib-resolver"/> 
     <module name="lib" organisation="com.test.lib" resolver="lib-resolver"/> 
    </modules> 
</ivysettings> 

और में Lib की प्रकाशित Lib के build.xml:

<target name="publish"> 
     <ivy:publish artifactspattern="${dist.dir}/[artifact]-[revision].[ext]" 
        resolver="lib-resolver" 
        overwrite="true" 
        pubrevision="${revision}" 
     /> 
</target> 

अब मुख्य समस्या के लिए: पारगमन पुनर्प्राप्ति। विन्यास। App के ivy.xml में हमें बिल्कुल निर्दिष्ट करने की आवश्यकता है कि हम पारस्परिक निर्भरता चाहते हैं। रिपोज़ में संग्रहीत जानकारी जो पर्याप्त है वह पर्याप्त नहीं है।एक यह App के ivy.xml में उल्लेख करना होगा:

<configurations> 
    <conf name="compile" visibility="public"/> 
</configurations> 

<dependencies> 
    <dependency org="com.test.lib" name="lib" rev="1.0" conf="compile->compile; compile->runtime"/> 
</dependencies> 

यहां होता निम्नलिखित है: compile conf की घोषणा के द्वारा हम राज्य App एक संकलन विन्यास है। पहले तीर श्रृंखला, जैसा कि पहले है, बताती है कि हम (संकलित-कॉन्फ़िगर किए गए मॉड्यूल App) lib नामक संकलन-कॉन्फ़िगर किया गया निर्भरता प्राप्त करना चाहते हैं। क्रमशः बाएं और दाएं तीर पक्ष। और दूसरा तीर सेट बताता है कि हम (संकलित-कॉन्फ़िगर किए गए मॉड्यूल App) lib की रनटाइम-कॉन्फ़िगर की निर्भरता प्राप्त करना चाहते हैं! sublib कौन सा है। और चूंकि यह guava के साथ आता है, यह भी पुनर्प्राप्त किया जाता है।


एक छोटी सी गन्दा व्याख्या है, और बहुत एक solutioin के लिए सबसे सुंदर एक नहीं हो सकता है, लेकिन यह एक ही तरीका है मैं ठीक से सब पर इस काम करने में कामयाब रहे है। यदि कोई ऐसा करने के किसी भी बेहतर तरीके से जानता है, तो किसी भी मदद की सराहना की जाएगी।

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