【问题标题】:Calling liquibase commandline from Cygwin从 Cygwin 调用 liquibase 命令行
【发布时间】:2023-03-25 08:31:02
【问题描述】:

尝试从命令行(bash 脚本)运行对 liquibase 的调用。如果我在服务器(Red hat linux)上运行它,这可以工作,但如果我从 cygwin 提示符运行它会出现错误:

java -cp ../liquibase-core-3.1.1:../ojdbc6-11.2.0.3.jar liquibase.integration.commandline.Main --driver=oracle.jdbc.OracleDriver \
    --changeLogFile=database/master.xml --url=${schema_url} --username=${schema_username} --password=${schema_password} \
    --contexts=${schema_context}  migrate

我得到错误:

Error: Could not find or load main class liquibase.integration.commandline.Main

不明白为什么。

【问题讨论】:

  • cygwin 上which java 的输出是什么?
  • 指向 C 盘上的 Java 安装。 Java JDK 1.7.0_51
  • 类路径条目../liquibase-core-3.1.1应该是../liquibase-core-3.1.1/*
  • 试过但没有效果...

标签: bash liquibase


【解决方案1】:

找到解决问题的方法。使用信息创建了一个 liquibase.properties 文件,

url: <url>
username: <username>
password: <password>
contexts: global,dev
driver: oracle.jdbc.OracleDriver
classpath: ../ojdbc6-11.2.0.3.jar
changeLogFile: database/master.xml

并使用

调用 liquibase CLI
java -jar ../liquibase-core-3.1.1.jar --defaultsFile=../foo/fum/liquibase.properties migrate

这在服务器和 cygwin 上都运行良好。

【讨论】:

    【解决方案2】:

    出现问题是因为 Java 需要 Windows 样式路径,但 liquibase 脚本发出 unix 样式路径。另见讨论how to run Java from cygwin。建议的解决方案是通过 cygpath 修复它。

    不过,根本情况有所不同。如果您查看 liquibase 的启动脚本,您会看到以下代码

    # build classpath from all jars in lib
    if [ -f /usr/bin/cygpath ]; then
      CP=.
      for i in "$LIQUIBASE_HOME"/liquibase*.jar; do
        i=`cygpath --windows "$i"`
        CP="$CP;$i"
      done
      for i in "$LIQUIBASE_HOME"/lib/*.jar; do
        i=`cygpath --windows "$i"`
        CP="$CP;$i"
      done
    else
      if [[ $(uname) = MINGW* ]]; then
        CP_SEPARATOR=";"
      else
        CP_SEPARATOR=":"
      fi
      CP=.
      for i in "$LIQUIBASE_HOME"/liquibase*.jar; do
        CP="$CP""$CP_SEPARATOR""$i"
      done
      for i in "$LIQUIBASE_HOME"/lib/*.jar; do
        CP="$CP""$CP_SEPARATOR""$i"
      done
    fi
    

    这是脚本检查 cygpath 是否存在,如果找到它就会解决问题。很有可能你缺少 cygpath。

    如果which cygpath 结果为/usr/bin/cygpath,那么一切都应该按预期工作。否则你就找到了根本原因。

    这引发了一个问题,为什么缺少 cygpath 以及如何获取它。就我而言,我删除了(过时的)git / gitbash 安装并安装了最新版本。这附带了一个最新的 gitbash,其中包括所需的 cygpath。

    【讨论】:

      【解决方案3】:

      问题在于 CYGWIN 上的 Java 在解析 PATH 时存在问题。为此添加

      cygwinpath -wp
      

      要解决这个问题替换

      java -cp ../liquibase-core-3.1.1:../ojdbc6-11.2.0.3.jar
      

      java -classpath \`cygpath -wp ../liquibase-core-3.1.1:../ojdbc6-11.2.0.3.jar\`
      

      记得用这个标记包围cygwint -wp &lt;path&gt;`

      【讨论】:

        【解决方案4】:

        在main中检查主类jar文件“liquibase.jar”

        【讨论】:

        • 嗨,欢迎来到俱乐部。你最好解释一下你的答案。
        • 同意@Yasen,你的回答可能是一个指导,但在目前的状态下,它非常模棱两可。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-10
        • 1970-01-01
        • 2012-03-04
        • 1970-01-01
        • 2015-04-28
        相关资源
        最近更新 更多