2015-01-19 24 views
6

Như được mô tả ở đây (https://github.com/liquibase/liquibase-hibernate/issues/74) Tôi đang gặp sự cố khi mở rộng tiện ích mở rộng lỏng-hibernate để hoạt động bình thường. Tôi nghĩ rằng tôi đã thiết lập mọi thứ, nhưng có vẻ như tôi cứ tiếp tục chạy vào những vấn đề kỳ lạ. Tôi cảm thấy như tôi đang thiếu một cái gì đó đơn giản, nhưng tôi nghĩ rằng tôi đã làm theo tất cả các hướng dẫn như được cung cấp.Plugin Hibernate Liquibase không hoạt động

Tôi đang sử dụng liquibase 3.3.2, Hibernate 4.3.0.Final, java 1.7.0_71 và liquibase-hibernate4-3.5.jar. Biến môi trường CLASSPATH của tôi trống, nhưng một số thứ được thêm vào bởi kịch bản lệnh shell liquase. Khi tôi đang sử dụng lệnh bình thường hóa lỏng tương tác, và tôi loại bỏ phần mở rộng từ $ LIQUIBASE_HOME/lib/thư mục mà không có phần mở rộng nó hoạt động tốt. Tôi đọc lại các lệnh với đầu ra DEBUG để cung cấp thêm một số thông tin.

$ 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 

liquibase.properties My nộp

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 

Nếu tôi bỏ ghi chú referenceDriver của tôi, tôi có được điều này. Có cái gì tôi đang thiếu ở đây? Tôi nghĩ rằng tôi đã có tất cả các phụ thuộc cần thiết, và tôi không chắc chắn nếu điều này là một số biểu hiện của vấn đề trước đó, nơi phần mở rộng không thể tải công cụ đúng cách.

$ 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 

Sau khi thêm hibernate jar vào thư mục liquibase/lib (thực sự sai), lỗi này được chuyển thành điều này. Tôi đã thử quay lại phiên bản cũ hơn của plugin (trong khi hạ cấp hóa chất lỏng), và nó không giúp được gì.

$ 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 

Trả lời

6

Tôi làm việc đó bằng cách thêm các lọ này vào đường dẫn lớp của tôi. Đây là siêu khó hiểu và không tài liệu tốt. Quá trình tôi đã đi qua là:

  1. Tải nguồn cho các dự án đúng Plugin tìm thấy ở đây (https://github.com/liquibase/liquibase-hibernate/releases) trong trường hợp của tôi nó đã được liquibase-hibernate4-3.5.

  2. Chạy mvn dependency:copy-dependencies. Điều này đưa chúng vào /target/dependency/. Sao chép tất cả các lọ này và đặt chúng vào thư mục LIQUIBASE_HOME/lib của bạn.

  3. Tôi đang sử dụng gradle nên tôi đã sử dụng tác vụ tùy chỉnh để sao chép tất cả các phụ thuộc của mình. Nếu bạn đang sử dụng maven, bạn có thể sử dụng cùng một bước từ 2 trên dự án của riêng bạn để tìm nạp tất cả các phụ thuộc của bạn. Tôi đã sao chép các thư viện này từ thư mục đầu ra của tôi vào thư mục LIQUIBASE_HOME/lib.

    task copyToLib(type: Copy) { 
        into "$buildDir/output/libs" 
        from configurations.runtime 
    } 
    
  4. Tôi cũng đặt đúng hibernate-liquibase-4.3.5.jar vào thư mục LIQUIBASE_HOME/lib.

Điều đó đã cho tôi tất cả các phụ thuộc tôi cần cho plugin.

Đây là một bóng khó chịu lớn của mớ hỗn độn, nhưng những gì bạn có thể làm :(

1

Con đường tôi đã cố gắng là một chút khác nhau với anwer chấp nhận. Tôi tạo ra một hồ sơ dev trong pom.xml chiến tranh của tôi (tôi đang sử dụng maven) thực hiện chính xác như vậy với cấu hình mặc định nhưng bao gồm các tệp jar phụ thuộc Liquibase-hibernate trong chiến tranh/WEB-INF/lib và sau đó thay vì sử dụng dòng lệnh liquibase được cung cấp, tôi sử dụng liquibase.jar tập tin trực tiếp với classpath là tập tin chiến tranh của tôi:

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

Và sau đó tạo ra một kịch bản connvenience đó sẽ xây dựng dự án của tôi với điều đó liquibase-ngủ đông hồ sơ sau đó thực hiện lệnh diffChangeLog.

1

Nếu bạn kiểm tra mã nguồn cho plugin này, sự phụ thuộc sau đây (tất cả các phụ thuộc mùa xuân) được đánh dấu là phạm vi "cung cấp" trong pom:

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

Vì vậy, các plugin sẽ giả định này đã được cung cấp trên classpath bởi ứng dụng của bạn, nhưng điều này sẽ không tự động xảy ra trong build maven của bạn, vì nó sẽ không chạy với cùng classpath mà ứng dụng của bạn sẽ làm.

Vì vậy, để sửa chữa, thêm sự phụ thuộc trong plugin của bạn, dễ dàng hơn làm file jar ngẫu nhiên:

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

Nếu bạn đang quan tâm, bạn có thể làm một yêu cầu kéo trên repo github để loại bỏ các quy định phạm vi từ pom, oh và có lẽ dòng này quá:

  <role>architect</role> 
+0

Đó là một số phản hồi tốt. Không bao giờ nghĩ về việc nhìn vào tòa nhà cho pom nguồn. Tôi không biết tại sao họ đánh dấu tất cả những thứ mùa xuân như được cung cấp. – Jazzepi

Các vấn đề liên quan