में एकाधिक एसएलएफ 4 जे बाइंडिंग को हल करें यह एक प्रश्न है जो एसई साइटों पर similar questions के गुच्छा की तरह लगता है, इसलिए मुझे अपना प्रश्न स्पष्ट करने के लिए काफी वर्बोज़ होना चाहिए। तो, यहाँ परियोजना की न्यूनतम pom.xml
है:मेवेन प्रोजेक्ट
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>org.codehaus.gmaven.runtime</groupId>
<artifactId>gmaven-runtime-1.7</artifactId>
<version>1.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>org.shabunc.App</mainClass>
</configuration>
</plugin>
</plugins>
</build>
यहाँ निर्भरता पेड़ Maven द्वारा उत्पादित है।
mvn dependency:tree -Dverbose -Dincludes=org.slf4j
:
[INFO] [dependency:tree {execution: default-cli}]
[INFO] org.shabunc:logdebug:jar:1.0-SNAPSHOT
[INFO] \- ch.qos.logback:logback-classic:jar:1.0.6:compile
[INFO] \- org.slf4j:slf4j-api:jar:1.6.5:compile
अब, चलो बहिष्करण को निकाला और निर्भरता फिर से जाँच करें। हम प्राप्त करेंगे:
[INFO] org.shabunc:logdebug:jar:1.0-SNAPSHOT
[INFO] +- ch.qos.logback:logback-classic:jar:1.0.6:compile
[INFO] | \- org.slf4j:slf4j-api:jar:1.6.5:compile
[INFO] \- org.codehaus.gmaven.runtime:gmaven-runtime-1.7:jar:1.3:compile
[INFO] +- (org.slf4j:slf4j-api:jar:1.5.10:compile - omitted for conflict with 1.6.5)
[INFO] +- org.codehaus.gmaven.feature:gmaven-feature-support:jar:1.3:compile
[INFO] | \- (org.slf4j:slf4j-api:jar:1.5.10:compile - omitted for conflict with 1.6.5)
[INFO] \- org.codehaus.gmaven.runtime:gmaven-runtime-support:jar:1.3:compile
[INFO] +- (org.slf4j:slf4j-api:jar:1.5.10:compile - omitted for conflict with 1.6.5)
[INFO] \- org.sonatype.gshell:gshell-io:jar:2.0:compile
[INFO] \- org.sonatype.gossip:gossip:jar:1.0:compile
[INFO] \- (org.slf4j:slf4j-api:jar:1.5.8:compile - omitted for conflict with 1.6.5)
तो, जैसा कि हम देख सकते हैं, सब कुछ अपेक्षित काम करता है, और विरोधाभासी निर्भरता वास्तव में बाहर निकलती है। लेकिन बात यह है कि निर्भरता भी साथ बाहर रखा गया मैं अभी भी संदेश का अनुसरण करते हुए संकलन और mvn exec:java
बुला मिलता है:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/shabunc/.m2/repository/ch/qos/logback/logback-classic/1.0.6/logback-classic-1.0.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/shabunc/.m2/repository/org/sonatype/gossip/gossip/1.0/gossip-1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
सवाल यह है: क्यों मैं अभी भी यह चेतावनी दिखाई देती है और वास्तव में क्या केवल एक संस्करण बनाने के लिए किया जाना चाहिए निष्पादन के दौरान slf4j पहुंच योग्य?
कोई अपराध इरादा नहीं है लेकिन slf4j-api पर निर्भरता घोषित करता है और फिर slf4j-api को छोड़कर गलत है। निम्नलिखित कथन भी गलत है। "आइए सुनिश्चित करें कि slf4j-api वास्तव में केवल लोड हो गया है, जैसा कि हमने अपेक्षा की थी जब हमने बहिष्करण/बहिष्करण भाग को gmaven-runtime निर्भरता में जोड़ा है।" जब निर्भरताएं एक आर्टिफैक्ट के विभिन्न संस्करणों की घोषणा करते हैं, उदा। slf4j-api, maven वर्ग पथ पर slf4j-api कई बार नहीं रखेगा। यहां तक कि अगर मैवेन ने किया (जो यह नहीं करता है), slf4j-api कई बार लोड नहीं किया जाएगा। कृपया अपने प्रश्न को संपादित करें क्योंकि भविष्य के पाठकों को गुमराह न करें। – Ceki
सेकी, यह ठीक रहेगा भले ही यह अपराध होगा जो मुझे कुछ सिखाएगा)) तथ्य यह है कि slf4j-api कई बार लोड किया जाता है, इस प्रकार जब मैं टॉमकैट के लिए युद्ध के रूप में तैनात करने की कोशिश कर रहा हूं तो संघर्ष बना रहा हूं। एक slf4j logblack में है और एक gmaven-runtime की निर्भरता की निर्भरता में है। अगर मुझे कुछ याद आ रहा है, तो यह बहुत दयालु होगा यदि आप इसे स्पष्ट कर देंगे, क्योंकि यह निर्भरता हल करने की बात यह नहीं है कि मैं एक विशेषज्ञ हूं। – shabunc
यदि आप मेवेन का उपयोग कर रहे हैं तो आपके वर्ग पथ पर slf4j-api के विभिन्न संस्करण मौजूद होने का कोई जोखिम नहीं है। हालांकि, यह विभिन्न slf4j * बाइंडिंग * के लिए आम है, उदा। slf4j-jdj14.jar, slf4j-log4j.jar या logback-classic.jar कक्षा पथ पर एक साथ उपस्थित होने के लिए। आपके मामले में, आपके पास लॉगबैक-क्लासिक-1.0.6.jar गॉसिप-1.0.जर मौजूद है। टॉम एंडरसन ने पहले से ही 'गपशप' को छोड़कर एक अच्छा जवाब दिया है। – Ceki