2015-01-19 6 views
6

Come descritto qui (https://github.com/liquibase/liquibase-hibernate/issues/74) Sto riscontrando un problema nel far funzionare correttamente l'estensione di ibibase-liquibase. Penso di avere tutto configurato, ma sembra che continui a correre in strani problemi. Mi sento come se mi mancasse qualcosa di semplice, ma penso di aver seguito tutte le istruzioni fornite.Il plug-in di ibibato Liquibase non funziona

Sto utilizzando liquibase 3.3.2, Hibernate 4.3.0.Final, java 1.7.0_71 e il liquibase-hibernate4-3.5.jar. La mia variabile ambientale CLASSPATH è vuota, ma alcune cose vengono aggiunte dallo script della shell liquibase. Quando sto usando i normali comandi di liquibase che interagiscono, e rimuovo l'estensione dalla directory $ LIQUIBASE_HOME/lib/senza l'estensione funziona perfettamente. Riesco ad eseguire i comandi con l'uscita DEBUG per fornire ulteriori informazioni.

$ 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 [email protected]@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 

miei liquibase.properties il 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 

Se io rimuovere il commento la mia referenceDriver ottengo questo. C'è qualcosa che mi manca qui? Pensavo di avere tutte le dipendenze richieste e non sono sicuro se questa è una manifestazione del problema precedente in cui l'estensione non poteva caricare le cose correttamente.

$ 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 

Dopo aver aggiunto il vaso di ibernazione alla cartella liquibase/lib (che è veramente sbagliato) l'errore trasformato in questo. Ho provato a tornare a una versione precedente del plug-in (mentre eseguivo il downgrade di liquibase), e non è stato d'aiuto.

$ 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 [email protected]@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 [email protected]: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 

risposta

6

Ho funzionato aggiungendo questi vasi al mio classpath. Questo è super confusionario e non ben documentato. Il processo che ho passato è stato:

  1. scaricare il codice sorgente per il progetto corretto plug trovato qui (https://github.com/liquibase/liquibase-hibernate/releases) nel mio caso è stato liquibase-hibernate4-3.5.

  2. Corsa mvn dependency:copy-dependencies. Questo li scarica in /target/dependency/. Copia tutti questi barattoli e inseriscili nella tua directory LIQUIBASE_HOME/lib.

  3. Sto utilizzando gradle, quindi ho utilizzato un'attività personalizzata per copiare tutte le mie dipendenze. Se stai usando Maven puoi usare lo stesso passo da 2 del tuo progetto per recuperare tutte le tue dipendenze. Ho copiato queste librerie dalla mia directory di output nella directory LIQUIBASE_HOME/lib.

    task copyToLib(type: Copy) { 
        into "$buildDir/output/libs" 
        from configurations.runtime 
    } 
    
  4. Ho messo il corretto hibernate-liquibase-4.3.5.jar nella directory LIQUIBASE_HOME/lib.

Questo mi ha dato tutte le dipendenze di cui avevo bisogno per il plugin.

Questo è un grande brutta palla di disordine, ma cosa si può fare :(

1

Il percorso che ho provato era un po 'diverso con l'anwer accettato. Ho creato un profilo dev in pom.xml di mia guerra (I sto usando Maven) che fa esattamente lo stesso con il profilo predefinito ma includendo i file jar di dipendenza Liquibase-hibernate sotto war/WEB-INF/lib. E invece di usare la riga di comando di liquibase fornita, io uso il liquibase.file jar direttamente con il percorso di classe è il mio file di guerra:

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

E poi creato uno script connvenience che si baserà il mio progetto con quella liquibase-hibernate profilo quindi eseguire il comando diffChangeLog.

1

Se si controlla il codice sorgente per questo plugin, le seguenti dipendenze (tutte le dipendenze primavera) sono contrassegnati come portata "previsto" nel pom:

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

Così il plugin assumeranno questi sono stati forniti sul classpath dalla tua app, ma questo non si verifica automaticamente nel tuo build di maven, in quanto non verrà eseguito con lo stesso percorso di classe dell'applicazione.

Così, per risolvere, aggiungere le dipendenze nel vostro plugin, più facile che fare il file jar riordino:

<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> 

Se siete interessati, si può fare una richiesta di pull sul repo GitHub per rimuovere la condizione ambiti dal pom, oh e probabilmente anche questa linea:

  <role>architect</role> 
+0

Questo è un buon feedback. Mai pensato di guardare l'edificio per il pom sorgente. Non ho idea del motivo per cui contrassegnano tutte le cose primaverili come previsto. – Jazzepi

Problemi correlati