如何处理从liquibase updateDatabase ant任务中获得的错误

时间:2013-08-29 15:43:42

标签: database ant error-handling return liquibase

我目前正致力于将liquibase更改应用于数据库。 我希望能够处理从liquibase updateDatabase任务中获取的错误。以下是我现在在构建文件中的内容(请记住我现在的工作正常,我只需要能够处理运行liquibase时可能遇到的错误)。

<target name="update_db" depends="prepare">
  <taskdef resource="liquibasetasks.properties">
    <classpath refid="classpath"/>
  </taskdef>    

  <updateDatabase
        changeLogFile="${db.changelog.file}"
        driver="${database.driver}"
        url="jdbc:mysql://localhost/${db.name}"
        username="${user}"
        password="${password}"
        promptOnNonLocalDatabase="not local database"
        dropFirst="false"
        classpathref="classpath"
  />    
</target> 

目前,当我收到错误时,我会得到类似的内容(从我创建的情况来演示):

BUILD FAILED
MYPATH\build.xml:15: The following error occurred while executing this line:
MYPATH\\build.xml:117: liquibase.exception.MigrationFailedException: Migration failed   
 for change set PATH/2.20.9/tables.xml::FFP-1384::AUSER:
 Reason: liquibase.exception.DatabaseException: Error executing SQL ALTER TABLE        
test.widget ADD full_screen BIT(1) DEFAULT 0: Duplicate column name   'full_screen'
.............. and a the wall of text continues

理想情况下,我希望能够从liquibase获取返回代码(而不是这个文本块)到ant中,然后根据它执行以下操作:

<echo message="this failed because ${reason}"/>

但不限于此。

我有办法从liquibase获取返回码吗?我最好的猜测是类似于ant exec任务,默认情况下返回代码被忽略,我希望有一些方法可以让我得到它。欢迎任何建议。

编辑:模糊的问题https://stackoverflow.com/questions/17856564/liquibase-3-0-2-logging-to-error-console

1 个答案:

答案 0 :(得分:0)

ant contrib trycatch任务使我能够处理错误,这被证明是一个合适的修复,因为无论如何堆栈跟踪实际上都很有用。

http://ant-contrib.sourceforge.net/tasks/tasks/trycatch.html

<trycatch property="foo" reference="bar">
  <try>
    <fail>Tada!</fail>
  </try>

  <catch>
    <echo>In &lt;catch&gt;.</echo>
  </catch>

  <finally>
    <echo>In &lt;finally&gt;.</echo>
  </finally>
</trycatch>

您需要下载ant contrib jar,如果您不想将它放在ANT_HOME中,那么您可以使用

<taskdef resource="net/sf/antcontrib/antcontrib.properties">
  <classpath>
    <pathelement location="PATH TO JAR"/>
  </classpath>
</taskdef>