2015-01-19 10 views
6

काम नहीं करता है यहाँ (https://github.com/liquibase/liquibase-hibernate/issues/74) मैं एक मुद्दा ठीक से काम करने liquibase-हाइबरनेट विस्तार हो रही हो रही है का वर्णन किया। मुझे लगता है कि मेरे पास सबकुछ सेटअप है, लेकिन ऐसा लगता है जैसे मैं अजीब समस्याओं में चल रहा हूं। मुझे लगता है कि मुझे कुछ आसान याद आ रहा है, लेकिन मुझे लगता है कि मैंने प्रदान किए गए सभी निर्देशों का पालन किया है।Liquibase हाइबरनेट प्लगइन

मैं 3.3.2 liquibase उपयोग कर रहा हूँ

, हाइबरनेट 4.3.0.Final, जावा 1.7.0_71 और liquibase-hibernate4-3.5.jar। मेरा क्लासस्पैट पर्यावरण परिवर्तक खाली है, लेकिन कुछ सामान इसे तरल पदार्थ खोल स्क्रिप्ट द्वारा जोड़ा जाता है। जब मैं सामान्य तरल पदार्थ कमांड का उपयोग कर रहा हूं, और मैं विस्तार के बिना $ LIQUIBASE_HOME/lib/निर्देशिका से एक्सटेंशन को हटा देता हूं, यह ठीक काम करता है। मैं कुछ और जानकारी प्रदान करने के लिए DEBUG आउटपुट के साथ आदेशों को पुन: चलाता हूं।

$ 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

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 

फाइल अगर मैं अपने referenceDriver uncomment मैं इस मिलता है। क्या मैं यहाँ कुछ याद कर रहा हूँ? मैंने सोचा कि मेरे पास सभी आवश्यक निर्भरताएं हैं, और मुझे यकीन नहीं है कि यह पहले की समस्या का कुछ अभिव्यक्ति है जहां एक्सटेंशन सामान को ठीक से लोड नहीं कर सका।

$ 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 

liquibase/lib फ़ोल्डर में हाइबरनेट जार (जो वास्तव में गलत है) को जोड़ने के बाद त्रुटि इस में बदल गया। मैंने प्लगइन के पुराने संस्करण में लौटने की कोशिश की (जबकि तरल पदार्थ को भी कम करना), और इससे मदद नहीं मिली।

$ 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 

उत्तर

6

मुझे इन कक्षाओं को अपने क्लासपाथ में जोड़कर काम करना पड़ा। यह बहुत भ्रमित है और अच्छी तरह से प्रलेखित नहीं है। प्रक्रिया मैं माध्यम से चला गया था:

  1. मेरे मामले में सही प्लगइन परियोजना यहां पाया (https://github.com/liquibase/liquibase-hibernate/releases) यह liquibase-hibernate4-3.5 गया था के लिए स्रोत को डाउनलोड करें।

  2. रन mvn dependency:copy-dependencies। यह उन्हें /target/dependency/ में डंप करता है। इन सभी जारों की प्रतिलिपि बनाएँ और उन्हें अपने LIQUIBASE_HOME/lib निर्देशिका में डाल दें।

  3. मैं धीरे-धीरे उपयोग कर रहा हूं इसलिए मैंने अपनी सभी निर्भरताओं की प्रतिलिपि बनाने के लिए एक कस्टम कार्य का उपयोग किया। यदि आप मेवेन का उपयोग कर रहे हैं तो आप अपनी सभी परियोजनाओं को लाने के लिए अपने स्वयं के प्रोजेक्ट पर 2 से उसी चरण का उपयोग कर सकते हैं। मैंने इन libs को मेरी आउटपुट निर्देशिका से LIQUIBASE_HOME/lib निर्देशिका में कॉपी किया।

    task copyToLib(type: Copy) { 
        into "$buildDir/output/libs" 
        from configurations.runtime 
    } 
    
  4. मैं भी LIQUIBASE_HOME/lib निर्देशिका में सही hibernate-liquibase-4.3.5.jar डाल दिया।

इससे मुझे प्लगइन के लिए आवश्यक सभी निर्भरताएं मिलीं। (मैं

यह गंदगी का एक बड़ा बुरा गेंद है, लेकिन आप क्या कर सकते हैं :(

1

पथ मैंने कोशिश को स्वीकार कर लिया anwer साथ थोड़ा अलग था। मैं अपने युद्ध के pom.xml में एक देव प्रोफ़ाइल बनाया Maven) जो वास्तव में डिफ़ॉल्ट प्रोफ़ाइल के साथ एक ही करता है का उपयोग कर रहा है, लेकिन युद्ध/वेब-INF/lib तहत liquibase-हाइबरनेट निर्भरता जार फ़ाइलों सहित। और फिर बजाय प्रदान की liquibase कमांड लाइन का उपयोग कर के, मैं liquibase का उपयोग करें।classpath के साथ सीधे जार फ़ाइल मेरी युद्ध फ़ाइल है:

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

और फिर एक connvenience स्क्रिप्ट जिसके साथ अपने प्रोजेक्ट का निर्माण करेगा बनाया कि liquibase-हाइबरनेट प्रोफ़ाइल तो diffChangeLog आदेश पर अमल।

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

तो प्लगइन इन प्रदान किया गया है मान लेंगे:

1

आप इस प्लगइन के लिए स्रोत कोड की जांच, तो निम्न निर्भरता (सभी वसंत निर्भरता) के रूप में पोम में "प्रदान" गुंजाइश चिह्नित कर रहे हैं आपके ऐप द्वारा क्लासपाथ पर, लेकिन यह आपके मैवेन बिल्ड में स्वचालित रूप से नहीं होगा, क्योंकि यह आपके क्लास के समान क्लासपाथ के साथ नहीं चलेगा।

तो,, ठीक करने के लिए अपने प्लगइन में निर्भरता जोड़ने के लिए, आसान जार फ़ाइल फेरबदल कर की तुलना में:

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

आप चाहते हैं, तो आप प्रदान की दूर करने के लिए GitHub रेपो पर एक पुल अनुरोध कर सकते हैं पोम, ओह और शायद यह लाइन भी स्कॉप्स:

  <role>architect</role> 
+0

यह कुछ अच्छी प्रतिक्रिया है। स्रोत पोम के लिए इमारत को देखने के बारे में कभी सोचा नहीं। मुझे नहीं पता कि वे प्रदान की गई सभी वसंत सामग्री क्यों चिह्नित करते हैं। – Jazzepi

संबंधित मुद्दे