Каков classpath flywayDb при использовании Gradle? - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь создать простой gradle-проект, который нужно просто использовать для переноса базы данных с использованием flywayDb, используя скрипты миграции, которые хранятся в файлах JAR в другом каталоге.Этот каталог никак не связан со сборкой gradle.Он создается и заполняется с использованием другого механизма в рамках проекта.

(по крайней мере, для меня) очевидный скрипт не работал:

[...]

// flyway plugin
apply plugin: 'org.flywaydb.flyway'

// dependencies
dependencies {
    compile fileTree(dir: '/workspace/WEB-INF/lib', include: '*.jar')
}

// flyway configuration
flyway {
    [...]
    locations = [ 'classpath:/META-INF/db' ]
}

При вызове задачи переноса с прохода все, что я получаюравно

Unable to resolve location classpath:META-INF/db

и ничего не перенесено.Если я извлекаю файлы JAR и использую местоположение filesystem, оно работает нормально.Поэтому я предполагаю, что путь к классу, который использует этот путь, не включает в себя файлы JAR.

Это подводит меня к моему вопросу: какой путь к классу использует путь для поиска сценариев базы данных?И как я могу добавить к этому простые файлы JAR из файловой системы?

Редактировать:

Завершить build.gradle после комментария:

// add JDBC drivers (for flyway) and flyway itself to classpath
buildscript {
        repositories {
                maven {
                        url "https://plugins.gradle.org/m2/"
                }
        }
        dependencies {
                classpath group: 'gradle.plugin.com.boxfuse.client', name: 'gradle-plugin-publishing', version: '5.0.7'
                classpath group: 'mysql', name: 'mysql-connector-java', version: '5.1.42'
        }
}

// flyway plugin
apply plugin: 'org.flywaydb.flyway'

// configurations
configurations {
        flywayClasspath
}

// dependencies
dependencies {
        flywayClasspath fileTree(dir: '/workspace/WEB-INF/lib', include: '*.jar')
        flywayClasspath files('/workspace/WEB-INF/classes')
}

// get needed data for connection
def dbPassword = System.getenv('MYSQL_ROOT_PASSWORD')
def dbName = System.getenv('PROJECTNAME')

// flyway configuration
flyway {
        configurations = [ 'flywayClasspath' ]
        url = "jdbc:mysql://localhost/${dbName}?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf-8&useLegacyDatetimeCode=false&serverTimezone=Europe/Berlin&useSSL=false"
        driver = 'com.mysql.jdbc.Driver'
        user = 'root'
        password = dbPassword
        locations = [ "classpath:/META-INF/db/mysql" ]
        table = 'schema_version'
        outOfOrder = true
        ignoreMissingMigrations = true
}

1 Ответ

0 голосов
/ 14 мая 2018

Я вижу из исходного кода , что есть свойство configurations.Я предполагаю, что по умолчанию он использует путь к классу buildscript.Если вам нужны скомпилированные классы на classpath flyway, вы можете сделать что-то вроде

apply plugin: 'java'
apply plugin: 'x.y.flyway'

configurations {
    flyway
}
dependencies {
    flyway sourceSets.main.runtimeClasspath
}
flyway.configurations = ['flyway']
flywayMigrate.dependsOn compileJava
...