2012-01-19 51 views
19

Tôi có một dự án sử dụng cả hai phụ thuộc độc lập: BoneCP và Hibernate. Nhưng nhờ SLF4J và phiên bản của nó xung đột nó không hoạt động vì BoneCP yêu cầu SLF4J 1.5 và Hibernate yêu cầu SLF4j 1.6. Như bạn đã biết, không thể quan trọng hai phiên bản khác nhau của cùng một sự phụ thuộc trong tệp pom.xml của bạn. Vậy tôi có thể làm gì để giải quyết hiệu ứng phụ SLF4J tuyệt vời này?Maven + SLF4J: Phiên bản xung đột khi sử dụng hai phụ thuộc khác nhau yêu cầu hai phiên bản SLF4J khác nhau

Các lỗi tôi nhận được là khét tiếng:

SLF4J: The requested version 1.5.10 by your slf4j binding is not compatible with [1.6] 
SLF4J: See http://www.slf4j.org/codes.html#version_mismatch for further details. 

tôi sẽ cần phải thêm điều này, nhưng cùng sự phụ thuộc với hai phiên bản khác nhau là không được phép:

<dependency> 
<groupId>org.slf4j</groupId> 
<artifactId>slf4j-log4j12</artifactId> 
<version>1.5.10</version> 
<scope>provided</scope> 
</dependency> 

<dependency> 
<groupId>org.slf4j</groupId> 
<artifactId>slf4j-log4j12</artifactId> 
<version>1.6.2</version> 
<scope>provided</scope> 
</dependency> 

Maven cây phụ thuộc:

[INFO] [dependency:tree {execution: default-cli}] 
[INFO] org.mentawai:menta:war:1.0.5-SNAPSHOT 
[INFO] +- javax.servlet.jsp:jsp-api:jar:2.0:provided 
[INFO] +- javax.servlet:servlet-api:jar:2.5:provided 
[INFO] +- javax.activation:activation:jar:1.1:compile 
[INFO] +- javax.mail:mail:jar:1.4:compile 
[INFO] +- javax.persistence:persistence-api:jar:1.0:compile 
[INFO] +- org.slf4j:slf4j-log4j12:jar:1.5.10:compile 
[INFO] | +- org.slf4j:slf4j-api:jar:1.5.10:compile 
[INFO] | \- log4j:log4j:jar:1.2.14:compile 
[INFO] +- org.hibernate:hibernate-core:jar:3.6.7.Final:compile 
[INFO] | +- antlr:antlr:jar:2.7.6:compile 
[INFO] | +- commons-collections:commons-collections:jar:3.1:compile 
[INFO] | +- dom4j:dom4j:jar:1.6.1:compile 
[INFO] | +- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Final:compile 
[INFO] | +- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.1.Final:compile 
[INFO] | \- javax.transaction:jta:jar:1.1:compile 
[INFO] +- javassist:javassist:jar:3.12.1.GA:compile 
[INFO] +- junit:junit:jar:4.8.1:test 
[INFO] +- c3p0:c3p0:jar:0.9.1.2:compile 
[INFO] +- com.h2database:h2:jar:1.2.138:compile 
[INFO] +- mysql:mysql-connector-java:jar:5.1.13:compile 
[INFO] +- me.soliveirajr:mentawai:jar:2.3.3-SNAPSHOT:compile 
[INFO] | +- net.sf.json-lib:json-lib:jar:jdk15:2.3:compile 
[INFO] | | +- commons-beanutils:commons-beanutils:jar:1.8.0:compile 
[INFO] | | +- commons-logging:commons-logging:jar:1.1.1:compile 
[INFO] | | \- net.sf.ezmorph:ezmorph:jar:1.0.6:compile 
[INFO] | +- org.jdom:jdom:jar:1.1:compile 
[INFO] | +- com.thoughtworks.xstream:xstream:jar:1.3.1:compile 
[INFO] | | \- xpp3:xpp3_min:jar:1.1.4c:compile 
[INFO] | +- org.ajaxtags:ajaxtags:jar:1.2-beta3:compile 
[INFO] | | +- javax.servlet:jstl:jar:1.0.6:compile 
[INFO] | | +- taglibs:standard:jar:1.0.6:compile 
[INFO] | | \- net.htmlparser:jericho-html:jar:2.1:compile 
[INFO] | +- jgroups:jgroups-all:jar:2.2.9.1:compile 
[INFO] | +- me.soliveirajr:menta-container:jar:0.9.8:compile 
[INFO] | +- me.soliveirajr:menta-bean:jar:1.1.1:compile 
[INFO] | +- me.soliveirajr:menta-regex:jar:0.9.5:compile 
[INFO] | +- org.beanshell:bsh:jar:2.0b4:compile 
[INFO] | +- com.jolbox:bonecp:jar:0.7.1.RELEASE:compile 
[INFO] | | \- com.google.guava:guava:jar:r08:compile 
[INFO] | +- velocity:velocity-dep:jar:1.4:compile 
[INFO] | +- commons-fileupload:commons-fileupload:jar:1.2.2:compile 
[INFO] | +- commons-io:commons-io:jar:1.3.2:compile 
[INFO] | +- net.tanesha.recaptcha4j:recaptcha4j:jar:0.0.7:compile 
[INFO] | \- commons-dbcp:commons-dbcp:jar:1.4:compile 
[INFO] |  \- commons-pool:commons-pool:jar:1.5.4:compile 
[INFO] +- commons-lang:commons-lang:jar:2.5:compile 
[INFO] \- asm:asm:jar:3.2:compile 
+0

Vui lòng thêm lỗi bạn đang gặp phải. Ngoài ra, bạn không nên thêm SLF4J vào POM của bạn chỉ vì các phụ thuộc khác sử dụng nó - bạn chỉ cần thêm nó nếu _you_ sử dụng nó trực tiếp.Maven chịu trách nhiệm về các phụ thuộc transitive và tôi nghi ngờ nó sẽ lấy 1.6 và BoneCP sẽ không bất hạnh. – SingleShot

+0

Đã thêm lỗi. Tôi tin rằng tôi phải thêm một thực hiện của SLF4J. Vì vậy, vấn đề là: Hibernate yêu cầu 1.6 thực hiện. BoneCP yêu cầu 1.5. Đó là cuộc đụng độ! – chrisapotek

Trả lời

28

Các liên kết được cung cấp trong thông báo lỗi, "http://www.slf4j.org/codes.html#version_mismatch", khẳng định:

Một SLF4J ràng buộc chỉ định một artifact như slf4j-jdk14.jar hoặc slf4j-log4j12.jar sử dụng để ràng buộc slf4j vào khung ghi nhật ký cơ bản , ví dụ: java.util.logging hoặc log4j. Trộn lẫn các phiên bản khác nhau của của slf4j-api.jar và SLF4J có thể gây ra vấn đề. Đối với ví dụ , nếu bạn đang sử dụng slf4j-api-1.6.6.jar, thì bạn cũng nên sử dụng sử dụng slf4j-simple-1.6.6.jar, bằng cách sử dụng slf4j-simple-1.5.5.jar sẽ không hoạt động .

LƯU Ý Từ góc độ của khách hàng, tất cả các phiên bản của slf4j-api là tương thích. Mã máy khách được biên dịch với slf4j-api-N.jar sẽ chạy hoàn toàn tốt với slf4j-api-M.jar cho bất kỳ N và M. Bạn chỉ cần đảm bảo rằng phiên bản ràng buộc của bạn khớp với mã của slf4j-api .jar. Bạn không phải lo lắng về phiên bản slf4j-api.jar được sử dụng bởi một phụ thuộc nhất định trong dự án của bạn. Bạn có thể luôn sử dụng bất kỳ phiên bản nào của slf4j-api.jar và miễn là phiên bản slf4j-api.jar và khớp nối ràng buộc của nó, bạn sẽ ổn.

Tất cả những gì bạn cần là khai báo sự phụ thuộc vào slf4j-log4j12 một số phiên bản SLF4J trong tệp pom.xml của bạn. Tôi sẽ đề nghị 1.6.6 là mới nhất. Điều này sẽ kéo cùng một phiên bản của slf4j-api vào dự án của bạn nhờ các quy tắc chuyển tiếp của Maven.

Vì vậy, chỉ cần khai báo thông tin sau trong tệp pom.xml của bạn.

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

Tôi giả định rằng bạn không thực sự cần khai báo slf4j-api và slf4j-log4j12 trong phạm vi được cung cấp.

+12

FYI phản hồi này là từ tác giả của SLF4J. – SingleShot

4

Chỉ cần loại trừ phiên bản 1.5.10 của SLF4J

<dependency> 
     <groupId>...</groupId> 
     <artifactId>BoneCP</artifactId> 
     <version>...</version> 
     <exclusions> 
     <exclusion> <!-- declare the exclusion here --> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-log4j12</artifactId> 
     <version>1.5.10</version> 
     </exclusion> 
     </exclusions> 
    </dependency> 
+1

+1 để đề cập đến loại trừ. @chrisapotek - bạn có thể muốn thực sự excluse SLF4J từ cả BoneCP ** và ** Hibernate, sau đó tự thêm các phụ thuộc vào pom của bạn cho cả slf4j-api và slf4j-simple. Điều đó sẽ thoát khỏi sự xung đột phụ thuộc cho tốt. – Perception

+0

Có điều gì đó bị hiểu lầm ở đây: BoneCP bị ràng buộc (nhu cầu) 1.5. Nó ràng buộc với API và KHÔNG cho việc triển khai mà bạn đang cố gắng loại trừ ở trên. Tôi cần BAO GỒM một triển khai bổ sung cho BoneCP. Tôi không thể chuyển đổi phiên bản API được BoneCP sử dụng. Kiểm tra phụ thuộc mvn thử chỉnh sửa trong câu hỏi. – chrisapotek

0

Tôi đã gặp lỗi tương tự. Về cơ bản, hãy cẩn thận khi có nhiều phiên bản của slf4j jars trong classpath.

Các vấn đề liên quan