3

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

我使用 Eclispe 和 ant 独立启动了一个 ant 任务。

所以我使用以下修复${basedir}/**src**/

<updateDatabase changeLogFile="${basedir}/src/${changeLogFile}"

但是如果没有这样一个肮脏的解决方案,我会很高兴。

我尝试使用 /bin-directory 指定 XML 文件的类路径

<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> 

和目录树:

I:.
│   .classpath
│   .project
│   liquibase.properties
│   NewFile.xml
│   NewFile1.xml
│   outputFile.txt
│   outputFile.xml
│
├───.settings
│       org.eclipse.jdt.core.prefs
│
├───bin
│   │   hibernate.cfg.xml
│   │
│   ├───com
│   │   └───db
│   │       │   master.changelog.xml
│   │       │
│   │       └───changelog
│   │               included.changelog.xml
│   │               included2.changelog.xml
│   │               included3.changelog.xml
│   │
│   └───testproject
│       │   Main.class
│       │
│       └───database
│           │   DatabaseDAO.class
│           │
│           └───pojo
│                   Users.class
│
├───lib
│       h2-1.3.168.jar
│       liquibase.jar
│
└───src
    │   hibernate.cfg.xml
    │
    ├───com
    │   └───db
    │       │   master.changelog.xml
    │       │
    │       └───changelog
    │               included.changelog.xml
    │               included2.changelog.xml
    │               included3.changelog.xml
    │
    └───testproject
        │   Main.java
        │
        └───database
            │   DatabaseDAO.java
            │
            └───pojo
                    Users.java
4

1 回答 1

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 和目录内部。

为什么会有这种复杂性?这种方法可以将变更日志文件打包为 jar 存档,单独或与您的代码一起打包。很有用。

于 2013-05-06T11:21:40.547 回答