2014-11-04 45 views
2

尝试从命令行(bash脚本)运行对liquibase的调用。这个作品,如果我在一台服务器(Red Hat Linux的),运行它,但如果我从一个cygwin提示符下运行它,我得到一个错误:从Cygwin调用liquibase命令行

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

灿不明白为什么。

+0

cygwin上'which java'的输出是什么? – SteveDonie 2014-11-04 15:54:50

+0

指向C驱动器上的Java安装。 Java JDK 1.7.0_51 – jne 2014-11-05 06:25:16

+2

类路径条目'../ liquibase-core-3.1.1'应该是'../ liquibase-core-3.1.1/*' – 2014-11-06 06:47:16

回答

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 

并号召使用

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

这种精细的工作都在服务器上,并在Cygwin上的liquibase CLI。

0

问题是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 <path>带有该标志`

0

问题的产生是因为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所需的。