【问题标题】:unable to use liquibase standalone shell script无法使用 liquibase 独立 shell 脚本
【发布时间】: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 中它尚未修复。

【问题讨论】:

    标签: java liquibase


    【解决方案1】:

    在谷歌搜索和检查 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 工作了。

    我同意此线程中一位发帖人提出的这些观点,因为目前很难将 liquibase 用作独立实用程序:

    1) 此版本缺少自给自足所需的库。 2) 更进一步:Liquibase jar 的包装应从 利用 lib/ 文件夹成为包含所有必需库的 Uber jar 包括在内。

    在 3.6.0 中似乎有针对同一问题的错误报告,但至少对我而言,在 3.6.2 中尚未修复。

    【讨论】:

      【解决方案2】:

      liquibase有依赖,正常。

      您可以使用构建工具(也称为 maven 或 gradle)构建 uberjar 或构建 lib 文件夹(包含所需的依赖项)。

      此外,它还允许您打包脚本脚本以从命令行启动数据库更新,例如 Zip 格式。

      【讨论】:

      • 独立的 shell 脚本似乎是为了自给自足,它会寻找 lib/ 目录来增强类路径,但如所述,此版本中缺少依赖项,请参阅 liquibase.jira.com/browse/CORE-3222
      • 我认为 mvn/gradle 构建了一个自制存档,以获取所有需要的依赖项
      • liquibase cli 的用户可能不一定在他们自己的开发堆栈中使用 java
      • 不管是什么工具,更重要的是将liquibase调用集成到构建工具中
      • 是的。但是没有必要假设构建工具是 mvn/gradle,它可能是一个用于非 java 应用程序的简单 shell 脚本,它不应该被打包 liquibase 依赖项所累。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 2011-07-15
      • 2023-03-17
      • 2016-07-17
      • 2015-06-05
      • 2018-11-03
      • 2017-06-09
      相关资源
      最近更新 更多