Je veux utiliser liquibase mais quand je veux le laisser fonctionner avec la ligne de commande, cela se produit:

PS C:\Users\Ferid\Downloads\liquibase-3.6.0-bin> .\liquibase
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: ch/qos/logback/core/filter/Filter
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
    at java.lang.Class.privateGetMethodRecursive(Unknown Source)
    at java.lang.Class.getMethod0(Unknown Source)
    at java.lang.Class.getMethod(Unknown Source)
    at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)
    at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
 Caused by: java.lang.ClassNotFoundException: ch.qos.logback.core.filter.Filter
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 7 more

J'ai essayé liquibase-3.6.1 et maintenant liquibase-3.6.0

17
Mad Scientist 23 mai 2018 à 14:18

3 réponses

Meilleure réponse

L'une des bibliothèques requises est absente du dossier de la bibliothèque.

Voir le lien de rapport de bogue ci-dessous où un autre utilisateur a eu le même problème.

Il semble que 3.6.1 manque toujours slf4j-api-1.7.25 dans le dossier lib et je reçois toujours une erreur en invoquant liquibase via cli.

Vous avez trois options:

  1. Obtenez la bibliothèque vous-même [ici].
  2. Attendez la version corrigée (peut-être soumettre un correctif vous-même).
  3. Revenir à une version plus ancienne (3.5.5 devrait fonctionner)

Voir ici pour le rapport de bogue: https://liquibase.jira.com/browse/CORE-3201

23
sorifiend 2 août 2018 à 23:23

Je suis tombé sur le même problème dans la version 3.6.2. Le problème est que Liquibase ne trouve pas les classes requises (ch.qos.logback.core.filter.Filter étant juste l'une d'entre elles, mais il y en a d'autres). Il n'y a pas de recette universelle, mais l'idée de haut niveau est de trouver les JAR dans lesquels les classes requises vivent et de les alimenter en paramètre de ligne de commande -cp. Ça a l'air un peu moche mais c'est ce qui a finalement fonctionné:

#!/bin/bash

M2_REPO=/home/raiks/.m2/repository
LIQUIBASE_CMDLINE='liquibase.integration.commandline.Main --changeLogFile=~/changelog-master.xml update'
# Feed all the required JARs to -cp
JAVA_CMD="java -cp $M2_REPO/org/liquibase/liquibase-core/3.6.2/liquibase-core-3.6.2.jar:$M2_REPO/org/slf4j/slf4j-api/1.7.5/slf4j-api-1.7.5.jar:$M2_REPO/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar:$M2_REPO/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar $LIQUIBASE_CMDLINE"
echo $JAVA_CMD
eval $JAVA_CMD

Veuillez noter que j'utilise : sous Linux tandis que ; sera requis sous Windows. Ajustez la commande en fonction de votre emplacement JAR spécifique.

Vous pouvez également placer des dépendances dans un répertoire et le spécifier avec un caractère générique après -cp:

   $ java -cp "/home/raiks/liquibase-deps/*" liquibase.integration.commandline.Main --changeLogFile=~/changelog-master.xml update
2
raiks 11 oct. 2019 à 14:37

Vous devez ajouter ces bibliothèques à votre chemin de classe:

Dans mon cas, j'utilise l'intégration de Spring Boot liquibase, voici donc ma configuration de build.gradle liquibase

buildscript {
    dependencies {
        classpath 'org.postgresql:postgresql:9.4.1211.jre7'
        classpath 'org.liquibase:liquibase-core:3.6.3'
        classpath "org.liquibase:liquibase-gradle-plugin:2.0.1"
    }
}

plugins {
    id 'org.springframework.boot' version '2.1.3.RELEASE'
    id 'java'
    id "org.liquibase.gradle" version "2.0.1"
}


dependencies {
    liquibaseRuntime 'org.postgresql:postgresql:9.4.1211.jre7'
    liquibaseRuntime 'org.liquibase:liquibase-core:3.6.3'
    liquibaseRuntime 'org.liquibase:liquibase-groovy-dsl:2.0.1'
    liquibaseRuntime 'ch.qos.logback:logback-core:1.2.3'
    liquibaseRuntime 'ch.qos.logback:logback-classic:1.2.3'
}

def changeLog = "$projectDir/src/main/db/changelog.xml"
liquibase {
    activities {
        main {
            changeLogFile changeLog
            url 'jdbc:postgresql://localhost:5431/postgres'
            username 'postgres'
            password 'postgres'
        }
    }
}

C'est un extrait de liquibase-gradle-plugin

2
Alan Hernandez 4 mai 2019 à 20:26