【发布时间】:2018-09-23 21:07:50
【问题描述】:
(通过 Q/A 分享我自己的解决方法)
我在尝试将 liquibase 作为独立的 shell 脚本运行时遇到以下错误,来自 liquibase-3.6.2-bin.tar.gz 版本:
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:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 7 more
█
在谷歌搜索和检查liquibase shell 脚本后,我下载了这两个项目的 jar:
然后,我创建了一个相对于 liquibase 所在位置的 ./lib 目录,并将以下 jar 符号链接到其中:
- logback-classic-1.2.3.jar
- logback-core-1.2.3.jar
- slf4j-api-1.7.25.jar
- slf4j-simple-1.7.25.jar
在这些步骤之后,命令行 liquibase 工作了。
我同意this thread 中的一位发帖人提出的这些观点,sinc 目前很难将 liquibase 用作独立实用程序:
1) 此版本缺少自给自足所需的库。 2) 更进一步:Liquibase jar 的包装应该从使用 lib/ 文件夹转换为具有所有必需项的 Uber jar 包括库。
在 3.6.0 中似乎有针对同一问题的 bug report,但至少对我而言,在 3.6.2 中它尚未修复。
【问题讨论】: