【问题标题】:Flyway can't find Spring Java migrations on the classpath when using AntFlyway 在使用 Ant 时无法在类路径上找到 Spring Java 迁移
【发布时间】:2012-11-10 08:45:44
【问题描述】:

我在我的项目中设置了 Flyway,其目录布局如下(不相关目录除外):

$ tree database
database
├── lib
│   ├── flyway-ant-2.0.1.jar
│   ├── flyway-core-2.0.1.jar
│   ├── migrate.jar
│   ├── spring-beans-3.1.2.RELEASE.jar
│   ├── spring-core-3.1.2.RELEASE.jar
│   ├── spring-dao-2.0.8.jar
│   └── spring-jdbc-3.1.2.RELEASE.jar
└── updates
    ├── java
    │   └── database
    │       └── migrate
    │           └── V1_0__create_posts.java
    └── sql
        └── V1_1__create_users.sql

以及build.xml的相关部分(flyway.url和flyway.driver设置在一个属性文件中,这里不包含---Flyway与数据库对话没有问题):

<target name="path">
    <path id="migrate.build.path">
        <fileset dir="database/lib">
            <include name="flyway-*.jar"/>
        </fileset>
        <fileset dir="database/lib">
            <include name="spring-*.jar"/>
        </fileset>
    </path>
    <path id="flyway.lib.path">
        <fileset dir="database/lib">
            <include name="flyway-*.jar"/>
        </fileset>
    </path>
    <path id="flyway.classpath">
        <fileset dir="lib" includes="h2-*.jar"/>
        <fileset dir="database/lib" includes="migrate.jar"/>
    </path>
</target>

<target name="compile" depends="path">
    <mkdir dir="build"/>
    <javac srcdir="database/updates/java" destdir="build" includeantruntime="false" classpathref="migrate.build.path"/>
    <copy todir="build">
        <fileset dir="database/updates" excludes="**/*.java"/>
    </copy>
    <jar destfile="database/lib/migrate.jar" basedir="build" includes="sql/**,database/migrate/**"/>
</target>

<target name="init" depends="compile,path">
    <!-- imported tasks -->
    <taskdef uri="antlib:com.googlecode.flyway.ant" resource="com/googlecode/flyway/ant/antlib.xml" classpathref="flyway.lib.path"/>

    <property name="flyway.locations" value="sql,database.migrate"/>
</target>

<!-- flyway tasks -->
<target name="db:clean" depends="init">
    <flyway:clean/>
</target>
<target name="db:init" depends="init">
    <flyway:init/>
</target>
<target name="db:migrate" depends="init">
    <flyway:migrate/>
</target>
<target name="db:validate" depends="init">
    <flyway:validate/>
</target>
<target name="db:info" depends="init">
    <flyway:info/>
</target>
<target name="db:status" depends="init,db:info"/>
<target name="db:repair" depends="init">
    <flyway:repair/>
</target>

这是在编译目标中创建的迁移 JAR 的布局:

$ unzip -l database/lib/migrate.jar 
Archive:  database/lib/migrate.jar
  Length     Date   Time    Name
 --------    ----   ----    ----
        0  01-14-13 16:27   META-INF/
      103  01-14-13 16:27   META-INF/MANIFEST.MF
        0  01-14-13 16:21   database/
        0  01-14-13 16:27   database/migrate/
        0  01-14-13 16:27   sql/
      538  01-14-13 16:27   database/migrate/V1_0__create_posts.class
        0  01-14-13 16:27   sql/V1_1__create_users.sql
 --------                   -------
      641                   7 files

这是flyway:info的输出:

[flyway:info] +-------------+------------------------+---------------------+---------+
[flyway:info] | Version     | Description            | Installed on        | State   |
[flyway:info] +-------------+------------------------+---------------------+---------+
[flyway:info] | 0           | << Flyway Init >>      | 2013-01-14 14:14:09 | Missing |
[flyway:info] | 1.1         | create users           |                     | Pending |
[flyway:info] +-------------+------------------------+---------------------+---------+

Flyway 未发现 .class 文件。我在这里做错了什么?

编辑:如果有人知道使用 Ant(没有 Maven,没有 Ivy)设置 Flyway 的工作示例,将不胜感激。


更新

事实证明,Flyway 会找到 JdbcMigration 类,但不会找到 SpringJdbcMigration

此迁移已成功加载:

/* database/updates/java/database/migrate/V1_0__create_posts.java */
import com.googlecode.flyway.core.api.migration.jdbc.JdbcMigration;
import java.sql.Connection;

public class V1_0__create_posts implements JdbcMigration {
    public void migrate(Connection conn) throws Exception {
        conn.createStatement().execute(
            "create table posts (id integer primary key, title varchar(255), body text)"
        );
    }
}

但是这个被跳过了:

/* database/updates/java/database/migrate/V1_0__create_posts.java */
import org.springframework.jdbc.core.JdbcTemplate;
import com.googlecode.flyway.core.api.migration.spring.SpringJdbcMigration;

public class V1_0__create_posts implements SpringJdbcMigration {
    public void migrate(JdbcTemplate template) throws Exception {
        template.execute(
            "create table posts (id integer primary key, title varchar(255), body text)"
        );
    }
}

这是使用SpringJdbcMigration 时的 Ant 调试输出:

[antlib:com.googlecode.flyway.ant] Could not load definitions from resource com/googlecode/flyway/ant/antlib.xml. It could not be found.                  [4/873]
[flyway:info] Database: H2 1.2
[flyway:info] DDL Transactions Supported: false
[flyway:info] Schema: PUBLIC
[flyway:info] No metadata table upgrade necessary
[flyway:info] Spring Jdbc available: false
[flyway:info] Scanning for resources at 'database/migrate' (Prefix: 'V', Suffix: '.sql')
[flyway:info] Scanning URL: jar:file:.../flyway-sample/database/lib/migrate.jar!/database/migrate
[flyway:info] JBoss VFS v2 available: false
[flyway:info] Filtering out resource: database/migrate/ (filename: )
[flyway:info] Filtering out resource: database/migrate/V1_0__create_posts.class (filename: V1_0__create_posts.class)
[flyway:info] Scanning for classes at 'database/migrate' (Implementing: 'com.googlecode.flyway.core.api.migration.jdbc.JdbcMigration')
[flyway:info] Scanning URL: jar:file:.../flyway-sample/database/lib/migrate.jar!/database/migrate
[flyway:info] Filtering out resource: database/migrate/ (filename: )
[flyway:info] Scanning for resources at 'db/migration' (Prefix: 'V', Suffix: '.sql')
[flyway:info] Unable to determine URL for classpath location: db/migration (ClassLoader: AntClassLoader[.../flyway-sample/lib/h2-1.2.135.jar:.../flyway-sample/database/lib/migrate.jar])
[flyway:info] Scanning for classes at 'db/migration' (Implementing: 'com.googlecode.flyway.core.api.migration.jdbc.JdbcMigration')
[flyway:info] Unable to determine URL for classpath location: db/migration (ClassLoader: AntClassLoader[.../flyway-sample/lib/h2-1.2.135.jar:.../flyway-sample/database/lib/migrate.jar])
[flyway:info] Scanning for resources at 'sql' (Prefix: 'V', Suffix: '.sql')
[flyway:info] Scanning URL: jar:file:.../flyway-sample/database/lib/migrate.jar!/sql
[flyway:info] Filtering out resource: sql/ (filename: )
[flyway:info] Found resource: sql/V1_1__create_users.sql
[flyway:info] Scanning for classes at 'sql' (Implementing: 'com.googlecode.flyway.core.api.migration.jdbc.JdbcMigration')
[flyway:info] Scanning URL: jar:file:.../flyway-sample/database/lib/migrate.jar!/sql
[flyway:info] Filtering out resource: sql/ (filename: )
[flyway:info] Filtering out resource: sql/V1_1__create_users.sql (filename: V1_1__create_users.sql)
[flyway:info] +-------------+------------------------+---------------------+---------+
[flyway:info] | Version     | Description            | Installed on        | State   |
[flyway:info] +-------------+------------------------+---------------------+---------+
[flyway:info] | 0           | << Flyway Init >>      | 2013-01-14 14:14:09 | Missing |
[flyway:info] | 1.1         | create users           |                     | Pending |
[flyway:info] +-------------+------------------------+---------------------+---------+

【问题讨论】:

    标签: java ant classpath flyway


    【解决方案1】:

    Java 迁移必须首先编译。 (Flyway 查找 .class 文件)

    我已更新 the docs 以更清楚地说明这一点。

    【讨论】:

    • 我刚刚更新了这个问题,详细说明了我如何首先尝试编译迁移。还是没有运气...
    • 我添加了第二个更新,详细说明了我如何编译 Java 类并将它们与 SQL 文件一起添加到类路径中。有什么我在这里想念的想法吗?
    • Adam,请收起你所有的问题更新,只显示最新情况(构建文件、目录布局、flyway 版本)
    • Adam,如果不包含 ant 变量、Flyway 调用和 Flyway 版本的值,很难理解。请更新。还有 updates/ 是什么意思?
    • 我已经扩展了对其值的所有属性引用,并包含了 flyway 任务定义。还添加了更清晰的目录布局,并注意到除了flyway.locations之外唯一设置的flyway属性是flyway.driver和flyway.url,数据库连接不是问题。
    【解决方案2】:

    原来我没有所有 Spring JDBC 迁移依赖项。

    我下载了the latest Flyway (2.0.3) with Ant & Spring dependencies,将新的 JAR 添加到类路径中,Flyway 现在可以找到 Spring JDBC 迁移。

    【讨论】:

      猜你喜欢
      • 2012-03-04
      • 2012-02-07
      • 2020-04-29
      • 2015-08-19
      • 2012-11-17
      • 2019-07-12
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      相关资源
      最近更新 更多