在做一个Vert.x项目时遇到下面的这个问题:
func[VertxMain.flywayStartup] Exception [org.flywaydb.core.api.FlywayException: Unable to instantiate class com.mysql.cj.jdbc.Driver : com.mysql.cj.jdbc.Driver - Unable to instantiate JDBC driver: com.mysql.cj.jdbc.Driver => Check whether the jar file is present] stackTrace[[org.flywaydb.core.internal.jdbc.DriverDataSource.<init>(DriverDataSource.java:180), org.flywaydb.core.internal.jdbc.DriverDataSource.<init>(DriverDataSource.java:144), org.flywaydb.core.api.configuration.ClassicConfiguration.setDataSource(ClassicConfiguration.java:1341), org.flywaydb.core.api.configuration.FluentConfiguration.dataSource(FluentConfiguration.java:803), io.yzh.VertxMain.flywayStartup(VertxMain.java:49), io.yzh.VertxMain.main(VertxMain.java:24)]]
从上面的输出可以看到本次的Vert.x项目采用了flyway作为数据库的版本控制工具,而在项目启动的时候无法采用com.mysql.cj.jdbc.Driver
进行数据库连接初始化。我们检查了一下项目发现,原来是MySQL8.x的JDBC包并没有在pom.xml中引入。于是引入后重新启动又抛出另一个异常:
2020-05-09 11:30:44,311:ERROR main (VertxMain.java:53) - func[VertxMain.flywayStartup] Exception [java.nio.charset.MalformedInputException: Input length = 1 - Unable to calculate checksum of V1.0.00001__v20200506.18.31_CREATE_COMIC_BOOK.sql
Input length = 1] stackTrace[[org.flywaydb.core.internal.resolver.ChecksumCalculator.calculateChecksumForResource(ChecksumCalculator.java:80), org.flywaydb.core.internal.resolver.ChecksumCalculator.calculate(ChecksumCalculator.java:46), org.flywaydb.core.internal.resolver.sql.SqlMigrationResolver.getChecksumForLoadableResource(SqlMigrationResolver.java:143), org.flywaydb.core.internal.resolver.sql.SqlMigrationResolver.addMigrations(SqlMigrationResolver.java:181), org.flywaydb.core.internal.resolver.sql.SqlMigrationResolver.resolveMigrations(SqlMigrationResolver.java:88), org.flywaydb.core.internal.resolver.sql.SqlMigrationResolver.resolveMigrations(SqlMigrationResolver.java:44), org.flywaydb.core.internal.resolver.CompositeMigrationResolver.collectMigrations(CompositeMigrationResolver.java:127), org.flywaydb.core.internal.resolver.CompositeMigrationResolver.doFindAvailableMigrations(CompositeMigrationResolver.java:109), org.flywaydb.core.internal.resolver.CompositeMigrationResolver.resolveMigrations(CompositeMigrationResolver.java:95), org.flywaydb.core.internal.resolver.CompositeMigrationResolver.resolveMigrations(CompositeMigrationResolver.java:46), org.flywaydb.core.internal.info.MigrationInfoServiceImpl.refresh(MigrationInfoServiceImpl.java:130), org.flywaydb.core.internal.command.DbValidate$2.call(DbValidate.java:142), org.flywaydb.core.internal.command.DbValidate$2.call(DbValidate.java:130), org.flywaydb.core.internal.jdbc.TransactionalExecutionTemplate.execute(TransactionalExecutionTemplate.java:66), org.flywaydb.core.internal.command.DbValidate.validate(DbValidate.java:130), org.flywaydb.core.Flyway.doValidate(Flyway.java:279), org.flywaydb.core.Flyway.access$100(Flyway.java:74), org.flywaydb.core.Flyway$1.execute(Flyway.java:167), org.flywaydb.core.Flyway$1.execute(Flyway.java:159), org.flywaydb.core.Flyway.execute(Flyway.java:530), org.flywaydb.core.Flyway.migrate(Flyway.java:159), io.yzh.VertxMain.flywayStartup(VertxMain.java:51), io.yzh.VertxMain.main(VertxMain.java:24)]]
后面经过排查flyway执行项目中对应位置的SQL文件,而文件的编码为GB2312
引发的执行错误。这里需要将文件重新转换成UTF-8
,至此就可以解决问题。