SLF4J: คลาสพา ธ ประกอบด้วยการเชื่อม SLF4J หลายรายการ


206

ฉันได้รับข้อผิดพลาดดังต่อไปนี้ ดูเหมือนว่ามีกรอบการบันทึกหลายเฟรมที่ผูกกับ sl4j ไม่แน่ใจว่าจะแก้ไขปัญหานี้อย่างไร ความช่วยเหลือใด ๆ ที่ชื่นชมอย่างมาก

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/admin/.m2/repository/org/slf4j/slf4j-log4j12/1.6.4/slf4j-log4j12-1.6.4.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/admin/.m2/repository/org/slf4j/slf4j-log4j12/1.6.1/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

15
การแก้ไขโดยใช้ <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> ในการพึ่งพา (ของ pom.xml) ที่ทำให้เกิดข้อขัดแย้งช่วยแก้ไขปัญหา
user1493140


6
คุณได้ตรวจสอบslf4j.org/codes.html#multiple_bindingsตามที่ระบุในคำเตือนหรือไม่?
Peter Keller

7
อาจเป็นการดีกว่าถ้าเพิ่มคำตอบ (ตอบอัตโนมัติ) สำหรับคำถามนี้และทำเครื่องหมายว่า "ยอมรับ" ดังนั้นคำถามจะปรากฏเป็น "แก้ไข" ในการค้นหา SO
Roberto

1
Roberto ขอบคุณสำหรับคำติชม ฉันคัดลอกโซลูชันจากความคิดเห็นและโพสต์เป็นคำตอบ
user1493140

คำตอบ:


125

แก้ไขโดยเพิ่มการยกเว้นต่อไปนี้ในการพึ่งพา (ของ pom.xml) ที่ทำให้เกิดข้อขัดแย้ง

<exclusions>
    <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
</exclusions> 

10
สิ่งที่ทำให้เกิดความขัดแย้งในกรณีนี้ฉันมีต้นไม้พึ่งพามี 3 กล่าวถึงของ slf4j
PUG

22
เพื่อค้นหาวิธีที่ log4j เริ่มต้นบนเส้นทางของคุณเรียกใช้การพึ่งพา mvn: tree และ comb through แล้วเพิ่ม snippet ด้านบนเพื่อการพึ่งพานั้นใน pom.xml ของคุณ
cyber-monk

1
@ user1493140 ยังคงไม่ทำงานสำหรับฉัน <dependency> <groupId> log4j </groupId> <artifactId> log4j </artifactId> <version> 1.2.17 </version> <exclusions> <exclusions> <exclusion> <groupId> org.slf4j </groupId> slf4j- log4j12 </artifactId> </exclusion> </exclusions> </dclusions> </okclusions>
Ashok kumar Ganesan

1
สำหรับฉันอีกขวดสงครามสาเหตุ ฉันต้องแยกสิ่งประดิษฐ์ด้วย id slf4j-nop และ slf4j-jdk14 การพึ่งพาที่ทำให้เกิดความขัดแย้งสำหรับฉันคือ clover-maven-plugin
ihebiheb

รุ่น ( slf4j-log4j12) ใช้ได้กับทุกคนหรือไม่ หรือเราควรหาเวอร์ชั่นจากการพึ่งพา mvn: tree ?
Lei Yang

59

รุ่น Gradle;

configurations.all {
    exclude module: 'slf4j-log4j12'
}

2
การนำเข้าโมเดลจากแอปพลิเคชันหลักไปยังกรอบการทำงานอัตโนมัติ .. ซึ่งช่วยแก้ไขปัญหาของฉันในการไล่ระดับสี TY
จะ

1
มีมดรุ่นใดที่ทำสิ่งนี้?
Balaji Boggaram Ramanarayan

1
ไม่: มดไม่ใช่เครื่องมือที่ต้องอาศัยการพึ่งพา พิจารณา porting งานสร้างของคุณอย่างมาก
Matthew Mark Miller

1
ขอแนะนำ porting สร้างของคุณเพื่อ SBT :)
ioleo

2
ยอดเยี่ยม ช่วยฉันจากนรกไม่กี่ชั่วโมง!
jseals

24

ข้อผิดพลาดอาจให้ข้อมูลเพิ่มเติมเช่นนี้ (แม้ว่าชื่อ jar ของคุณอาจแตกต่างกัน)

SLF4J: พบการเชื่อมโยงใน [jar: ไฟล์: / D: /Java/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar! / org / slf4j / impl / StaticLoggerBinder .class] SLF4J: พบการเชื่อมโยงใน [jar: file: / D: /Java/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.8.2/log4j-slf4j-impl-2.8.2.jar ! /org/slf4j/impl/StaticLoggerBinder.class]

สังเกตเห็นว่ามีความขัดแย้งมาจากสองขวดชื่อและlogback-classic-1.2.3log4j-slf4j-impl-2.8.2.jar

ทำงานmvn dependency:treeในโฟลเดอร์หลัก pom.xml ของโครงการนี้โดยระบุ:

ความขัดแย้งของต้นไม้ที่ต้องพึ่งพา

ตอนนี้เลือกสิ่งที่คุณต้องการละเว้น (อาจใช้ความพยายามที่ละเอียดอ่อนฉันต้องการความช่วยเหลือเพิ่มเติมในเรื่องนี้)

ฉันตัดสินใจที่จะไม่ใช้สิ่งที่นำเข้าจากspring-boot-starter-data-jpa(การพึ่งพาสูงสุด) ถึงspring-boot-starterตลอดspring-boot-starter-loggingจน pom กลายเป็น:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

ใน pom ข้างต้นspring-boot-starter-data-jpaจะใช้การspring-boot-starterกำหนดค่าในไฟล์เดียวกันซึ่งไม่รวมlogging(มีlogback)


1
mvn dependency:treeขอบคุณสำหรับการแนะนำ มันมีประโยชน์มาก ...
ม.ค. Lochman

10

รุ่น Sbt:

ผนวกexclude("org.slf4j", "slf4j-log4j12")เข้ากับการขึ้นต่อกันที่รวมslf4j-log4j12อยู่ด้วย ตัวอย่างเช่นเมื่อใช้ Spark กับ Log4j 2.6:

libraryDependencies ++= Seq(
  // One SLF4J implementation (log4j-slf4j-impl) is here:
  "org.apache.logging.log4j" % "log4j-api" % "2.6.1",
  "org.apache.logging.log4j" % "log4j-core" % "2.6.1",
  "org.apache.logging.log4j" % "log4j-slf4j-impl" % "2.6.1",
  // The other implementation (slf4j-log4j12) would be transitively
  // included by Spark. Prevent that with exclude().
  "org.apache.spark" %% "spark-core" % "1.5.1" exclude("org.slf4j", "slf4j-log4j12")
)

1
Sbt หมายถึงอะไร
Petrus Theron

3
เครื่องมือสร้างอย่างง่าย *
Benny

4
<!--<dependency>-->
     <!--<groupId>org.springframework.boot</groupId>-->
     <!--<artifactId>spring-boot-starter-log4j2</artifactId>-->
<!--</dependency>-->

ฉันแก้ไขได้โดยลบสิ่งนี้: spring-boot-starter-log4j2


ไม่ชัดเจน: คุณหมายถึงลบ / แสดงความคิดเห็นเหนือส่วน xml หรือเพิ่มหรือไม่
Lei Yang


3

เพียงใช้การพึ่งพาที่จำเป็นเท่านั้นไม่ใช่ทั้งหมด :))) สำหรับฉันสำหรับกระบวนการบันทึกการทำงานตามปกติคุณต้องมีการขึ้นต่อกันนี้ยกเว้นผู้อื่นจาก pom.xml

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

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.1.8</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.1.8</version>
    </dependency>

3

ปัญหานี้เกิดขึ้นเนื่องจากคลาส StaticLoggerBinder.class เป็นของสองขวดที่แตกต่างกัน คลาสนี้อ้างอิงจาก logback-classic-1.2.3.jar และคลาสเดียวกันยังอ้างอิงจาก log4j-slf4j-impl-2.10.0.jar jar ทั้งสองใน classpath ดังนั้นจึงมีความขัดแย้งระหว่างพวกเขา นี่คือเหตุผลที่ล็อกไฟล์ไม่ได้สร้างแม้ว่าไฟล์ log4j2.xml ใน classpath [src / main / resource]

เรามีให้เลือกหนึ่งใน jar ฉันขอแนะนำให้ใช้ไฟล์ log4j-slf4j-impl-2.10.0.jar และยกเว้นไฟล์ logback-classic-1.2.3.jar โซลูชัน: เปิดไฟล์ pom และดูลำดับชั้นการพึ่งพา [eclipse] หรือเรียกใช้
mvn การพึ่งพา: คำสั่ง tree เพื่อค้นหาแผนผังการพึ่งพาและแหล่งที่มาของการพึ่งพาที่ดาวน์โหลดการพึ่งพา ค้นหาการพึ่งพาที่ขัดแย้งกันและแยกพวกเขาออก สำหรับแอปพลิเคชัน Springboot ให้ลองสิ่งนี้

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-logging</artifactId>
                    </exclusion>
                </exclusions>
        </dependency>
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

This is working fine for me after struggling a lots.

2

... org.codehaus.mojo cobertura-maven-plugin 2.7 ทดสอบ ch.qos.logback เครื่องมือบันทึกการเข้าสู่ระบบแบบคลาสสิค com.sun ...

## ฉันแก้ไขด้วยสิ่งนี้

... org.codehaus.mojo cobertura-maven-plugin 2.7 ทดสอบ ch.qos.logback เครื่องมือบันทึกการเข้าสู่ระบบแบบคลาสสิค com.sun ...


2

สำหรับฉันมันกลายเป็นปัญหา Eclipse / Maven หลังจากเปลี่ยนจาก log4j เป็น logback ลองดูลงในไฟล์และค้นหาสตริง.classpath"log4j"

ในกรณีของฉันฉันมีดังต่อไปนี้: <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-log4j12/1.7.1/slf4j-log4j12-1.7.1.jar"/> <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.17/log4j-1.2.17.jar" />

การลบรายการเหล่านั้นออกจากไฟล์ (หรือคุณสามารถสร้างใหม่ได้) แก้ไขปัญหา


2

สำหรับฉันคำตอบคือการบังคับให้ Maven สร้างใหม่ ใน Eclipse:

  1. คลิกขวาที่โครงการ -> Maven -> ปิดการใช้งานธรรมชาติ Maven
  2. คลิกขวาที่โปรเจ็กต์ -> เครื่องมือสปริง> อัพเดตการพึ่งพา Maven
  3. คลิกขวาที่โครงการ -> กำหนดค่า> แปลงโครงการ Maven

0

ผมมีปัญหาเหมือนกัน. ใน pom.xml ของฉันฉันมีทั้งคู่

 <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.28</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.2.1.RELEASE</version>
    </dependency>

เมื่อฉันลบการพึ่งพา spring-boot-starter-web ปัญหาถูกแก้ไข


-1

การรวมกันของ<scope>provided</scope>และ<exclusions>ไม่ทำงานสำหรับฉัน

ฉันต้องใช้สิ่งนี้:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <scope>system</scope>
    <systemPath>${project.basedir}/empty.jar</systemPath>
</dependency>

ในกรณีที่empty.jarเป็นไฟล์ขวดมีอะไรอยู่ในนั้นอย่างแท้จริง


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.