2011-11-24 13 views
26

यह एक प्रश्न है जिसे पहले पूछा गया था, लेकिन दुर्भाग्य से कोई समाधान मेरे लिए काम नहीं करता है। मैं इस अपवाद (संक्षिप्त स्टैक ट्रेस के साथ) का सामना करना पड़ रहा हूँ:SLF4J NoSuchMethodError पर स्थान AwareLogger

java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V 
    at org.apache.commons.logging.impl.SLF4JLocationAwareLog.debug(SLF4JLocationAwareLog.java:133) 
    at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:221) 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:401) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) 

यह तब होता है जब एक कमांड लाइन Maven और भी उपयोग कर संकलन जब बिलाव को तैनाती। यह IntelliJ IDEA के अंदर ठीक काम करता है।

आमतौर पर मैं उम्मीद करता हूं कि यह एसएलएफ 4 जे लाइब्रेरी के कई संस्करणों के उपयोग में होगा। लेकिन Maven निर्भरता का पेड़ एक एकल संस्करण में सभी slf4j पुस्तकालयों पता चलता है:

..$ mvn dependency:tree | grep slf4j 
[INFO] +- org.slf4j:slf4j-simple:jar:1.6.4:compile 
[INFO] | \- org.slf4j:slf4j-api:jar:1.6.4:compile 
[INFO] +- org.slf4j:slf4j-api:jar:1.6.4:compile 
[INFO] +- org.slf4j:jcl-over-slf4j:jar:1.6.4:compile 
[INFO] +- org.slf4j:slf4j-simple:jar:1.6.4:compile 

मैं भी सुनिश्चित किया ~/.m2/भंडार में कोई अन्य जार है कि वहाँ

कॉमन्स-प्रवेश पुस्तकालयों का कोई सन्दर्भ हैं या तो (मैं उन सभी के रूप में निर्भरता पेड़ से इसकी पुष्टि बाहर रखा गया

मैं इस मुद्दे को मैं विचारों से बाहर चल रहा हूँ कैसे हल कर सकते हैं

संपादित करें:।?। के रूप में यहाँ पूर्ण निर्भरता, पहले माता-पिता पोम का अनुरोध:

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator</artifactId> 
      <version>${org.hibernate.validator.version}</version> 
      <exclusions> 
       <!-- Exclude SLF4j to avoid version conflicts (we have 1.6.2, this drags in 1.6.1) --> 
       <exclusion> 
        <groupId>org.slf4j</groupId> 
        <artifactId>slf4j-api</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator-annotation-processor</artifactId> 
      <version>${org.hibernate.validator.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>javax.validation</groupId> 
      <artifactId>validation-api</artifactId> 
      <version>1.0.0.GA</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>${org.springframework.version}</version> 
      <exclusions> 
       <!-- Exclude Commons Logging in favor of SLF4j --> 
       <exclusion> 
        <groupId>commons-logging</groupId> 
        <artifactId>commons-logging</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>${org.springframework.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-config</artifactId> 
      <version>${org.springframework.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-core</artifactId> 
      <version>${org.springframework.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-web</artifactId> 
      <version>${org.springframework.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-taglibs</artifactId> 
      <version>${org.springframework.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.inject</groupId> 
      <artifactId>javax.inject</artifactId> 
      <version>1</version> 
     </dependency> 

     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.8.2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>${org.slf4j.backend}</artifactId> 
      <version>${org.slf4j.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hsqldb</groupId> 
      <artifactId>hsqldb</artifactId> 
      <version>2.2.4</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.httpcomponents</groupId> 
      <artifactId>httpclient</artifactId> 
      <version>4.1.2</version> 
     </dependency> 
     <dependency> 
      <groupId>joda-time</groupId> 
      <artifactId>joda-time</artifactId> 
      <version>2.0</version> 
     </dependency> 
     <dependency> 
      <groupId>joda-time</groupId> 
      <artifactId>joda-time-jsptags</artifactId> 
      <version>1.0.2</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>servlet-api</artifactId> 
      <version>2.5</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet.jsp</groupId> 
      <artifactId>jsp-api</artifactId> 
      <version>2.1</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>jstl</artifactId> 
      <version>1.2</version> 
     </dependency> 
     <dependency> 
      <groupId>postgresql</groupId> 
      <artifactId>postgresql</artifactId> 
      <version>9.0-801.jdbc4</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.commons</groupId> 
      <artifactId>commons-lang3</artifactId> 
      <version>3.0.1</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

और फिर मॉड्यूल है कि विफल रहता है:

<dependencies> 
    // client specific dependencies skipped // 

    <dependency> 
     <groupId>com.google.guava</groupId> 
     <artifactId>guava</artifactId> 
     <version>10.0.1</version> 
    </dependency> 

    <!-- Spring --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <exclusions> 
      <!-- Exclude Commons Logging in favor of SLF4j --> 
      <exclusion> 
       <groupId>commons-logging</groupId> 
       <artifactId>commons-logging</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-config</artifactId> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-core</artifactId> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-web</artifactId> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-taglibs</artifactId> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.inject</groupId> 
     <artifactId>javax.inject</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>cglib</groupId> 
     <artifactId>cglib</artifactId> 
     <version>2.2.2</version> 
    </dependency> 

    <!-- Logging --> 
    <dependency> 
     <groupId>net.sf.opencsv</groupId> 
     <artifactId>opencsv</artifactId> 
     <version>2.0</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>${org.slf4j.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>jcl-over-slf4j</artifactId> 
     <version>${org.slf4j.version}</version> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>${org.slf4j.backend}</artifactId> 
     <version>${org.slf4j.version}</version> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.16</version> 
    </dependency> 

    <!-- Joda Time --> 
    <dependency> 
     <groupId>joda-time</groupId> 
     <artifactId>joda-time</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>joda-time</groupId> 
     <artifactId>joda-time-jsptags</artifactId> 
     <scope>runtime</scope> 
    </dependency> 

    <!-- Servlet --> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet.jsp</groupId> 
     <artifactId>jsp-api</artifactId> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>jstl</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>com.google.visualization</groupId> 
     <artifactId>visualization-datasource</artifactId> 
     <version>1.0.2</version> 
    </dependency> 

    <dependency> 
     <groupId>org.mybatis</groupId> 
     <artifactId>mybatis-spring</artifactId> 
     <version>1.0.2</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-dbcp</groupId> 
     <artifactId>commons-dbcp</artifactId> 
     <version>1.4</version> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.0</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-io</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>2.1</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-fileupload</groupId> 
     <artifactId>commons-fileupload</artifactId> 
     <version>1.2.2</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.poi</groupId> 
     <artifactId>poi</artifactId> 
     <version>3.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.poi</groupId> 
     <artifactId>poi-ooxml</artifactId> 
     <version>3.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.poi</groupId> 
     <artifactId>poi-ooxml-schemas</artifactId> 
     <version>3.7</version> 
    </dependency> 

    <dependency> 
     <groupId>postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
     <scope>runtime</scope> 
    </dependency> 

    <dependency> 
     <scope>test</scope> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
    </dependency> 
</dependencies> 

इन गुणों माता पिता पर सेट कर रहे हैं:

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <org.hibernate.validator.version>4.2.0.Final</org.hibernate.validator.version> 
    <org.slf4j.backend>slf4j-simple</org.slf4j.backend> 
    <org.slf4j.version>1.6.4</org.slf4j.version> 
    <org.springframework.version>3.0.5.RELEASE</org.springframework.version> 
</properties> 

मेरी हाल ही में प्रयोगों को देखते हुए यह संबंधित एक मुद्दा हो प्रतीत नहीं होता है हालांकि, परियोजना फाइलों के लिए। मैंने समस्या को 'hg bisect' करने की कोशिश की, लेकिन सप्ताहों में वापस जाने के लिए मुझे एक ऐसा संस्करण नहीं मिला जो काम करता है। इनमें से कुछ उत्पादन प्रणालियों में चल रहे हैं, इसलिए यह एक कोड परिवर्तन होने की संभावना नहीं है जो इस समस्या का कारण बनता है।

+0

के लिए समस्या हल हो जाती आप निर्भरता बता सकते हैं? – icirellik

उत्तर

22

NoSuchMethodError के लिए javadocs कहते हैं,

आम तौर पर, इस त्रुटि संकलक द्वारा पकड़ा जाता है; यह त्रुटि केवल रन समय पर हो सकती है यदि किसी वर्ग की परिभाषा असंगत रूप से बदल गई है।

तो शायद यह slf4j लोड होने के असंगत संस्करणों के कारण हो रहा है। अपने क्लासपाथ को देखने और अनुमान लगाने के बजाय कक्षाएं कहाँ लोड की जाती हैं, यह पता लगाएं कि आपकी कक्षा कहां लोड की गई है here

प्रिंट करें जहां org.slf4j.spi.LocationAwareLogger, org.apache.commons.logging.impl.SLF4JLocationAwareLog और org.slf4j.Marker से लोड किया जा रहा है।

+15

मुझे क्लास लोडर से पूछने के बारे में सोचना चाहिए था। यह पता चला है कि https://www.auskey.abr.gov.au अपराधी था: उन्होंने 1.5.8 slf4j की एक प्रतिलिपि/usr/java/packages/lib/ext/में कॉपी की जब मैंने अपनी कुंजी 5 दिनों पहले स्थापित की । वहां और अधिक डरावनी चीजें हैं (log4j, bcmail, jaxb ...) - मुझे एक अलग जेआरई स्थापित करने की आवश्यकता होगी। मेरी इच्छा है कि slf4j द्विआधारी संगतता को तोड़ने से रोक देगा। –

+1

बसकी को स्थापित करने के बाद बस इस समस्या को दबाएं! टिप्पणी के लिए धन्यवाद, @ पीटर बेकर। –

1

एक समाधान।

ग्रहण निर्देशिका पर सत्यापित करें: विन्यास \ org.eclipse.equinox.simpleconfigurator \ bundles.info

slf4j कोई और अधिक एक

0

मैं अपने पोम फ़ाइल है, जो slf4j शामिल में क्वार्ट्ज अनुसूचक था, इसलिए मैं बाहर रखा गया यह:

<exclusion> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
</exclusion> 

और काम किया!

1

एमवीएन स्वच्छ निर्भरता: पेड़-डस्किपटेस्ट;

रूप

<dependency> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.6</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.slf4j</groupId> 
       <artifactId>slf4j-jdk14</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.slf4j</groupId> 
       <artifactId>jcl-over-slf4j</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
1

हम समान समस्या का सामना कर रहे थे (उच्चतम वन ") एक को छोड़कर" org.slf4j "के सभी निर्भरता को हटा कर उसे हम classpath में slf4j जार के 2 असंगत संस्करणों था निकला । वर्ग मार्ग का अनुसरण 2 असंगत संस्करणों। classpath से पूर्व के संस्करणों के हटाने के बाद, यदि समस्या ठीक किया गया था था।

slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.1.jar

slf4j-api-1.5.11.jar
slf4j-log4j12-1.5.11.jar

0

हल हो गया !!!

मुझे JavaDoc प्लगइन का उपयोग कर रहा था जो किसी अन्य प्रोजेक्ट पर निर्भरता थी। JavaDoc प्लगइन आंतरिक रूप से Maven-core और Maven-core-2.2.1jcl-over-slf4j: 1.5.6 का उपयोग करता है। Maven-core एक पैरेंट लेवल जार है।

अब, JCL जार के कारण, मुझे इस समस्या का सामना करना पड़ रहा था। इसलिए मैंने इसे libweblogic (या जो भी सर्वर आप उपयोग कर रहे हैं) के फ़ोल्डर से हटा दिया।

और अलास !! समस्या हल हो गई थी।

नोट 1: - आप इस समस्या को हल करने के लिए JavaDoc (या किसी अन्य प्लगइन) से इस निर्भरता को हटाने के लिए मेवेन के <exclusion> टैग का भी उपयोग कर सकते हैं।

नोट 2: - पीओएम में Dependency Hierarchy टैब का उपयोग यह देखने के लिए करें कि ऐसा कोई पुराना SLF4J जार मौजूद है या नहीं। और बाकी को हटा दें और केवल एक संस्करण रखें।

आशा है कि यह मदद करता है ..

0

यह आमतौर पर होता है आप निर्भरता है कि दोनों एक ही सकर्मक निर्भरता का उपयोग किया है जब। इसका मतलब है कि आपकी 2 निर्भरताओं (या आपका ऐप, और एक ट्रांजिटिव निर्भरता) दोनों अलग-अलग संस्करणों के साथ आंतरिक रूप से SLF4J का उपयोग कर रहे हैं। लेकिन आपका ऐप एक ही समय में कक्षा के एक संस्करण का उपयोग कर सकता है, इसलिए इसे चुनना है (यहां नियमों को नहीं जानते ... यादृच्छिक?)

समस्या को हल करने के लिए, आपको आमतौर पर एक करने की आवश्यकता होती है mvn dependency:tree यह देखने के लिए कि SLF4J के विभिन्न संस्करणों का उपयोग कर रहे हैं।

इस निर्भरता को जोड़ने से आप pom.xml मुझे

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.7.25</version> 
</dependency> 

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
    <version>1.7.5</version> 
</dependency> 
संबंधित मुद्दे