代码之家  ›  专栏  ›  技术社区  ›  Pavan Jadda

liquibase:diff command 引发空指针异常

  •  0
  • Pavan Jadda  · 技术社区  · 5 年前

    我用 mvn liquibase:generateChangeLog ,当我尝试用 mvn liquibase:diff 获取默认架构java.lang.NullPointerException时出错

    错误消息

     mvn liquibase:diff
    [INFO] Scanning for projects...
    [INFO] 
    [INFO] -------------------------< com:liquibasetest >--------------------------
    [INFO] Building liquibasetest 0.0.1-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO] 
    [INFO] --- liquibase-maven-plugin:3.6.3:diff (default-cli) @ liquibasetest ---
    [INFO] ------------------------------------------------------------------------
    [INFO] Parsing Liquibase Properties File
    [INFO]   File: src/main/resources/liquibase.properties
    [INFO]   'outputChangeLogFile' in properties file is not being used by this task.
    [INFO] ------------------------------------------------------------------------
    [INFO] Starting Liquibase at Tue, 12 Feb 2019 00:05:05 EST (version 3.6.3 built at 2019-01-29 11:34:48)
    [WARNING] 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
    [INFO] Executing on Database: jdbc:mysql://localhost:3306/flywaytest?currentSchema=flywaytest
    [WARNING] Unknown database: Hibernate
    [INFO] Performing Diff on database root@localhost @ jdbc:mysql://localhost:3306/flywaytest?currentSchema=flywaytest (Default Schema: flywaytest)
    [INFO] Error getting default schema
    java.lang.NullPointerException
        at liquibase.executor.jvm.JdbcExecutor$QueryCallableStatementCallback.doInCallableStatement (JdbcExecutor.java:452)
        at liquibase.executor.jvm.JdbcExecutor.execute (JdbcExecutor.java:93)
        at liquibase.executor.jvm.JdbcExecutor.query (JdbcExecutor.java:135)
        at liquibase.executor.jvm.JdbcExecutor.query (JdbcExecutor.java:146)
        at liquibase.executor.jvm.JdbcExecutor.queryForObject (JdbcExecutor.java:154)
        at liquibase.executor.jvm.JdbcExecutor.queryForObject (JdbcExecutor.java:169)
        at liquibase.executor.jvm.JdbcExecutor.queryForObject (JdbcExecutor.java:164)
        at liquibase.database.AbstractJdbcDatabase.getConnectionSchemaName (AbstractJdbcDatabase.java:327)
        at liquibase.database.AbstractJdbcDatabase.getDefaultSchemaName (AbstractJdbcDatabase.java:292)
        at liquibase.CatalogAndSchema.customize (CatalogAndSchema.java:151)
        at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot (SnapshotGeneratorFactory.java:184)
        at liquibase.command.core.DiffCommand.createReferenceSnapshot (DiffCommand.java:221)
        at liquibase.command.core.DiffCommand.createDiffResult (DiffCommand.java:143)
        at liquibase.command.core.DiffToChangeLogCommand.run (DiffToChangeLogCommand.java:51)
        at liquibase.command.AbstractCommand.execute (AbstractCommand.java:19)
        at liquibase.integration.commandline.CommandLineUtils.doDiffToChangeLog (CommandLineUtils.java:237)
        at liquibase.integration.commandline.CommandLineUtils.doDiffToChangeLog (CommandLineUtils.java:212)
        at org.liquibase.maven.plugins.LiquibaseDatabaseDiff.performLiquibaseTask (LiquibaseDatabaseDiff.java:177)
        at org.liquibase.maven.plugins.AbstractLiquibaseMojo.execute (AbstractLiquibaseMojo.java:366)
        at org.liquibase.maven.plugins.LiquibaseDatabaseDiff.execute (LiquibaseDatabaseDiff.java:136)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
        at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
        at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
        at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
        at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
        at org.apache.maven.cli.MavenCli.execute (MavenCli.java:956)
        at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)
        at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)
        at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke (Method.java:498)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:289)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:229)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:415)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:356)
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD FAILURE
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  3.773 s
    [INFO] Finished at: 2019-02-12T00:05:07-05:00
    [INFO] ------------------------------------------------------------------------
    [ERROR] Failed to execute goal org.liquibase:liquibase-maven-plugin:3.6.3:diff (default-cli) on project liquibasetest: Error setting up or running Liquibase: liquibase.command.CommandExecutionException: java.lang.NullPointerException -> [Help 1]
    [ERROR] 
    [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
    [ERROR] Re-run Maven using the -X switch to enable full debug logging.
    [ERROR] 
    [ERROR] For more information about the errors and possible solutions, please read the following articles:
    [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
    

    液化酶性质

    outputChangeLogFile= src/main/resources/db/db.changelog-master.xml
    driver=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://localhost:3306/flywaytest?currentSchema=flywaytest
    username=root
    password=bcmc1234
    

    db.changlog-master.xml文件

    <?xml version="1.1" encoding="UTF-8" standalone="no"?>
    <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
        <changeSet author="pjadda (generated)" id="1549947881457-1">
            <createTable tableName="country">
                <column name="id" type="BIGINT">
                    <constraints primaryKey="true"/>
                </column>
                <column name="name" type="VARCHAR(45)"/>
                <column name="code" type="VARCHAR(45)"/>
                <column name="iso_code" type="VARCHAR(45)"/>
                <column name="region_id" type="BIGINT"/>
            </createTable>
        </changeSet>
        <changeSet author="pjadda (generated)" id="1549947881457-2">
            <createTable tableName="region">
                <column name="id" type="BIGINT">
                    <constraints primaryKey="true"/>
                </column>
                <column name="name" type="VARCHAR(45)"/>
            </createTable>
        </changeSet>
        <changeSet author="pjadda (generated)" id="1549947881457-3">
            <createIndex indexName="region_fk_idx" tableName="country">
                <column name="region_id"/>
            </createIndex>
        </changeSet>
        <changeSet author="pjadda (generated)" id="1549947881457-4">
            <addForeignKeyConstraint baseColumnNames="region_id" baseTableName="country" constraintName="region_fk" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="region" validate="true"/>
        </changeSet>
    </databaseChangeLog>
    

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.2.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com</groupId>
        <artifactId>liquibasetest</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>liquibasetest</name>
        <description>Liquibase Test project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <spring-boot.version>2.1.1.RELEASE</spring-boot.version>
            <spring-boot-admin.version>2.1.1</spring-boot-admin.version>
            <hibernate.version>5.4.0.Final</hibernate.version>
            <liquibase-maven-plugin.version>3.6.3</liquibase-maven-plugin.version>
            <liquibase-hibernate5.version>3.6</liquibase-hibernate5.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-envers</artifactId>
                <version>${hibernate.version}</version>
            </dependency>
            <dependency>
                <groupId>org.liquibase</groupId>
                <artifactId>liquibase-core</artifactId>
            </dependency>
            <dependency>
                <groupId>org.liquibase</groupId>
                <artifactId>liquibase-maven-plugin</artifactId>
                <version>${liquibase-maven-plugin.version}</version>
            </dependency>
    
    
            <dependency>
                <groupId>de.codecentric</groupId>
                <artifactId>spring-boot-admin-starter-client</artifactId>
            </dependency>
            <dependency>
                <groupId>de.codecentric</groupId>
                <artifactId>spring-boot-admin-starter-server</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
            </dependency>
    <!--        <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <scope>runtime</scope>
            </dependency>-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>de.codecentric</groupId>
                    <artifactId>spring-boot-admin-dependencies</artifactId>
                    <version>${spring-boot-admin.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
    
                <plugin>
                    <groupId>org.liquibase</groupId>
                    <artifactId>liquibase-maven-plugin</artifactId>
                    <version>${liquibase-maven-plugin.version}</version>
                    <configuration>
                        <propertyFile>src/main/resources/liquibase.properties</propertyFile>
                        <changeLogFile>src/main/resources/db/db.changelog-master.xml</changeLogFile>
                        <diffChangeLogFile>src/main/resources/db/changelog/${maven.build.timestamp}_changelog.xml</diffChangeLogFile>
                        <logging>info</logging>
                    </configuration>
      <!--              <executions>
                        <execution>
                            <id>generate-db-prev</id>
                            <phase>process-resources</phase>
                            <goals>
                                <goal>update</goal>
                            </goals>
                            <configuration>
                                <dropFirst>true</dropFirst>
                            </configuration>
                        </execution>
                        <execution>
                            <id>generate-db-diff</id>
                            <phase>process-test-resources</phase>
                            <goals>
                                <goal>diff</goal>
                            </goals>
                        </execution>
                    </executions>-->
                    <dependencies>
                        <dependency>
                            <groupId>org.liquibase.ext</groupId>
                            <artifactId>liquibase-hibernate4</artifactId>
                            <version>3.6</version>
                        </dependency>
                    </dependencies>
    
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    1 回复  |  直到 5 年前
        1
  •  3
  •   Pavan Jadda    5 年前

    更新 bug 一旦问题解决,我们会更新帖子。同时,使用 liquibase maven插件版本3.5.5 liquibase-hibernate5版本3.6

    解决方案 :

    我发现了问题所在。SpringJPA使用Hibernate5.x和我配置的 liquibase-hibernate4 validation-api 防止验证错误的依赖关系

                <dependencies>
                    <dependency>
                        <groupId>org.liquibase.ext</groupId>
                        <artifactId>liquibase-hibernate5</artifactId>
                        <version>${liquibase-hibernate5.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-data-jpa</artifactId>
                        <version>${spring-boot.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>javax.validation</groupId>
                        <artifactId>validation-api</artifactId>
                        <version>${validation-api.version}</version>
                    </dependency>
                </dependencies>
    

    pom.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.2.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com</groupId>
        <artifactId>liquibasetest</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>liquibasetest</name>
        <description>Liquibase Test project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <spring-boot.version>2.1.2.RELEASE</spring-boot.version>
            <spring-boot-admin.version>2.1.1</spring-boot-admin.version>
            <hibernate.version>5.4.0.Final</hibernate.version>
            <liquibase-maven-plugin.version>3.5.5</liquibase-maven-plugin.version>
            <liquibase-hibernate5.version>3.6</liquibase-hibernate5.version>
            <validation-api.version>2.0.1.Final</validation-api.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
    
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-envers</artifactId>
                <version>${hibernate.version}</version>
            </dependency>
    
            <dependency>
                <groupId>de.codecentric</groupId>
                <artifactId>spring-boot-admin-starter-client</artifactId>
            </dependency>
            <dependency>
                <groupId>de.codecentric</groupId>
                <artifactId>spring-boot-admin-starter-server</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
            </dependency>
    
            <dependency>
                <groupId>org.liquibase</groupId>
                <artifactId>liquibase-core</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.liquibase</groupId>
                <artifactId>liquibase-maven-plugin</artifactId>
                <version>${liquibase-maven-plugin.version}</version>
            </dependency>
    
    
    
            <!--        <dependency>
                        <groupId>com.h2database</groupId>
                        <artifactId>h2</artifactId>
                        <scope>runtime</scope>
                    </dependency>-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>de.codecentric</groupId>
                    <artifactId>spring-boot-admin-dependencies</artifactId>
                    <version>${spring-boot-admin.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
    
                <plugin>
                    <groupId>org.liquibase</groupId>
                    <artifactId>liquibase-maven-plugin</artifactId>
                    <version>${liquibase-maven-plugin.version}</version>
                    <configuration>
                        <propertyFile>src/main/resources/liquibase.properties</propertyFile>
                        <changeLogFile>src/main/resources/db/db.changelog-master.xml</changeLogFile>
                        <diffChangeLogFile>src/main/resources/db/changelog/${maven.build.timestamp}_changelog.xml</diffChangeLogFile>
                        <logging>debug</logging>
                    </configuration>
                    <dependencies>
                        <dependency>
                            <groupId>org.liquibase.ext</groupId>
                            <artifactId>liquibase-hibernate5</artifactId>
                            <version>${liquibase-hibernate5.version}</version>
                        </dependency>
                        <dependency>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-starter-data-jpa</artifactId>
                            <version>${spring-boot.version}</version>
                        </dependency>
                        <dependency>
                            <groupId>javax.validation</groupId>
                            <artifactId>validation-api</artifactId>
                            <version>${validation-api.version}</version>
                        </dependency>
                    </dependencies>
    
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    推荐文章