2015-01-19 26 views
6

Jak tutaj opisano (https://github.com/liquibase/liquibase-hibernate/issues/74) Mam problem z poprawnym działaniem rozszerzenia hibernate. Myślę, że mam wszystko ustawione, ale wygląda na to, że mam dziwne problemy. Czuję, że brakuje mi czegoś prostego, ale myślę, że postępowałem zgodnie z wszystkimi instrukcjami, jakie mu udzielono.Plugin Hibernate do Liquibase nie działa

Używam liquibase 3.3.2, Hibernate 4.3.0.Final, java 1.7.0_71 i liquibase-hibernate4-3.5.jar. Moja zmienna środowiskowa CLASSPATH jest pusta, ale niektóre rzeczy są dodawane do niej przez skrypt powłoki liquibase. Kiedy używam zwykłych komend typu "liquibase", a ja usuwam rozszerzenie z katalogu $ LIQUIBASE_HOME/lib/bez rozszerzenia, to działa dobrze. Polecenia ponownie komenduję z danymi wyjściowymi DEBUG, aby podać więcej informacji. złożyć

$ 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 

Moi liquibase.properties

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 

Gdybym odkomentowaniu mój referenceDriver uzyskać to. Czy jest tu coś, czego mi brakuje? Myślałem, że mam wszystkie wymagane zależności i nie jestem pewien, czy jest to jakaś manifestacja wcześniejszego problemu, w którym rozszerzenie nie mogło poprawnie załadować rzeczy.

$ 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 

Po dodaniu słoika hibernacji do folderu liquibase/lib (co jest naprawdę źle) błąd został zmieniony w ten. Próbowałem powrócić do starszej wersji wtyczki (jednocześnie obniżając poziom), ale to nie pomogło.

$ 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 

Odpowiedz

6

Mam to działa, dodając te słoiki do mojej ścieżki klasy. Jest to bardzo mylące i niezbyt dobrze udokumentowane. Proces przeszłam było:

  1. Pobierz źródło dla prawidłowego projektu wtyczki znaleźć tutaj (https://github.com/liquibase/liquibase-hibernate/releases) w moim przypadku było liquibase-hibernate4-3.5.

  2. Uruchom mvn dependency:copy-dependencies. Zrzuca je do /target/dependency/. Skopiuj wszystkie te słoiki i umieść je w swoim katalogu LIQUIBASE_HOME/lib.

  3. Używam gradle, więc użyłem niestandardowego zadania do skopiowania wszystkich moich zależności. Jeśli używasz programu maven, możesz użyć tego samego kroku od 2 na swoim własnym projekcie, aby pobrać wszystkie twoje dependencje. Skopiowałem te biblioteki z mojego katalogu wyjściowego do katalogu LIQUIBASE_HOME/lib.

    task copyToLib(type: Copy) { 
        into "$buildDir/output/libs" 
        from configurations.runtime 
    } 
    
  4. ja również umieścić poprawnej hibernate-liquibase-4.3.5.jar do katalogu LIQUIBASE_HOME/lib.

To dało mi wszystkie zależności potrzebne do wtyczki.

To wielki paskudny kula bałagan, ale co można zrobić :(

1

Ścieżka Próbowałem był nieco inny z przyjętą anwer. I stworzył profil dev w pom.xml mojego wojny (I używam maven), który robi dokładnie to samo z domyślnym profilem, ale włączając w to pliki jar zależne Liquibase-hibernate w czasie wojny/WEB-INF/lib. A następnie zamiast korzystać z wiersza poleceń liquibase, używam liquibase.plik jar bezpośrednio przy ścieżce klasy jest mój plik war:

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

A potem stworzył skrypt connvenience który zbuduje mój projekt z tym liquibase-hibernacji profil następnie wykonać polecenie diffChangeLog.

1

Jeśli zaznaczysz kod źródłowy dla tej wtyczki, następujące zależności (wszystkie zależności wiosenne) są oznaczone jako „dostarczane” zakres w pom:

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

Więc plugin przejmie te zostały przekazane na ścieżce klas przez twoją aplikację, ale nie stanie się to automatycznie w twoich maven-buildach, ponieważ nie będzie działać z tą samą ścieżką klasową, co twoja aplikacja.

Tak, aby naprawić, dodać zależności w swojej wtyczki, łatwiejsze niż robienie shuffle pliku jar:

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

Jeśli są chętni, można wykonać żądania ciągnij repo github usunięcia dostarczona zakresy od pom, oh i prawdopodobnie także ta linia:

  <role>architect</role> 
+0

To dobre opinie. Nigdy nie myślałem o patrzeniu na budynek dla źródła pom. Nie mam pojęcia, dlaczego zaznaczają wszystkie elementy wiosenne, jak podano. – Jazzepi