2016-01-28 7 views
7

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

मेरा प्रश्न: (क्यों) यह एक बग या सुविधा है?

समस्या Gradle 2.9 और 2.10 और निम्न न्यूनतम सेटअप के साथ reproduced किया जा सकता है:

// settings.gradle 
include ':A', ':B' 
// build.gradle 
allprojects { 
    apply plugin: 'java' 
    apply plugin: 'maven' 

    repositories { 
     mavenLocal() 
     mavenCentral() 
    } 
} 

project(':A') { 
    dependencies { 
     compile project(':B') 
    } 
} 

project(':B') { 
    dependencies { 
     runtime "org.slf4j:slf4j-log4j12:1.7.13" 
    } 
} 

आप देख सकते हैं, एक Gradle :A:dependencies से पता चलता

[...] 

compile - Compile classpath for source set 'main'. 
\--- project :B 
    \--- org.slf4j:slf4j-log4j12:1.7.13 
      +--- org.slf4j:slf4j-api:1.7.13 
      \--- log4j:log4j:1.2.17 
[...] 

और का उपयोग कर log4j परियोजना ए में रहने वाले जावा कोड में पूरी तरह से संभव है

+0

इस माइकल से पूछने के लिए धन्यवाद। इस मामले में गहराई का व्यवहार पूरी तरह से counterintuitive है :-( – Peti

उत्तर

5

देखें this क्यू & ए आप एक विन्यास निर्दिष्ट नहीं करते हैं, Gradle default विन्यास जो runtime तक फैली हुई है का चयन करेंगे। एक त्वरित फिक्स

compile project(path: ":B", configuration: "compile") 
+0

'डिफ़ॉल्ट' विन्यास 'रनटाइम' से फैला है जिसका अर्थ है कि, क्यू एंड ए पर स्पष्टीकरण के अनुसार, "इसमें 'रनटाइम' कॉन्फ़िगरेशन की सभी निर्भरताओं और कलाकृतियों को शामिल किया गया है , और संभवतः अधिक "परियोजना की निर्भरता।": बी "। क्रम विन्यास में हैं' runtime' यह अभी भी स्पष्ट नहीं होता क्यों निर्भरता 'slf4j-api' परियोजना में' compile' रूप में दिखाई देता ": ए '। – dmoebius

+1

'संकलन प्रोजेक्ट (': बी ')' विधि प्रोजेक्ट बी से 'डिफ़ॉल्ट' कॉन्फ़िगरेशन लेती है और इसे प्रोजेक्ट ए की 'कंपाइल' कॉन्फ़िगरेशन में जोड़ती है। इसलिए यह तर्कसंगत है कि बी की 'रनटाइम' निर्भरता ए के 'कंपाइल' में जोड़ दी जाती है। निर्भरता –

+2

मैं @dmoebius के साथ इस ऑफ़लाइन चर्चा की, और जब तक इस सवाल का जवाब पूरी तरह से सही और उपयोगी है, एक निम्न बातों का ध्यान रखना चाहिए: 'compile' विन्यास को निर्दिष्ट करना स्पष्ट रूप से वास्तव में अपनी परियोजनाओं संकलन ग कर पाएगा लसपाथ को ट्रांजिटिव रनटाइम निर्भरताओं के साथ 'प्रदूषित' होने से, लेकिन आपकी परियोजनाओं * रनटाइम * क्लासपाथ अब भी इन ट्रांजिटिव रनटाइम निर्भरताओं को याद कर रही है। तो आप या तो 'default'configuration इस्तेमाल किया जा रहा के साथ रह सकते हैं या आप' runtime'to runtime' मानचित्रण के लिए 'एक दूसरे निर्भरता जोड़ने के लिए:' क्रम परियोजना (पथ: ": बी", विन्यास: "क्रम") ' –

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