提问者:小点点

从Cygwin调用likibase命令行


尝试从命令行(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

我收到错误:

< code >错误:无法找到或加载主类liqui base . integration . command line . main

看不出为什么。


共3个答案

匿名用户

找到了解决问题的方法。创建了一个包含信息的 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

并使用

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

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

匿名用户

问题的出现是因为Java需要一个windows风格的路径,而liquibase脚本则需要一个unix风格的路径。另请参阅如何从cygwin运行Java的讨论。建议的解决方案是通过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。

如果< code >哪个cygpath产生< code>/usr/bin/cygpath,那么一切都应该按预期工作。否则你已经找到了根本原因。

这就提出了cygpath为什么缺失,如何获取的问题。在我的例子中,我移除了(过时的)git / gitbash安装,安装了最新版本。这带来了最新的gitbash,其中包含了所需的cygpath。

匿名用户

问题是CYGWIN上的 Java 在解决PATHs方面存在问题

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