He creado algunos back-ends con Node/Express y Go, pero esta es la primera vez que intento crear uno con Java/Spring.
Me dijeron que Flyway es la mejor herramienta para las migraciones. Hice funcionar las migraciones de SQL para configurar el esquema para todas mis tablas, ahora estoy tratando de generar una tabla de user con una migración basada en Java.
Ahora, cuando llamo a gradle flywayMigrate , aparece este error:
loader constraint violation in interface itable initialization: when resolving method "db.migration.V2_1__Add_Users.migrate(Lorg/springframework/jdbc/core/JdbcTemplate;)V" the class loader (instance of java/net/URLClassLoader) of the current class, db/migration/V2_1__Add_Users, and the class loader (instance of org/gradle/internal/classloader/VisitableURLClassLoader) for interface org/flywaydb/core/api/migration/spring/SpringJdbcMigration have different Class objects for the type org/springframework/jdbc/core/JdbcTemplate used in the signatureEsto es lo que tengo en build.gradle:
buildscript { ext { springBootVersion = '1.5.2.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } plugins { id "org.flywaydb.flyway" version "4.1.2" } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' apply plugin: 'project-report' flyway { url = 'jdbc:mysql://localhost/upshift?serverTimezone=UTC' user = 'root' locations = ['db.migration'] } version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { compile('org.springframework.boot:spring-boot-starter-data-jpa') compile('org.flywaydb:flyway-core') compile('org.springframework.boot:spring-boot-starter-web') compile('org.springframework.boot:spring-boot-starter-security') compile("org.springframework:spring-jdbc") runtime('mysql:mysql-connector-java') testCompile('org.springframework.security:spring-security-test') testCompile('org.springframework.boot:spring-boot-starter-test') }Y esta es la clase Java con la que estoy tratando de migrar:
package db.migration; import org.flywaydb.core.api.migration.spring.SpringJdbcMigration; import org.springframework.jdbc.core.JdbcTemplate; public class V2_1__Add_Users implements SpringJdbcMigration { public void migrate(JdbcTemplate jdbcTemplate) throws Exception { jdbcTemplate.execute("INSERT INTO users (email, password) VALUES ('test@test.com', 'test123')"); } }¿Alguna idea de lo que podría estar pasando? Busqué por aquí y busqué un poco en Google, pero no encontré otros ejemplos similares. La razón principal por la que estoy haciendo una migración de Java es para poder intentar traer bCrypt para codificar las contraseñas de mis usuarios sembrados, pero definitivamente es posible que esté pensando en esto incorrectamente. ¡Cualquier idea sería muy apreciada!
Necesitaba agregar spring-jdbc a las dependencias de buildscript para que esto funcione con Flyway 4.1.2.
Flyway 4.0.3 funcionó sin él.
buildscript { ext { springBootVersion = '1.5.2.RELEASE' springVersion = '4.3.7.RELEASE' flywayVersion = '4.1.2' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") classpath("org.flywaydb:flyway-gradle-plugin:${flywayVersion}") classpath("org.springframework:spring-jdbc:${springVersion}") } } apply plugin: 'java' apply plugin: 'idea' apply plugin: 'org.springframework.boot' apply plugin: 'project-report' apply plugin: 'org.flywaydb.flyway' flyway { url = 'jdbc:mysql://localhost/upshift?serverTimezone=UTC' user = 'root' password = 'root' locations = ['db.migration'] } version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { compile('org.springframework.boot:spring-boot-starter-data-jpa') compile("org.flywaydb:flyway-core:${flywayVersion}") compile('org.springframework.boot:spring-boot-starter-web') compile('org.springframework.boot:spring-boot-starter-security') runtime('mysql:mysql-connector-java') testCompile('org.springframework.security:spring-security-test') testCompile('org.springframework.boot:spring-boot-starter-test') }También agregué una versión explícita de Flyway a las dependencias de compilación para garantizar que se usaría la misma versión para las tareas de Gradle y en tiempo de ejecución.
compile("org.flywaydb:flyway-core:${flywayVersion}")Creé un ejemplo de trabajo en este repositorio .