2012-03-01 10 views
36

Tôi đang gặp một vấn đề tò mò. Tôi đã có ứng dụng Java này mà trước đó đã được triển khai trong tomcat và vui vẻ sử dụng logback cổ điển như là một thực hiện slf4j. Bây giờ khi chúng tôi cố gắng để triển khai các ứng dụng tương tự trong một máy chủ 7.1.final JBoss nó thậm chí không triển khai ứng dụng maoning về java.lang.ClassCastException: org.slf4j.impl.Slf4jLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext Đây là dòng vi phạm mãLogback và Jboss 7 - không hoạt động cùng nhau?

final LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();

Lớp có mình là mùa xuân được tiêm và điều đó không thành công - do đó toàn bộ ứng dụng không thể được triển khai. Bất cứ ai có một giải pháp cho điều này? Cảm ơn trước

Sau khi tìm kiếm trên trang web này cộng với các diễn đàn khác, tôi nhận thấy rằng Jboss 7 đi kèm với việc triển khai slf4j của chính nó và triển khai cùng giao diện ILoggerFactory mà LoggerContext trong logback thực hiện. Ứng dụng của chúng tôi đã cố gắng để có được một thể hiện của cùng một nhưng máy chủ ứng dụng áp đặt thực hiện slf4j riêng của nó.

Tôi đã cố gắng sửa đổi module.xml trong jboss \ modules \ org \ slf4j \ impl \ main và chỉ nó vào các logback jars.

<resources> 
    <resource-root path="logback-classic-0.9.28.jar"/> 
    <resource-root path="logback-core-0.9.28.jar"/> 
</resources> 

Bây giờ khi tôi khởi động ứng dụng Tôi nhận được một lỗi nghiêm trọng

Exception starting filter WicketFilter: java.lang.ClassCastException: ch.qos.logback.classic.LoggerContext cannot be cast to ch.qos.logback.classic.LoggerContext

tôi đang ở cuối wits của tôi. Bất kỳ chuyên gia jboss và logback nào đều có thể trợ giúp? Cảm ơn trước

+1

Bạn có gặp 'logback * .jar' trong cả hai '/ thư mục lib' và trong EAR/WAR? –

+1

Xin chào Tomasz. Tôi đang có các logback jars trong thư mục WEB-INF/lib của tôi trong tập tin chiến tranh của tôi. Như đã đề cập ở trên, tôi đã thay đổi module.xml trong mô-đun org.slf4j.Impl jboss của mình để trỏ các logback (classic & core) cả hai đều nằm trong cùng thư mục với tệp module.xml. – Soumya

Trả lời

57

Bạn cần loại trừ phiên bản máy chủ của slf4j khỏi triển khai của mình. Tạo một tệp jboss-deployment-structure.xml và đặt nó vào thư mục WARS META-INF hoặc WEB-INF của bạn.

Nội dung của file sẽ trông như thế này:

<jboss-deployment-structure> 
    <deployment> 
     <!-- Exclusions allow you to prevent the server from automatically adding some dependencies  --> 
     <exclusions> 
      <module name="org.slf4j" /> 
      <module name="org.slf4j.impl" /> 
     </exclusions> 
    </deployment> 
</jboss-deployment-structure> 
+1

Làm việc một điều trị! Cảm ơn. Tôi đoán chúng tôi có thể loại trừ bất kỳ mô-đun nào mà chúng tôi không muốn sử dụng tệp này. Cảm ơn một lần nữa – Soumya

+0

@ James R. Perkins Tôi cũng nhận được rằng vấn đề nhưng nó là lớp học chiến thắng của tôi. Ví dụ 'com.java.User'. Tôi gặp vấn đề khi tôi triển khai lại tập tin chiến tranh mà không cần khởi động lại máy chủ 'Jboss 7'. Làm thế nào có thể giải quyết nó? – CycDemo

+0

@CycDemo nó sẽ hoạt động. Nếu không có thứ gì đó có thể bị rò rỉ nếu bạn nhận được ClassCastException. Phiên bản nào của JBoss AS 7? –

6

Nếu bạn đang sử dụng những cây cầu cho tháng bảy hoặc JCL trong ứng dụng của bạn, bạn nên loại trừ chúng quá:

 <module name="org.slf4j" /> 
     <module name="org.slf4j.jcl-over-slf4j" /> 
     <module name="org.slf4j.impl" /> 
     <module name="org.jboss.logging.jul-to-slf4j-stub" /> 
2

Có là phương pháp thay thế:

  • bạn đã đăng nhập được định cấu hình trong chiến tranh
  • bạn có tất cả phụ thuộc vào cuộc chiến
  • của bạn, bạn không cấu hình bất cứ điều gì trong thư mục máy chủ JBoss, thậm chí không thêm module JBoss

Chỉ cần vô hiệu hóa JBoss đăng nhập hoàn toàn và dựa vào sự phụ thuộc vào cuộc chiến của bạn. Chỉnh sửa jboss-deployment-structure.xml của bạn như sau:

<?xml version="1.0" encoding="UTF-8"?> 
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> 
    <deployment> 
     <exclusions> 
      <module name="org.apache.commons.logging" /> 
      <module name="org.apache.log4j" /> 
      <module name="org.jboss.logging" /> 
      <module name="org.jboss.logging.jul-to-slf4j-stub" /> 
      <module name="org.jboss.logmanager" /> 
      <module name="org.jboss.logmanager.log4j" /> 
      <module name="org.slf4j" /> 
      <module name="org.slf4j.impl" /> 
      <module name="org.slf4j.jcl-over-slf4j" /> 
     </exclusions> 
    </deployment> 
</jboss-deployment-structure> 

Khi bạn triển khai ứng dụng, khai thác gỗ bootstrap (boot.log) duy trì hoạt động cũng server.log sẽ hiển thị triển khai khai thác gỗ. Nhưng tất cả các ứng dụng của bạn được đăng nhập thông qua (trong ví dụ này) slf4j + logback trong chiến tranh của bạn.Lưu ý rằng bạn không cần phải chạy JBoss với -Dorg.jboss.logging.provider=slf4j, nếu bạn chỉ định điều này, bạn sẽ cần cung cấp các mô-đun JBoss (thường là slf4j-api, logback-classic và logback-core), nhưng nó không phải là giá trị nỗ lực , như JBoss đăng nhập hiện nay chỉ được sử dụng cho bootstrap (boot.log) và cho thông tin triển khai (server.log).

Tài liệu tham khảo:
http://tinyapps.blogspot.com/2013/01/getting-logback-and-slf4j-to-work-in.html
https://stackoverflow.com/a/19695680/2587343