无法使用命令行运行liquibase

时间:2018-05-23 11:18:32

标签: java database migration liquibase

我想使用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

4 个答案:

答案 0 :(得分:21)

库文件夹中缺少一个必需的库。

请参阅下面的错误报告链接,其他用户遇到同样的问题。

  

看来3.6.1仍然缺少lib文件夹中的slf4j-api-1.7.25   我仍然收到通过cli调用liquibase的错误。

您有三种选择:

  1. 自己获取图书馆[here]
  2. 等待打补丁 版本(也许自己提交修复)。
  3. 恢复旧版本(3.5.5应该可以使用)
  4. 请在此处查看错误报告: https://liquibase.jira.com/browse/CORE-3201

答案 1 :(得分:2)

我偶然发现了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

答案 2 :(得分:0)

现在在liquibase版本3.6.3中已修复

答案 3 :(得分:0)

您必须将此库添加到您的类路径中:

就我而言,我正在使用Spring Boot liquibase集成,因此,这是我的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'
        }
    }
}

这是liquibase-gradle-plugin

的摘录