Liquibase Hibernate plugin not working

As described here ( https://github.com/liquibase/liquibase-hibernate/issues/74 ) I had a problem with the libibase-hibernate extension working correctly. I think everything is set up for me, but it seems that I am constantly confronted with such strange problems. I feel like I am missing something simple, but I think I followed all the instructions.

I am using Liquibase 3.3.2, Hibernate 4.3.0.Final, java 1.7.0_71 and linibase-hibernate4-3.5.jar. My CLASSPATH environment variable is empty, but some things are added to it by the Liquibase script shell. When I use regular linibase commands that interact, and I remove the extension from the $ LIQUIBASE_HOME / lib / directory without the extension, it works just fine. I re-run the commands with DEBUG output to provide additional information.

$ echo $CLASSPATH $ java -version java version "1.7.0_71" Java(TM) SE Runtime Environment (build 1.7.0_71-b14) Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode) $ liquibase --version Liquibase Version: 3.3.2 $ liquibase diffChangeLog //The below is the stuff liquibase is adding to my classpath .:/c/repos/ServeDirtyLibsInJava/liquibaseLib/liquibase.jar:/c/repos/ServeDirtyLibsInJava/liquibaseLib/lib/liquibase-hibernate4-3.5.jar:/c/repos/ServeDirtyLibsInJava/liquibaseLib/lib/snakeyaml-1.13.jar WARNING 1/19/15 12:42 AM: liquibase: Can not use class liquibase.ext.hibernate.database.HibernateEjb3Database as a Liquibase service because org.hibernate.dialect.Dialect is not in the classpath WARNING 1/19/15 12:42 AM: liquibase: Can not use class liquibase.ext.hibernate.database.HibernateSpringDatabase as a Liquibase service because org.hibernate.dialect.Dialect is not in the classpath WARNING 1/19/15 12:42 AM: liquibase: Can not use class liquibase.ext.hibernate.database.HibernateClassicDatabase as a Liquibase service because org.hibernate.dialect.Dialect is not in the classpath DEBUG 1/19/15 10:20 AM: liquibase: Connected to root@localhost @jdbc:mysql://localhost:3306/dirtylibs DEBUG 1/19/15 10:20 AM: liquibase: Setting auto commit to false from true Unexpected error running Liquibase: java.lang.RuntimeException: Cannot find database driver: Driver class was not specified and could not be determined from the url (hibernate:spring:com.companyname.dirtylibs.persistence.entities?dialect=org.hibernate.dialect.MySQL5Dialect) SEVERE 1/19/15 10:20 AM: liquibase: java.lang.RuntimeException: Cannot find database driver: Driver class was not specified and could not be determined from the url (hibernate:spring:com.companyname.dirtylibs.persistence.entities?dialect=org.hibernate.dialect.MySQL5Dialect) liquibase.exception.DatabaseException: liquibase.exception.DatabaseException: java.lang.RuntimeException: Cannot find database driver: Driver class was not specified and could not be determined from the url (hibernate:spring:com.companyname.dirtylibs.persistence.entities?dialect=org.hibernate.dialec t.MySQL5Dialect) at liquibase.integration.commandline.CommandLineUtils.createDatabaseObject(CommandLineUtils.java:69) at liquibase.integration.commandline.Main.createReferenceDatabaseFromCommandParams(Main.java:1169) at liquibase.integration.commandline.Main.doMigration(Main.java:936) at liquibase.integration.commandline.Main.run(Main.java:175) at liquibase.integration.commandline.Main.main(Main.java:94) Caused by: liquibase.exception.DatabaseException: java.lang.RuntimeException: Cannot find database driver: Driver class was not specified and could not be determined from the url (hibernate:spring:com.companyname.dirtylibs.persistence.entities?dialect=org.hibernate.dialect.MySQL5Dialect) at liquibase.database.DatabaseFactory.openConnection(DatabaseFactory.java:239) at liquibase.database.DatabaseFactory.openDatabase(DatabaseFactory.java:143) at liquibase.integration.commandline.CommandLineUtils.createDatabaseObject(CommandLineUtils.java:50) ... 4 more Caused by: java.lang.RuntimeException: Cannot find database driver: Driver class was not specified and could not be determined from the url (hibernate:spring:com.companyname.dirtylibs.persistence.entities?dialect=org.hibernate.dialect.MySQL5Dialect) at liquibase.database.DatabaseFactory.openConnection(DatabaseFactory.java:191) ... 6 more 

My Liquibase.properties File

 driver=com.mysql.jdbc.Driver classpath=mysql-connector-java-5.1.6.jar url=jdbc:mysql://localhost:3306/dirtylibs username=root password=password changeLogFile=changelog.xml #referenceDriver=liquibase.ext.hibernate.database.connection.HibernateDriver referenceUrl=hibernate:spring:com.companyname.dirtylibs.persistence.entities?dialect=org.hibernate.dialect.MySQL5Dialect referenceUsername=root referencePassword=password 

If I uncomment my referenceDriver, I get this. Is something missing here? I thought that I had all the necessary dependencies, and I'm not sure if this is a manifestation of an earlier problem when the extension could not load files correctly.

 $ liquibase diffChangeLog WARNING 1/19/15 12:49 AM: liquibase: Can not use class liquibase.ext.hibernate.database.HibernateEjb3Database as a Liquibase service because org.hibernate.dialect.Dialect is not in the classpath WARNING 1/19/15 12:49 AM: liquibase: Can not use class liquibase.ext.hibernate.database.HibernateSpringDatabase as a Liquibase service because org.hibernate.dialect.Dialect is not in the classpath WARNING 1/19/15 12:49 AM: liquibase: Can not use class liquibase.ext.hibernate.database.HibernateClassicDatabase as a Liquibase service because org.hibernate.dialect.Dialect is not in the classpath WARNING 1/19/15 12:49 AM: liquibase: Can not use class liquibase.ext.hibernate.snapshot.SequenceSnapshotGenerator as a Liquibase service because org.hibernate.id.factory.IdentifierGeneratorFactory is not in the classpath WARNING 1/19/15 12:49 AM: liquibase: Can not use class liquibase.ext.hibernate.snapshot.TableSnapshotGenerator as a Liquibase service because org.hibernate.id.factory.IdentifierGeneratorFactory is not in the classpath Unexpected error running Liquibase: org.hibernate.sql.Alias SEVERE 1/19/15 10:22 AM: liquibase: org.hibernate.sql.Alias java.lang.NoClassDefFoundError: org/hibernate/sql/Alias at liquibase.ext.hibernate.snapshot.PrimaryKeySnapshotGenerator.<clinit>(PrimaryKeySnapshotGenerator.java:27) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) at liquibase.snapshot.SnapshotGeneratorFactory.<init>(SnapshotGeneratorFactory.java:29) at liquibase.snapshot.SnapshotGeneratorFactory.getInstance(SnapshotGeneratorFactory.java:43) at liquibase.snapshot.SnapshotControl.addType(SnapshotControl.java:95) at liquibase.snapshot.SnapshotControl.setTypes(SnapshotControl.java:88) at liquibase.snapshot.SnapshotControl.<init>(SnapshotControl.java:25) at liquibase.command.DiffCommand.createReferenceSnapshot(DiffCommand.java:185) at liquibase.command.DiffCommand.createDiffResult(DiffCommand.java:140) at liquibase.command.DiffToChangeLogCommand.run(DiffToChangeLogCommand.java:51) at liquibase.command.AbstractCommand.execute(AbstractCommand.java:8) at liquibase.integration.commandline.CommandLineUtils.doDiffToChangeLog(CommandLineUtils.java:121) at liquibase.integration.commandline.Main.doMigration(Main.java:936) at liquibase.integration.commandline.Main.run(Main.java:175) at liquibase.integration.commandline.Main.main(Main.java:94) Caused by: java.lang.ClassNotFoundException: org.hibernate.sql.Alias at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... 18 more 

After adding sleep mode to the Liquibase / lib folder (which is really wrong), the error turned into this. I tried to revert to an older version of the plugin (although I lowered the level of educational program), and this did not help.

 $ liquibase --logLevel=DEBUG diffChangeLog .:/c/repos/ServeDirtyLibsInJava/liquibaseLib/liquibase.jar:/c/repos/ServeDirtyLibsInJava/liquibaseLib/lib/hibernate-core-4.3.0.Final.jar:/c/repos/ServeDirtyLibsInJava/liquibaseLib/lib/liquibase-hibernate4-3.5.jar:/c/repos/ServeDirtyLibsInJava/liquibaseLib/lib/snakeyaml-1.13.jar WARNING 1/19/15 10:38 AM: liquibase: Can not use class liquibase.ext.hibernate.database.HibernateSpringDatabase as a Liquibase service because org.springframework.beans.factory.support.BeanDefinitionRegistry is not in the classpath DEBUG 1/19/15 10:38 AM: liquibase: Connected to root@localhost @jdbc:mysql://localhost:3306/dirtylibs DEBUG 1/19/15 10:38 AM: liquibase: Setting auto commit to false from true WARNING 1/19/15 10:38 AM: liquibase: Unknown database: Hibernate DEBUG 1/19/15 10:38 AM: liquibase: Connected to null@hibernate :spring:com.companyname.dirtylibs.persistence.entities?dialect=org.hibernate.dialect.MySQL5Dialect DEBUG 1/19/15 10:38 AM: liquibase: Not adjusting the auto commit mode; it is already false INFO 1/19/15 10:38 AM: liquibase: Error getting default schema java.lang.NullPointerException at liquibase.executor.jvm.JdbcExecutor$QueryCallableStatementCallback.doInCallableStatement(JdbcExecutor.java:383) at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:96) at liquibase.executor.jvm.JdbcExecutor.query(JdbcExecutor.java:132) at liquibase.executor.jvm.JdbcExecutor.query(JdbcExecutor.java:143) at liquibase.executor.jvm.JdbcExecutor.queryForObject(JdbcExecutor.java:151) at liquibase.executor.jvm.JdbcExecutor.queryForObject(JdbcExecutor.java:166) at liquibase.executor.jvm.JdbcExecutor.queryForObject(JdbcExecutor.java:161) at liquibase.database.AbstractJdbcDatabase.getConnectionSchemaName(AbstractJdbcDatabase.java:318) at liquibase.database.AbstractJdbcDatabase.getDefaultSchemaName(AbstractJdbcDatabase.java:301) at liquibase.CatalogAndSchema.customize(CatalogAndSchema.java:132) at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:116) at liquibase.command.DiffCommand.createReferenceSnapshot(DiffCommand.java:190) at liquibase.command.DiffCommand.createDiffResult(DiffCommand.java:140) at liquibase.command.DiffToChangeLogCommand.run(DiffToChangeLogCommand.java:51) at liquibase.command.AbstractCommand.execute(AbstractCommand.java:8) at liquibase.integration.commandline.CommandLineUtils.doDiffToChangeLog(CommandLineUtils.java:121) at liquibase.integration.commandline.Main.doMigration(Main.java:936) at liquibase.integration.commandline.Main.run(Main.java:175) at liquibase.integration.commandline.Main.main(Main.java:94) DEBUG 1/19/15 10:38 AM: liquibase: Computed checksum for 1421681927678 as b60efdd1567f2fd4e5407a8d157cb0b6 Unexpected error running Liquibase: java.lang.NullPointerException SEVERE 1/19/15 10:38 AM: liquibase: java.lang.NullPointerException liquibase.exception.LiquibaseException: liquibase.command.CommandExecutionException: java.lang.NullPointerException at liquibase.integration.commandline.CommandLineUtils.doDiffToChangeLog(CommandLineUtils.java:123) at liquibase.integration.commandline.Main.doMigration(Main.java:936) at liquibase.integration.commandline.Main.run(Main.java:175) at liquibase.integration.commandline.Main.main(Main.java:94) Caused by: liquibase.command.CommandExecutionException: java.lang.NullPointerException at liquibase.command.AbstractCommand.execute(AbstractCommand.java:13) at liquibase.integration.commandline.CommandLineUtils.doDiffToChangeLog(CommandLineUtils.java:121) ... 3 more Caused by: java.lang.NullPointerException at liquibase.snapshot.jvm.CatalogSnapshotGenerator.getDatabaseCatalogNames(CatalogSnapshotGenerator.java:82) at liquibase.snapshot.jvm.CatalogSnapshotGenerator.snapshotObject(CatalogSnapshotGenerator.java:41) at liquibase.snapshot.jvm.JdbcSnapshotGenerator.snapshot(JdbcSnapshotGenerator.java:60) at liquibase.snapshot.SnapshotGeneratorChain.snapshot(SnapshotGeneratorChain.java:50) at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:163) at liquibase.snapshot.DatabaseSnapshot.init(DatabaseSnapshot.java:55) at liquibase.snapshot.DatabaseSnapshot.<init>(DatabaseSnapshot.java:37) at liquibase.snapshot.JdbcDatabaseSnapshot.<init>(JdbcDatabaseSnapshot.java:25) at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:126) at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:119) at liquibase.command.DiffCommand.createReferenceSnapshot(DiffCommand.java:190) at liquibase.command.DiffCommand.createDiffResult(DiffCommand.java:140) at liquibase.command.DiffToChangeLogCommand.run(DiffToChangeLogCommand.java:51) at liquibase.command.AbstractCommand.execute(AbstractCommand.java:8) ... 4 more 
+6
source share
3 answers

I got this by adding these jars to my class path. This is very confusing and poorly documented. The process that I went through was as follows:

  • Download the source code for the correct plugin project found here ( https://github.com/liquibase/liquibase-hibernate/releases ), in my case it was 4-3.5 hibernation fluid.

  • Run mvn dependency:copy-dependencies . This resets them to /target/dependency/ . Copy all these jars and place them in the LIQUIBASE_HOME/lib directory.

  • I use gradle, so I used a custom task to copy all my dependencies. If you are using maven, you can use the same step of 2 in your own project to get all your flaws. I copied these libraries from my output directory to the LIQUIBASE_HOME/lib directory.

     task copyToLib(type: Copy) { into "$buildDir/output/libs" from configurations.runtime } 
  • I also put the correct hibernate-liquibase-4.3.5.jar in the LIQUIBASE_HOME/lib directory.

This gave me all the dependencies I need for the plugin.

This is a big nasty ball of clutter, but what can you do :(

+6
source

The path I tried was a little different from the accepted anwer. I created a dev profile in my war pom.xml (I use maven), which does the same with the default profile, but includes Liquibase-hibernate jar-dependent dependency files in the war / WEB-INF / lib section. And instead of using the provided Liquibase command line, I use the Liquibase.jar file directly with the classpath - this is my war file:

 java -jar $LIQUIBASE/liquibase.jar --classpath=<WAR FILE HERE> --defaultsFile=<yourpath>/liquibase.properties --logLevel=info 

And then a script connection was created that builds my project with this Liquibase-hibernate profile, then runs the diffChangeLog command.

+1
source

If you check the source code for this plugin, the following dependencies (all spring dependencies) are marked as β€œprovided” areas in pom:

 spring-test spring-jdbc spring-beans spring-context spring-orm 

Thus, the plugin will assume that they were provided on the class path by your application, but this will not happen automatically in your maven assembly, since it will not work with the same class as your application.

So, to fix it, add the dependencies to your plugin, easier than running a juff file shuffle:

 <plugin> <groupId>org.liquibase</groupId> <artifactId>liquibase-maven-plugin</artifactId> <version>3.4.1</version> <dependencies> <dependency> <groupId>org.liquibase.ext</groupId> <artifactId>liquibase-hibernate5</artifactId> <version>3.6</version> </dependency> <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> <version>3.5.3</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.3.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>4.3.2.RELEASE</version> </dependency> </dependencies> </plugin> 

If you are passionate, you can make a transfer request in the github repository to remove the provided areas from pom, as well as possibly this line:

  <role>architect</role> 
+1
source

Source: https://habr.com/ru/post/981227/


All Articles