将HSQLDB与SQL Maven插件和jOOQ一起使用

这是一个类似的问题,如使用Flyway的嵌入式数据库和Maven中的jOOQ进行持续集成 ,尽管与我们使用的是sql-maven-plugin并不完全相同,而不是Flyway。

以下Maven插件配置失败:

SQL-Maven的插件

  org.codehaus.mojo sql-maven-plugin 1.5   create-database generate-sources  execute   ${db.driver} ${db.url} ${db.username} ${db.password}  src/main/resources/sql/create-db.sql       org.hsqldb hsqldb ${hsqldb.version}    

jooq-CODEGEN,行家

  org.jooq jooq-codegen-maven ${jooq.version}   generate-hsqldb generate-sources  generate    ${db.driver} ${db.url} ${db.username} ${db.password}    PUBLIC   com.example.db target/generated-sources/jooq-hsqldb       

错误是:

 java.sql.SQLException: Database lock acquisition failure: lockFile: org.hsqldb.persist.LockFile@cc76d81d[file =C:\Users\Lukas\example.db.lck, exists=true, locked=false, valid=false, ] method: checkHeartbeat read: 2015-10-14 10:49:15 heartbeat - read: -9975 ms. at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) at org.hsqldb.jdbc.JDBCConnection.(Unknown Source) at org.hsqldb.jdbc.JDBCDriver.getConnection(Unknown Source) at org.hsqldb.jdbc.JDBCDriver.connect(Unknown Source) at org.jooq.util.GenerationTool.run(GenerationTool.java:208) at org.jooq.util.GenerationTool.generate(GenerationTool.java:180) at org.jooq.util.maven.Plugin.execute(Plugin.java:131) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:347) at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:154) at org.apache.maven.cli.MavenCli.execute(MavenCli.java:582) at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:214) at org.apache.maven.cli.MavenCli.main(MavenCli.java:158) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) 

如何解决这个问题呢?

正如其他问题所解释的那样,jofQ与Flyway一起使用时 ,HSQLDB在类加载器的基础上锁定数据库存在问题。 这里涉及的两个maven插件不共享相同的类加载器,因此第二个插件无法访问第一个类加载器嵌入的数据库,除非:

  • 在第一个脚本中调用SHUTDOWN IMMEDIATELY (但这有点难看,因为在其他上下文中也可能需要脚本)
  • JVM被关闭(但在Maven的上下文中这非常难看)

解决方法是指定sql-maven-plugin的第二次执行,它显式调用SHUTDOWN IMMEDIATELY命令:

  create-database generate-sources ...   shutdown-database generate-sources  execute   ${db.driver} ${db.url} ${db.username} ${db.password} SHUTDOWN IMMEDIATELY