java - centos上liquibase安装,JNI报错

标签 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]#   

我该怎么办?我错过了什么吗?如何找到这些类(class)?

最佳答案

该错误是一般类缺失错误,而不是 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进入lib liquibase 的目录应该能让你更进一步。

关于java - centos上liquibase安装,JNI报错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53814853/

相关文章:

linux - 套接字可视化工具

shell - AWS CLI S3 Sync 排除在脚本中不起作用,直接在终端中起作用

java - Maven 和 Java 扩展

java - 事件总线 Guava 有一个无界队列

linux - Ubuntu Server VMware www 文件夹不工作

bash - 为什么 chmod 上的递归模式除了递归之外什么都做?

linux - 云服务器centos上的cpanel shell脚本没有这样的文件或目录

java - Jooq 在 sqlite 上存储后不返回主键

java - 为什么在 Java 中检测到的语言结果为空

regex - 在 bash 的一行中查找特定字符