Liquibase作为ant任务:找不到changelogs.xml的相对路径

时间:2013-05-05 10:34:12

标签: ant liquibase

我使用2.0.5版本的Liquibase来测试数据库迁移。目前,如果我将changeLogFile属性定义为updateDatabase任务<updateDatabase changeLogFile="${changeLogFile}"并且"${changeLogFile}"liquibase.properties中指定为changeLogFile=com/db/master.changelog.xml,则文件{ {1}}将找到。

我使用Eclispe和ant standalone开始了一项蚂蚁任务。

所以我对master.changelog.xml使用了以下修复:

${basedir}/**src**/

但如果没有这么脏的解决方案,我会非常高兴。

我尝试使用/ bin-directory

指定XML文件的类路径
<updateDatabase changeLogFile="${basedir}/src/${changeLogFile}"

但是发生了很多异常,所以我注释掉了这个块。

我做错了什么?

<fileset dir="bin"> <include name="**/*.xml" /> </fileset> 文件包含:

liquibase.properties

changeLogFile=com/db/master.changelog.xml driver=org.h2.Driver url=jdbc:h2:tcp://localhost/testhiberliq username=sa password= #for diff between two databases baseUrl=jdbc:h2:tcp://localhost/testhiberliq baseUsername=sa basePassword= dropFirst=false tag=version 1.4 outputFile=outputFile.xml outputDiffFile=outputFile.txt (用作NewFile1.xml):

build.xml

<?xml version="1.0" encoding="UTF-8"?> <project name="liquibase-sample"> <property file="liquibase.properties" /> <path id="lib.path"> <fileset dir="lib"> <include name="**/*.jar" /> </fileset> <!-- <fileset dir="bin"> <include name="**/*.xml" /> </fileset> --> </path> <taskdef resource="liquibasetasks.properties"> <classpath refid="lib.path" /> </taskdef> <target name="update-database"> <!-- <taskdef name="updateDatabase" classpathref="lib.path" />--> <updateDatabase changeLogFile="${basedir}/src/${changeLogFile}" driver="${driver}" url="${url}" username="${username}" password="${password}" dropFirst="${dropfirst}" classpathref="lib.path" /> </target> </project>

master.changelog.xml

目录树:

<?xml version="1.0" encoding="UTF-8"?> 
<databaseChangeLog 
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.9" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.9
                      http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.9.xsd"> 

  <include file="changelog/included.changelog.xml" relativeToChangelogFile="true"/> 
  <include file="changelog/included2.changelog.xml" relativeToChangelogFile="true"/> 
  <include file="changelog/included3.changelog.xml" relativeToChangelogFile="true"/> 

</databaseChangeLog> 

1 个答案:

答案 0 :(得分:0)

该任务将从类路径中检索更改日志文件。您需要将运行时根目录添加到路径中,如下所示:

<path id="lib.path">
    ..
    ..
    <pathelement location="bin"/>
</path>

并按如下方式更改任务:

<updateDatabase changeLogFile="com/db/master.changelog.xml" ...

主更改日志文件还需要个人更改文件的完整路径:

<databaseChangeLog .. 

  <include file="com/db/changelog/included.changelog.xml"/> 
  <include file="com/db/changelog/included2.changelog.xml"/> 
  <include file="com/db/changelog/included3.changelog.xml"/> 

</databaseChangeLog> 

在运行时,liquibase会查看本地目录或类路径中列出的jar和目录。

为什么这么复杂?此方法可以将changelog文件打包为jar存档,可以单独或与代码一起打包。非常有用。