在centos上安装liquibase,JNI错误

时间:2018-12-17 12:02:46

标签: java linux centos java-native-interface liquibase

我在CentOS 6.9上安装了Java:

  [root@sample liquibase-3.6.2-bin.z]# java -version
  openjdk version "1.8.0_121"
  OpenJDK Runtime Environment (build 1.8.0_121-b13)
  OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)   

然后我尝试运行liquibase.jar,但出现此错误:

  [root@sample liquibase-3.6.2-bin.z]# ll
  total 11368
  drwxrwxrwx. 2 db2inst1 db2iadm1    4096 Dec 17 13:10 lib
 -rwxrwxrwx. 1 db2inst1 db2iadm1   11358 Jul  3 23:27 LICENSE.txt
 -rwxrwxrwx. 1 db2inst1 db2iadm1    1251 Jul  3 23:27 liquibase
 -rwxrwxrwx. 1 db2inst1 db2iadm1     884 Jul  3 23:27 liquibase.bat
 -rwxrwxrwx. 1 db2inst1 db2iadm1 2167086 Jul  3 23:30 liquibase.jar
 -rwxrwxrwx. 1 db2inst1 db2iadm1    7174 Jul  3 23:27 liquibase.spec
 -rwxrwxrwx. 1 db2inst1 db2iadm1    3046 Jul  3 23:27 README.txt
 drwxrwxrwx. 6 db2inst1 db2iadm1    4096 Dec 17 13:10 sdk
 [root@sample liquibase-3.6.2-bin.z]# java -jar liquibase.jar
 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(Class.java:2701)
    at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
    at java.lang.Class.getMethod0(Class.java:3018)
    at java.lang.Class.getMethod(Class.java:1784)
    at 
    sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
    Caused by: java.lang.ClassNotFoundException: 
    ch.qos.logback.core.filter.Filter
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 7 more
    [root@sampleliquibase-3.6.2-bin.z]#   

我该怎么办?我缺少什么吗?如何找到这些课程?

1 个答案:

答案 0 :(得分:1)

该错误是常规的缺少类错误,而不是JNI错误。该错误具有误导性,因为它表明问题的来源不正确。

这些类在lib/目录中。有一个用于启动它的dos bat文件。 Unix上的等效内容是这样的:

#!/bin/bash -p

for main in liquibase*.jar; do
    cp=$main
done

for i in lib/*.jar; do
    [[ -f $i ]] && cp=$cp:$i
done
java -classpath $cp liquibase.integration.commandline.Main "$@"

但是,这会产生错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

表示另一个缺少的库-Java的简单日志记录。

要解决此问题。您需要slf4j的副本。下载latest binary zip,然后提取api文件-将其称为sl4j-api-<version>.jar到liquibase的lib目录中,应该可以使您更进一步。