org.flywaydb.core.api.FlywayException:当从ant taskdef触发我的java类时,无法实例化JDBC驱动程序

时间:2017-04-19 03:16:23

标签: java sql-server jdbc ant flyway

我编写了一个java类,它使用从taskdef动作类路径加载的依赖jar flyway-core-4.0.3.jar并调用flyway jar中的方法,以下是导致该代码的部分代码问题

   public static boolean executeFlywayMigrate(String connectionUrl, String username, String password,
        String scriptLocation, String[] databaseNames, Map<String, String> componentProperties,
        boolean validateOnMigrate)
        throws SQLException {
    LOGGER.info("Database schemas for migration are :" + Arrays.toString(databaseNames));
    try {
        Flyway flyway = new Flyway();
        flyway.setLocations(scriptLocation);
        flyway.setSchemas(databaseNames);
        flyway.setBaselineOnMigrate(true);
        flyway.setDataSource(connectionUrl, username, password);
        if (componentProperties != null) {
            flyway.setPlaceholders(componentProperties);
        }
        flyway.setValidateOnMigrate(validateOnMigrate);
        flyway.repair();
        flyway.migrate();
    } catch (RuntimeException e) {
        LOGGER.error("Database migration failed.", e);
        throw new SQLException(e);
    }

我使用taskdef动作使用ant触发类。我为taskdef操作提供了classpathref。

<taskdef name="ExecuteMigrationScripts" classname="com.install.common.db.action.ExecuteMigrationScripts" 
                classpathref="class.dependencies" loaderref="class.dependencies.loader"/>
<ExecuteMigrationScripts/> 

只有当flyway尝试搜索db jar时才会出现问题(在我的情况下,我已尝试使用mysql-connector-java-5.1.39-bin.jar和sqljdbc41.jar但出现同样的问题)。

注意:如果我从taskdef操作触发了一个不同的类,它尝试连接到数据库并创建一个示例数据库模式,那可以正常工作,并且可以从taskdef操作中提到的类路径加载相同的db jars但是只有当flyway试图找到db jar时才会出现问题。

如果我在这里遗漏了什么,请帮助我。

1 个答案:

答案 0 :(得分:1)

即使所有驱动程序jar都在类路径中添加,同时调用taskdef操作,flyway也无法获取jdbc驱动程序的类路径。

但是使用命令“ant -lib path_to_the_jdbc_driver_jars”设置classpath解决了我的问题。