Невозможно запустить жидкость с помощью командной строки

Я хочу использовать Liquibase, но когда я хочу, чтобы он запускался с командной строкой, это происходит:

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

Я попробовал Liquibase-3.6.1 и теперь Liquibase-3.6.0

Ответ 1

Одна из обязательных библиотек отсутствует в папке библиотеки.

См. Ссылку на отчет об ошибке ниже, где у другого пользователя была такая же проблема.

Похоже, что 3.6.1 по-прежнему отсутствует slf4j-api-1.7.25 в папке lib, и я все еще получаю сообщение об ошибке, вызывая liquibase через cli.

У вас есть три варианта:

  1. Получить библиотеку самостоятельно [здесь].
  2. Дождитесь исправленной версии (возможно, представьте исправление самостоятельно).
  3. Вернуться к старой версии (3.5.5 Должно работать)

Смотрите здесь для сообщения об ошибке: https://liquibase.jira.com/browse/CORE-3201

Ответ 2

Вы должны добавить эти библиотеки в ваш путь к классам:

В моем случае я использую интеграцию Spring Boot с жидкой базой, так что вот моя build.gradle 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'
        }
    }
}

Это выдержка из ликваза-градля-плагина

Ответ 3

Это исправлено в версии 3.6.3.

Ответ 4

Я наткнулся на ту же проблему в версии 3.6.2. Проблема в том, что Liquibase не может найти требуемые классы (ch.qos.logback.core.filter.Filter является лишь одним из них, но есть и другие). Универсального рецепта не существует, но идея высокого уровня заключается в том, чтобы найти JAR файлы, в которых живут требуемые классы, и передать их в параметр командной строки -cp. Выглядит немного некрасиво, но это то, что в итоге сработало:

#!/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

Обратите внимание, что я использую : в Linux, в то время как ; потребуется в Windows. Настройте команду в соответствии с вашим конкретным местоположением JAR.

Кроме того, вы можете поместить зависимости в каталог и указать его с помощью подстановочного знака после -cp:

   $ java -cp "/home/raiks/liquibase-deps/*" liquibase.integration.commandline.Main --changeLogFile=~/changelog-master.xml update