Liquibase простой журнал изменений NullPointerException

У меня простая настройка миграции с помощью Liquibase. К сожалению, когда я пытаюсь addColumn, это вызывает исключение NullPointerException. (Создание таблиц отлично работает).

// File structure
pom.xml
  src/main/resources/liquibase/
    db.changelog.xml
    liquibase.properties
    changesets/
      simple.changeset.xml


// pom.xml
<plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>${liquibase.version}</version>
    <configuration>
        <propertyFile>src/main/resources/liquibase/liquibase.properties</propertyFile>
        <changeLogFile>src/main/resources/liquibase/db.changelog.xml</changeLogFile>
        <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
    </configuration>
</plugin>

// simple.changeset.xml
<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
     http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.2.xsd">
    <changeSet id="1517019028" author="me">
        <createTable tableName="test">
            <column name="test_field_1" type="varchar(255)"></column>
        </createTable>
        <addColumn tableName="test">
            <column name="test_field_2" type="varchar(255)"></column>
        </addColumn>
    </changeSet>
</databaseChangeLog>

Команда createTable выполняется успешно, но команда addColumn всегда терпит неудачу. Запуск mvn clean package liquibase:update вызывает следующую ошибку:

java.lang.NullPointerException
    at liquibase.structure.core.Index.setColumns(Index.java:100)
    at liquibase.snapshot.jvm.PrimaryKeySnapshotGenerator.snapshotObject(PrimaryKeySnapshotGenerator.java:65)
    at liquibase.snapshot.jvm.JdbcSnapshotGenerator.snapshot(JdbcSnapshotGenerator.java:60)
    at liquibase.snapshot.SnapshotGeneratorChain.snapshot(SnapshotGeneratorChain.java:50)
    at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:194)
    at liquibase.snapshot.DatabaseSnapshot.replaceObject(DatabaseSnapshot.java:272)
    at liquibase.snapshot.DatabaseSnapshot.includeNestedObjects(DatabaseSnapshot.java:234)
    at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:208)
    at liquibase.snapshot.DatabaseSnapshot.replaceObject(DatabaseSnapshot.java:292)
    at liquibase.snapshot.DatabaseSnapshot.replaceObject(DatabaseSnapshot.java:314)
    at liquibase.snapshot.DatabaseSnapshot.includeNestedObjects(DatabaseSnapshot.java:234)
    at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:208)
    at liquibase.snapshot.DatabaseSnapshot.replaceObject(DatabaseSnapshot.java:272)
    at liquibase.snapshot.DatabaseSnapshot.includeNestedObjects(DatabaseSnapshot.java:234)
    at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:208)
    at liquibase.snapshot.DatabaseSnapshot.init(DatabaseSnapshot.java:70)
    at liquibase.snapshot.DatabaseSnapshot.<init>(DatabaseSnapshot.java:44)
    at liquibase.snapshot.JdbcDatabaseSnapshot.<init>(JdbcDatabaseSnapshot.java:21)
    at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:150)
    at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:158)
    at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:154)
    at liquibase.database.core.SQLiteDatabase.getAlterTableStatements(SQLiteDatabase.java:133)
    at liquibase.sqlgenerator.core.AddColumnGeneratorSQLite.generateSql(AddColumnGeneratorSQLite.java:67)
    at liquibase.sqlgenerator.core.AddColumnGeneratorSQLite.generateSql(AddColumnGeneratorSQLite.java:19)
    at liquibase.sqlgenerator.SqlGeneratorChain.generateSql(SqlGeneratorChain.java:30)
    at liquibase.sqlgenerator.SqlGeneratorFactory.generateSql(SqlGeneratorFactory.java:216)
    at liquibase.executor.AbstractExecutor.applyVisitors(AbstractExecutor.java:25)
    at liquibase.executor.jvm.JdbcExecutor.access$500(JdbcExecutor.java:36)
    at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:289)
    at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:55)
    at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:107)
    at liquibase.database.AbstractJdbcDatabase.execute(AbstractJdbcDatabase.java:1251)
    at liquibase.database.AbstractJdbcDatabase.executeStatements(AbstractJdbcDatabase.java:1234)
    at liquibase.changelog.ChangeSet.execute(ChangeSet.java:554)
    at liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:51)
    at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:73)
    at liquibase.Liquibase.update(Liquibase.java:212)
    at liquibase.Liquibase.update(Liquibase.java:192)
    at liquibase.Liquibase.update(Liquibase.java:327)
    at org.liquibase.maven.plugins.LiquibaseUpdate.doUpdate(LiquibaseUpdate.java:33)
    at org.liquibase.maven.plugins.AbstractLiquibaseUpdateMojo.performLiquibaseTask(AbstractLiquibaseUpdateMojo.java:30)
    at org.liquibase.maven.plugins.AbstractLiquibaseMojo.execute(AbstractLiquibaseMojo.java:394)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
    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)

Кто-нибудь сталкивался с этой проблемой раньше? Судя по документации, моя установка довольно типична, но я не могу найти ничего похожего на эту проблему в Интернете.

Вот образец репо, который я создал для отображения проблемы: https://github.com/cha55son/liquibase-add-column-bug


person cha55son    schedule 27.01.2018    source источник
comment
Попробуйте переместить addColumn на другой changeset   -  person sagarr    schedule 27.01.2018
comment
вы также можете поместить <column name="test_field_2" type="varchar(255)"></column> в тело тега создания таблицы   -  person DavidX    schedule 27.01.2018
comment
К сожалению, это тоже не помогает (переход к другому набору изменений). Я добавил в пост тестовое репо для всех, кто хочет с ним поиграть.   -  person cha55son    schedule 27.01.2018
comment
Я хотел бы, чтобы они были разделены, чтобы по мере продвижения в разработке я мог создавать новые ревизии, а не редактировать старые ревизии.   -  person cha55son    schedule 27.01.2018


Ответы (1)


Это может быть ошибка драйверов Liquibase для SQLite.

https://liquibase.jira.com/browse/CORE-2468

В этом случае вы можете переключиться на другую БД.

В качестве альтернативы вы можете попробовать использовать вместо этого необработанный SQL в наборе изменений (на основе вашего кода github):

    <changeSet id="2" author="me">
        <sql>
            ALTER TABLE TEST ADD COLUMN TEST_FIELD varchar(255)
        </sql>
    </changeSet>
person DavidX    schedule 27.01.2018
comment
Спасибо, подтвердил, что это работает. Не идеально, но я уделю этому посту еще немного времени, и если не будет лучших ответов, я помечу его как принятый. - person cha55son; 28.01.2018
comment
Без проблем! Удачи! - person DavidX; 29.01.2018