Je suis nouveau sur Spring Boot et lorsque j'essaie de démarrer mon serveur, j'obtiens l'exception suivante. Je comprends que cela a quelque chose à voir avec un conflit de dépendance, mais que je ne parviens toujours pas à le comprendre.
Exception in thread "main" Java.lang.IllegalArgumentException:
LoggerFactory is not a Logback LoggerContext but Logback is on the
classpath. Either remove Logback or the competing implementation
(class org.slf4j.impl.Log4jLoggerFactory) Object of class
[org.slf4j.impl.Log4jLoggerFactory] must be an instance of class
ch.qos.logback.classic.LoggerContext at
org.springframework.util.Assert.isInstanceOf(Assert.Java:339) at
org.springframework.boot.logging.logback.LogbackLoggingSystem.initialize(LogbackLoggingSystem.Java:93)
at
org.springframework.boot.logging.AbstractLoggingSystem.initializeWithSensibleDefaults(AbstractLoggingSystem.Java:62)
at
org.springframework.boot.logging.AbstractLoggingSystem.beforeInitialize(AbstractLoggingSystem.Java:45)
at
org.springframework.boot.logging.logback.LogbackLoggingSystem.beforeInitialize(LogbackLoggingSystem.Java:69)
at
org.springframework.boot.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.Java:135)
at
org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.Java:98)
at
org.springframework.boot.context.event.EventPublishingRunListener.publishEvent(EventPublishingRunListener.Java:100)
at
org.springframework.boot.context.event.EventPublishingRunListener.started(EventPublishingRunListener.Java:54)
at
org.springframework.boot.SpringApplication.run(SpringApplication.Java:276)
at
org.springframework.boot.SpringApplication.run(SpringApplication.Java:952)
at
org.springframework.boot.SpringApplication.run(SpringApplication.Java:941)
at org.magnum.mobilecloud.video.Application.main(Application.Java:30)
Résolu: Ajouter ce qui suit au fichier POM.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-Tomcat</artifactId>
</exclusion>
<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-log4j</artifactId>
</dependency>
À l'exclusion delogback-classicde actionneur de démarreur à ressort et actionneur de démarreur à démarrage à ressort travaillé pour moi
compile("org.springframework.boot:spring-boot-starter-web:1.1.10.RELEASE") {
exclude module: "spring-boot-starter-Tomcat"
exclude module: "spring-boot-starter-logging"
exclude module: "logback-classic"
}
compile("org.springframework.boot:spring-boot-starter-actuator:1.1.10.RELEASE") {
exclude module: "logback-classic"
}
Ajoutez ceci à votre build.gradle
configurations.all {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-Tomcat'
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
exclude group: 'org.springframework.boot', module: 'logback-classic'
}
Dans mon projet, il utilise
Première Introduction au mécanisme de dépendance
Médiation de dépendance - détermine la version d'une dépendance qui sera utilisée lorsque plusieurs versions d'un artefact sont rencontrées. Actuellement, Maven 2.0 prend uniquement en charge l'utilisation de la "définition la plus proche", ce qui signifie qu'il utilisera la version de la dépendance la plus proche de votre projet dans l'arborescence des dépendances. Vous pouvez toujours garantir une version en la déclarant explicitement dans le POM de votre projet. Notez que si deux versions de dépendance ont la même profondeur dans l'arborescence des dépendances, jusqu'à la version 2.0.8 de Maven, il était impossible de déterminer laquelle gagnerait, mais depuis Maven 2.0.9, c'est l'ordre dans la déclaration qui compte: la première déclaration gagne. "définition la plus proche" signifie que la version utilisée sera la plus proche de votre projet dans l'arborescence des dépendances, par exemple. si les dépendances pour A, B et C sont définies comme étant A -> B -> C -> D 2.0 et A -> E -> D 1.0, alors D 1.0 sera utilisé lors de la construction de A car le chemin de A à D passe par E est plus court. Vous pouvez explicitement ajouter une dépendance à D 2.0 en A pour forcer l'utilisation de D 2.0.
Donc maven utilisera logback 1.1.7 dans mon projet. Je ne suis pas sûr que ce soit mon module A non compatible avec 1.1.7 ou logback 1.1.7 non compatible avec slf4j 1.7.21 Peu importe, dans mon cas. J'ajoute dependencyManagement dans mon pom. Dites à maven uniquement l’utilisation de lockback 1.1.2. Problème résolu.
<dependencyManagement>
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
</dependencyManagement>
la configuration suivante dans mon fichier gradle.build a fonctionné pour moi:
configurations {
all*.exclude group: "org.springframework.boot", module: "spring-boot-starter-logging"
all*.exclude group: "ch.qos.logback"
all*.exclude group: "org.slf4j", module: "log4j-over-slf4j" // allow using log4j 2.x
all*.exclude group: "org.slf4j", module: "slf4j-simple" // log4j is the configured backend
}
Spring Boot prend en charge Log4j 2 pour la configuration de la consignation s’il se trouve sur le chemin de classe. Si vous utilisez les démarreurs pour assembler des dépendances, vous devez exclure Logback, puis inclure log4j 2.
La solution Gradle ajoute les lignes ci-dessous dans build.gradle:
configurations {
all*.exclude module : 'spring-boot-starter-logging'
}
Répétez la réponse, mais vous pouvez utiliser Eclipse pour exclure la dépendance spring-boot-starter-logging
par exemple, __. entrez la description de l'image ici
Je vous recommanderais d'essayer de supprimer toute dépendance contenant le journal, la plus courante étant:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
Cela a fonctionné pour moi.