2013-07-19 24 views
9

Vấn đề là do một trong những phụ thuộc trong tệp pom.xml [cxf-bundle-jaxrs] của tôi sử dụng nội bộ phiên bản slf4j thấp hơn. Tôi đã giải quyết vấn đề này bằng cách nâng cấp sự phụ thuộc này lên bản phát hành mới nhất. Cảm ơn mọi người.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton()

Tôi đang cố gắng thêm Apache Shiro vào ứng dụng web CXF Spring của mình. Khi tôi bắt đầu lên tomcat của tôi 7 tôi nhận được lỗi sau

Caused by: java.lang.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton()Lorg/slf4j/impl/StaticLoggerBinder; 
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:121) 
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:111) 
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:268) 
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:241) 
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:254) 
at org.apache.shiro.spring.LifecycleBeanPostProcessor.<clinit>(LifecycleBeanPostProcessor.java:51) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:100) 
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:61) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:877) 
... 25 more 

và pom.xml của tôi cho shiro và slf4j được

<dependency> 
     <groupId>org.apache.shiro</groupId> 
     <artifactId>shiro-core</artifactId> 
     <version>1.2.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.shiro</groupId> 
     <artifactId>shiro-web</artifactId> 
     <version>1.2.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.shiro</groupId> 
     <artifactId>shiro-spring</artifactId> 
     <version>1.2.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.6.1</version> 
    </dependency> 
    <dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.16</version> 
     <scope>runtime</scope> 
    </dependency> 

Tôi đã thử tất cả các giải pháp khả thi bởi googling, nhưng không may mắn.

Trả lời

1

Điều gì đó có vẻ không tương thích với các phiên bản sl4j-api và log4j đó. Try this link và tìm phụ thuộc chính xác và tương thích và sử dụng chúng.

Có thể bạn nên thử các kết hợp sau đây,

SLF4J API Module 1.7.5 The slf4j API

SLF4J LOG4J-12 Binding 1.7.5 SLF4J LOG4J-12 Binding

Hoặc, nếu bạn đang có kế hoạch để sử dụng phiên bản 1.6.1

<!-- slf4j-log4j -->  
    <dependency>    
      <groupId>org.slf4j</groupId>   
      <artifactId>slf4j-log4j12</artifactId>  
      <version>1.6.1</version>  
    </dependency> 
+0

Tôi đã thử cả hai và đã nhận lỗi cùng 'java.lang.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton() Lorg/slf4j/impl/StaticLoggerBinder; ' – enfany

3

Bạn cần phải bao gồm sự phụ thuộc này:

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
    <version>1.7.5</version> 
</dependency> 
+0

tôi bao gồm các phụ thuộc trên nhưng vẫn có những error.' cùng \t \t \t org.slf4j \t \t \t slf4j-api \t \t \t 1.7.5 \t \t \t \t \t \t \t org.slf4j \t \t \t slf4j-log4j12 \t \t \t 1.7.5 \t \t ' – enfany

+2

Bạn cần đảm bảo rằng các phiên bản slf4j đều giống nhau. Cập nhật 'slf4j-api' thành 1.7.5 hoặc hạ cấp' slf4j-log4j12' xuống 1.6.1 –

10
Caused by: java.lang.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton()Lorg/slf4j/impl/StaticLoggerBinder; 

Điều này có nghĩa là thứ bạn có lớp StaticLoggerBinder trong classpath của bạn. Nhưng lớp classpath của bạn không có phương thức getSingleton()

Điều này thường xảy ra khi bạn có các phụ thuộc cả hai đều sử dụng cùng một phụ thuộc chuyển tiếp. Điều này có nghĩa là 2 trong số các phụ thuộc của bạn (hoặc ứng dụng của bạn và một phụ thuộc chuyển tiếp) đều sử dụng SLF4J nội bộ với các phiên bản khác nhau. Nhưng ứng dụng của bạn chỉ có thể sử dụng một phiên bản duy nhất của lớp học cùng một lúc để nó phải chọn (không biết các quy tắc ở đây ... ngẫu nhiên?)

Để giải quyết vấn đề này, bạn thường cần thực hiện mvn dependency:tree để xem đang sử dụng các phiên bản SLF4J khác nhau.

Giải pháp thường sử dụng loại trừ phụ thuộc maven trên phiên bản thấp nhất. Các thư viện như SLF4J có xu hướng tương thích với retro nghĩa là các phiên bản mới hơn tiếp tục bổ sung thêm nhiều tính năng hơn. Đôi khi, một phương pháp được gỡ bỏ và sau đó bạn phải giữ phiên bản thư viện cũ và cầu nguyện.Nếu điều này không có tác dụng, vẫn có một số tùy chọn, chẳng hạn như JarJar

Nhưng đối với thư viện ghi nhật ký, đôi khi có một chút khác biệt, vì vậy giải thích của tôi là dành cho mục đích chung, nhưng có thể bạn không sử dụng phụ thuộc vào thư viện đăng nhập phù hợp có bao bì rất đặc biệt mà không phải lúc nào cũng dễ hiểu :)


Kiểm tra những gì tôi tìm thấy cho bạn:

Phương pháp getSingleton() xuất hiện tại phiên bản 1.5.6, vì vậy nó là rất có thể xảy ra rằng bạn có một thư viện có sử dụng một phiên bản cũ SLF4J 1.5.6 :) Bạn chỉ cần loại trừ nó với một loại trừ maven (và cầu nguyện).


Edit: bạn nên thử:

<dependency> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-bundle-jaxrs</artifactId> 
    <version>2.2</version> 
    <exclusions> 
    <exclusion> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-jdk14</artifactId> 
    </exclusion> 
    <exclusion> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
    </exclusion> 
    </exclusions> 
</dependency> 

tốt hơn, nếu bạn có một dự án maven multimodule với cha mẹ POM bạn có thể sử dụng với nút xml maven dependencyManagement.

+0

Sau khi chạy 'mvn dependency: tree' đây là một số manh mối mới: Tôi có cxf-bundle-jaxrs 2.2 sử dụng nội bộ' org .slf4j: slf4j-jdk14: jar: 1.3.1: runtime' Làm thế nào tôi có thể sử dụng loại trừ depedency để giải quyết vấn đề này? -Cảm ơn – enfany

+0

@KunXia điều này được giải thích trên trang web của maven nhưng tôi đã chỉnh sửa câu trả lời của mình. Tôi không thể chắc chắn về giải pháp trừ khi bạn đăng các phụ thuộc hoàn chỉnh của bạn và phụ thuộc: đầu ra cây –

+0

Cảm ơn, tôi đã giải quyết vấn đề này bằng cách nâng cấp cxf-bundle-jaxrs lên bản phát hành mới nhất. Tôi xấu tôi nên đăng pom.xml đầy đủ. Sẽ cập nhật câu hỏi của tôi với giải pháp.:) – enfany

0

Thêm sự phụ thuộc này giải quyết vấn đề này đối với tôi

<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> 
Các vấn đề liên quan