2011-01-27 14 views
18

मेरे पास एक ऐसा मामला है जहां मैं रनटाइम क्लासपाथ पर निर्भरता चाहता हूं लेकिन टेस्ट क्लासपाथ नहीं है। प्रश्न में निर्भरता लॉगबैक, एक एसएलएफ 4 जे कार्यान्वयन है। रनटाइम में, मैं चाहता हूं कि मेरा कोड (वैकल्पिक रूप से) लॉगबैक पर निर्भर करता है ताकि इसमें लॉगिंग इंफ्रास्ट्रक्चर उपलब्ध हो। परीक्षण समय पर, मैं लॉग आउटपुट को ब्लैक-होल करने के लिए slf4j-nop कार्यान्वयन का उपयोग करना चाहता हूं। एक परीक्षण निर्भरता के रूप में logback रनटाइम निर्भरता और slf4j-nop के साथ, मुझे अपने परीक्षण चलाने के दौरान SLF4J से एक से अधिक कार्यान्वयन चेतावनी मिलती है। मुझे टेस्ट क्लासपाथ से logback को बाहर करने का कोई तरीका नहीं दिख रहा है।रनटाइम क्लासपाथ पर मेवेन निर्भरता कैसे हो सकती है लेकिन टेस्ट क्लासपाथ नहीं?

यदि मैं टाला जा सकता हूं तो मैं अपने परीक्षणों को एक अलग पैकेज में विभाजित नहीं करना चाहता हूं।

विचार?

उत्तर

18

मुझे अंत में इसका असली समाधान मिला है। मेवेन सरेफायर प्लगइन के संस्करण 2.6 के बाद से, अब classpathDependencyExcludes कॉन्फ़िगरेशन तत्व है जो क्लासपाथ से विशिष्ट निर्भरताओं को बाहर करने की अनुमति देता है। इसलिए यह काम करता है:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.8</version> 
    <configuration> 
    <classpathDependencyExcludes> 
     <classpathDependencyExclude>ch.qos.logback:logback-classic</classpathDependencyExclude> 
    </classpathDependencyExcludes> 
    </configuration> 
</plugin> 
+0

धन्यवाद! आपने मुझे इस उत्तर के साथ अनुसंधान पर काफी समय बचाया। –

+1

धन्यवाद एक टन। दुख की बात है कि यह एक हैक की तरह लगता है ... इच्छा है कि हम एक "!" दायरे के क्षेत्र में ऑपरेटर। –

0

क्या यह slf4j-nop test-scoped निर्भरता से लॉगबैक पर निर्भरता बहिष्करण जोड़ने के लिए काम करेगा?

<dependency> 
    <groupId>foo</groupId> 
    <artifactId>slf4j-nop</artifactId> 
    <version>1.0</version> 
    <scope>test</scope> 
    <exclusions> 
    <exclusion> 
     <groupId>foo</groupId> 
     <artifactId>logback</artifactId> 
    </exclusion> 
    </exclusions> 
</dependency> 
+0

मैंने कोशिश की, लेकिन 'बहिष्कृत' केवल प्रश्न में पैकेज की पारगमन निर्भरताओं को शामिल नहीं करता है; दुर्भाग्य से, ऐसा लगता है कि इसका उपयोग अन्य कक्षाओं से प्रचारित मनमानी निर्भरताओं को बाहर करने के लिए नहीं किया जा सकता है। –

2

तो लॉग उत्पादन अक्षम करने आप क्या चाहते हैं, src/test/resources जो सभी उत्पादन को छोड़ देता है के लिए एक logback विन्यास फाइल को जोड़ने है की तरह।

यदि आपको उसी रिएक्टर निर्माण में एकाधिक मॉड्यूल के लिए ऐसा करने की आवश्यकता है, तो maven remote resources plugin का उपयोग करने पर विचार करें।

इस प्लग दूरदराज के खजाने से संसाधनों के जार पुनः प्राप्त करने के लिए किया जाता है, उन संसाधनों को संसाधित करता है, और उन्हें जार आप Maven के साथ निर्माण में शामिल। एक बहुत ही आम उपयोग-मामले को आपके संगठन में लगातार संसाधनों को कुछ तरीकों से पैकेज करने की आवश्यकता है।

+0

मुझे इसके साथ जाना पड़ सकता है; दुर्भाग्यवश, इसे और परियोजना पुनर्गठन की भी आवश्यकता होगी (यह एक बहु-मॉड्यूल प्रोजेक्ट है, इसलिए मुझे यह सुनिश्चित करना होगा कि कॉन्फ़िगरेशन फ़ाइल उन सभी में उपलब्ध है)। –

+0

@ माइकल: कृपया मेरा अपडेट देखें –

1

जहां तक ​​मुझे पता है कि आपको इसे टेस्ट क्लासपाथ से बाहर करने की आवश्यकता नहीं है। मेवेन को कक्षा में निर्भरताओं का क्रम रखना चाहिए। यदि आप निर्भरता में रनटाइम निर्भरता से पहले अपनी टेस्ट निर्भरता डालते हैं तो यह क्लासपाथ में भी पहले होना चाहिए और क्लासलोडर को पहले निर्भरता में कक्षाएं मिलनी चाहिए जब 2 निर्भरताओं में समान वर्ग होते हैं। तो slf4j फिर slf4j-nop की स्थिर बाध्यकारी पाएगा और लॉगबैक बाध्यकारी नहीं होगा।

+0

हां, हालांकि, एसएलएफ 4 जे फिर कई क्लासपाथों के बारे में चेतावनी प्रिंट करता है। मैं चेतावनी से बचने की कोशिश कर रहा हूं। –

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