Replacement for missing liquibase classes moving from liquibase 2.0.3 to 3.3.0

I have a project using liquibase-core 2.0.3. When I updated to liquibase-core 3.3.0 I'm getting a lot of compiler class not found errors for the classes below.

Any help on info on where/what they have been replaced with is much appreciated?

import liquibase.change.core.AnonymousChange;  import liquibase.database.core.MaxDBDatabase;  import liquibase.database.typeconversion.TypeConverter; import liquibase.database.typeconversion.core.CacheTypeConverter; import liquibase.database.typeconversion.core.DB2TypeConverter; import liquibase.database.typeconversion.core.DefaultTypeConverter; import liquibase.database.typeconversion.core.DerbyTypeConverter; import liquibase.database.typeconversion.core.FirebirdTypeConverter; import liquibase.database.typeconversion.core.H2TypeConverter; import liquibase.database.typeconversion.core.HsqlTypeConverter; import liquibase.database.typeconversion.core.InformixTypeConverter; import liquibase.database.typeconversion.core.MSSQLTypeConverter; import liquibase.database.typeconversion.core.MaxDBTypeConverter; import liquibase.database.typeconversion.core.MySQLTypeConverter; import liquibase.database.typeconversion.core.OracleTypeConverter; import liquibase.database.typeconversion.core.Postgres83TypeConverter; import liquibase.database.typeconversion.core.PostgresTypeConverter; import liquibase.database.typeconversion.core.SQLiteTypeConverter; import liquibase.database.typeconversion.core.SybaseASATypeConverter; import liquibase.database.typeconversion.core.SybaseTypeConverter;  import liquibase.snapshot.jvm.DB2DatabaseSnapshotGenerator; import liquibase.snapshot.jvm.DerbyDatabaseSnapshotGenerator;

Thanks Nathan for you answer on stackoverflow.com;



http://stackoverflow.com/questions/27291619/replacement-for-missing-liquibase-classes-moving-from-liquibase-2-0-3-to-3-3-0

To give some context, I have the following class that no longer compiles when I upgraded from liquibase-core 2.0.3 to liquibase-core 3.3.0 (due to the missing classes listed in my original post).

import java.lang.reflect.Field; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set;
import liquibase.change.Change; import liquibase.change.core.AddAutoIncrementChange; import liquibase.change.core.AddColumnChange; import liquibase.change.core.AddDefaultValueChange; import liquibase.change.core.AddForeignKeyConstraintChange; import liquibase.change.core.AddLookupTableChange; import liquibase.change.core.AddNotNullConstraintChange; import liquibase.change.core.AddPrimaryKeyChange; import liquibase.change.core.AddUniqueConstraintChange; import liquibase.change.core.AlterSequenceChange; import liquibase.change.core.AnonymousChange; import liquibase.change.core.CreateIndexChange; import liquibase.change.core.CreateProcedureChange; import liquibase.change.core.CreateSequenceChange; import liquibase.change.core.CreateTableChange; import liquibase.change.core.CreateViewChange; import liquibase.change.core.DeleteDataChange; import liquibase.change.core.DropAllForeignKeyConstraintsChange; import liquibase.change.core.DropColumnChange; import liquibase.change.core.DropDefaultValueChange; import liquibase.change.core.DropForeignKeyConstraintChange; import liquibase.change.core.DropIndexChange; import liquibase.change.core.DropNotNullConstraintChange; import liquibase.change.core.DropPrimaryKeyChange; import liquibase.change.core.DropSequenceChange; import liquibase.change.core.DropTableChange; import liquibase.change.core.DropUniqueConstraintChange; import liquibase.change.core.DropViewChange; import liquibase.change.core.EmptyChange; import liquibase.change.core.ExecuteShellCommandChange; import liquibase.change.core.InsertDataChange; import liquibase.change.core.LoadDataChange; import liquibase.change.core.LoadUpdateDataChange; import liquibase.change.core.MergeColumnChange; import liquibase.change.core.ModifyDataTypeChange; import liquibase.change.core.RawSQLChange; import liquibase.change.core.RenameColumnChange; import liquibase.change.core.RenameTableChange; import liquibase.change.core.RenameViewChange; import liquibase.change.core.SQLFileChange; import liquibase.change.core.StopChange; import liquibase.change.core.TagDatabaseChange; import liquibase.change.core.UpdateDataChange; import liquibase.change.custom.CustomChangeWrapper; import liquibase.database.Database; import liquibase.database.core.CacheDatabase; import liquibase.database.core.DB2Database; import liquibase.database.core.DB2iDatabase; import liquibase.database.core.DerbyDatabase; import liquibase.database.core.FirebirdDatabase; import liquibase.database.core.H2Database; import liquibase.database.core.HsqlDatabase; import liquibase.database.core.InformixDatabase; import liquibase.database.core.MSSQLDatabase; import liquibase.database.core.MaxDBDatabase; import liquibase.database.core.MySQLDatabase; import liquibase.database.core.OracleDatabase; import liquibase.database.core.PostgresDatabase; import liquibase.database.core.SQLiteDatabase; import liquibase.database.core.SybaseASADatabase; import liquibase.database.core.SybaseDatabase; import liquibase.database.core.UnsupportedDatabase; import liquibase.database.typeconversion.TypeConverter; import liquibase.database.typeconversion.core.CacheTypeConverter; import liquibase.database.typeconversion.core.DB2TypeConverter; import liquibase.database.typeconversion.core.DefaultTypeConverter; import liquibase.database.typeconversion.core.DerbyTypeConverter; import liquibase.database.typeconversion.core.FirebirdTypeConverter; import liquibase.database.typeconversion.core.H2TypeConverter; import liquibase.database.typeconversion.core.HsqlTypeConverter; import liquibase.database.typeconversion.core.InformixTypeConverter; import liquibase.database.typeconversion.core.MSSQLTypeConverter; import liquibase.database.typeconversion.core.MaxDBTypeConverter; import liquibase.database.typeconversion.core.MySQLTypeConverter; import liquibase.database.typeconversion.core.OracleTypeConverter; import liquibase.database.typeconversion.core.Postgres83TypeConverter; import liquibase.database.typeconversion.core.PostgresTypeConverter; import liquibase.database.typeconversion.core.SQLiteTypeConverter; import liquibase.database.typeconversion.core.SybaseASATypeConverter; import liquibase.database.typeconversion.core.SybaseTypeConverter; import liquibase.executor.Executor; import liquibase.executor.LoggingExecutor; import liquibase.executor.jvm.JdbcExecutor; import liquibase.ext.logging.slf4j.Slf4jLogger; import liquibase.logging.Logger; import liquibase.logging.core.DefaultLogger; import liquibase.parser.ChangeLogParser; import liquibase.parser.core.formattedsql.FormattedSqlChangeLogParser; import liquibase.parser.core.sql.SqlChangeLogParser; import liquibase.parser.core.xml.XMLChangeLogSAXParser; import liquibase.precondition.CustomPreconditionWrapper; import liquibase.precondition.Precondition; import liquibase.precondition.core.AndPrecondition; import liquibase.precondition.core.ChangeLogPropertyDefinedPrecondition; import liquibase.precondition.core.ChangeSetExecutedPrecondition; import liquibase.precondition.core.ColumnExistsPrecondition; import liquibase.precondition.core.DBMSPrecondition; import liquibase.precondition.core.ForeignKeyExistsPrecondition; import liquibase.precondition.core.IndexExistsPrecondition; import liquibase.precondition.core.NotPrecondition; import liquibase.precondition.core.OrPrecondition; import liquibase.precondition.core.PreconditionContainer; import liquibase.precondition.core.PrimaryKeyExistsPrecondition; import liquibase.precondition.core.RunningAsPrecondition; import liquibase.precondition.core.SequenceExistsPrecondition; import liquibase.precondition.core.SqlPrecondition; import liquibase.precondition.core.TableExistsPrecondition; import liquibase.precondition.core.ViewExistsPrecondition; import liquibase.servicelocator.PackageScanClassResolver; import liquibase.servicelocator.PackageScanFilter; import liquibase.servicelocator.ServiceLocator; import liquibase.snapshot.DatabaseSnapshotGenerator; import liquibase.snapshot.jvm.DB2DatabaseSnapshotGenerator; import liquibase.snapshot.jvm.DerbyDatabaseSnapshotGenerator; import liquibase.snapshot.jvm.H2DatabaseSnapshotGenerator; import liquibase.snapshot.jvm.HsqlDatabaseSnapshotGenerator; import liquibase.snapshot.jvm.InformixDatabaseSnapshotGenerator; import liquibase.snapshot.jvm.MSSQLDatabaseSnapshotGenerator; import liquibase.snapshot.jvm.MySQLDatabaseSnapshotGenerator; import liquibase.snapshot.jvm.OracleDatabaseSnapshotGenerator; import liquibase.snapshot.jvm.PostgresDatabaseSnapshotGenerator; import liquibase.snapshot.jvm.SQLiteDatabaseSnapshotGenerator; import liquibase.snapshot.jvm.StandardJdbcDatabaseSnapshotGenerator; import liquibase.sqlgenerator.SqlGenerator; import liquibase.sqlgenerator.core.*;
public class ServiceLocatorStaticClassResolver implements PackageScanClassResolver {

private Map<Class<?>, Set>>
implementations = new HashMap<Class<?>, Set>>();


{

  put(Logger.class, set(DefaultLogger.class, Slf4jLogger.class));

  put(Executor.class, set(JdbcExecutor.class, LoggingExecutor.class));

  put(DatabaseSnapshotGenerator.class,

      set(DB2DatabaseSnapshotGenerator.class, DerbyDatabaseSnapshotGenerator.class,

          H2DatabaseSnapshotGenerator.class, HsqlDatabaseSnapshotGenerator.class,

          InformixDatabaseSnapshotGenerator.class, MSSQLDatabaseSnapshotGenerator.class,

          MySQLDatabaseSnapshotGenerator.class, OracleDatabaseSnapshotGenerator.class,

          PostgresDatabaseSnapshotGenerator.class, SQLiteDatabaseSnapshotGenerator.class,

          StandardJdbcDatabaseSnapshotGenerator.class));

  put(SqlGenerator.class,

      set(AddAutoIncrementGenerator.class, AddAutoIncrementGeneratorDB2.class,

          AddAutoIncrementGeneratorHsqlH2.class, AddAutoIncrementGeneratorInformix.class,

          AddAutoIncrementGeneratorSQLite.class, AddColumnGenerator.class,

AddColumnGeneratorDefaultClauseBeforeNotNull.class, AddColumnGeneratorSQLite.class,

          AddDefaultValueGenerator.class, AddDefaultValueGeneratorDerby.class,

          AddDefaultValueGeneratorInformix.class, AddDefaultValueGeneratorMaxDB.class,

          AddDefaultValueGeneratorMSSQL.class, AddDefaultValueGeneratorMySQL.class,

          AddDefaultValueGeneratorOracle.class, AddDefaultValueGeneratorSybase.class,

          AddDefaultValueGeneratorSybaseASA.class, AddDefaultValueSQLite.class,

          AddForeignKeyConstraintGenerator.class, AddPrimaryKeyGenerator.class,

          AddPrimaryKeyGeneratorInformix.class, AddUniqueConstraintGenerator.class,

          AddUniqueConstraintGeneratorInformix.class, AddUniqueConstraintGeneratorTDS.class,

          AlterSequenceGenerator.class,

ClearDatabaseChangeLogTableGenerator.class, CommentGenerator.class,

          CopyRowsGenerator.class, CreateDatabaseChangeLogLockTableGenerator.class,

          CreateDatabaseChangeLogTableGenerator.class, CreateDatabaseChangeLogTableGeneratorSybase.class,

          CreateIndexGenerator.class,

CreateSequenceGenerator.class, CreateTableGenerator.class,

          CreateViewGenerator.class, DeleteGenerator.class, DropColumnGenerator.class,

          DropDefaultValueGenerator.class,

DropForeignKeyConstraintGenerator.class, DropIndexGenerator.class,

          DropPrimaryKeyGenerator.class,

DropSequenceGenerator.class, DropTableGenerator.class,

          DropUniqueConstraintGenerator.class, DropViewGenerator.class,

          FindForeignKeyConstraintsGeneratorDB2.class, FindForeignKeyConstraintsGeneratorMSSQL.class,

          FindForeignKeyConstraintsGeneratorMySQL.class, FindForeignKeyConstraintsGeneratorOracle.class,

          FindForeignKeyConstraintsGeneratorPostgres.class, GetNextChangeSetSequenceValueGenerator.class,

          GetViewDefinitionGenerator.class, GetViewDefinitionGeneratorDB2.class,

          GetViewDefinitionGeneratorDerby.class, GetViewDefinitionGeneratorFirebird.class,

          GetViewDefinitionGeneratorHsql.class, GetViewDefinitionGeneratorInformationSchemaViews.class,

          GetViewDefinitionGeneratorInformix.class, GetViewDefinitionGeneratorMaxDB.class,

          GetViewDefinitionGeneratorMSSQL.class, GetViewDefinitionGeneratorOracle.class,

          GetViewDefinitionGeneratorPostgres.class, GetViewDefinitionGeneratorSybase.class,

          GetViewDefinitionGeneratorSybaseASA.class,

InsertGenerator.class, InsertOrUpdateGenerator.class,

          InsertOrUpdateGeneratorDB2.class, InsertOrUpdateGeneratorMSSQL.class,

          InsertOrUpdateGeneratorMySQL.class, InsertOrUpdateGeneratorOracle.class,

          InsertOrUpdateGeneratorPostgres.class, LockDatabaseChangeLogGenerator.class,

          MarkChangeSetRanGenerator.class,

ModifyDataTypeGenerator.class, RawSqlGenerator.class,

          ReindexGeneratorSQLite.class,

RemoveChangeSetRanStatusGenerator.class, RenameColumnGenerator.class,

          RenameTableGenerator.class,

RenameViewGenerator.class, ReorganizeTableGeneratorDB2.class,

          RuntimeGenerator.class, SelectFromDatabaseChangeLogGenerator.class,

          SelectFromDatabaseChangeLogLockGenerator.class, SelectSequencesGeneratorDB2.class,

          SelectSequencesGeneratorDerby.class, SelectSequencesGeneratorFirebird.class,

          SelectSequencesGeneratorH2.class, SelectSequencesGeneratorHsql.class,

          SelectSequencesGeneratorInformix.class, SelectSequencesGeneratorMaxDB.class,

          SelectSequencesGeneratorOracle.class, SelectSequencesGeneratorPostgres.class,

          SetColumnRemarksGenerator.class,

SetTableRemarksGenerator.class, StoredProcedureGenerator.class,

          TagDatabaseGenerator.class, UnlockDatabaseChangeLogGenerator.class,

          UpdateChangeSetChecksumGenerator.class, UpdateGenerator.class));

  put(TypeConverter.class,

      set(CacheTypeConverter.class, DB2TypeConverter.class,

DefaultTypeConverter.class, DerbyTypeConverter.class,

          FirebirdTypeConverter.class,

H2TypeConverter.class, HsqlTypeConverter.class,

          InformixTypeConverter.class,

MaxDBTypeConverter.class, MSSQLTypeConverter.class,

          MySQLTypeConverter.class,

OracleTypeConverter.class, PostgresTypeConverter.class,

          Postgres83TypeConverter.class,

SQLiteTypeConverter.class, SybaseASATypeConverter.class,

          SybaseTypeConverter.class));

private Set<Class<?>> set(final Class<?>…
types) {

  return new HashSet<Class<?>>(Arrays.asList(types));

}


private void put(final Class<?> clazz, final
Set<Class<?>> set) {

  implementations.put(clazz, set);

}


public void setImplementations(final Map<Class<?>,
Set<Class<?>>> implementations) {

  this.implementations = implementations;

}


@Override

public Set<Class<?>> findImplementations(final
Class<?> parent, final String… packageNames) {

  final Set<Class<?>> classes = implementations.get(parent);

  if (classes != null) {

      return classes;

  } else {

      throw new RuntimeException("No classes defined

for " + parent);

  }

}


@Override

public Set<Class<?>> findByFilter(final
PackageScanFilter filter, final String… packageNames) {

  throw new UnsupportedOperationException();

}


@Override

public void addFilter(final PackageScanFilter filter) {

}


@Override

public void removeFilter(final PackageScanFilter filter) {

}


@Override

public void setClassLoaders(final Set
classLoaders) {

}


@Override

public Set getClassLoaders() {

  return null;

}


@Override

public void addClassLoader(final ClassLoader classLoader) {

}


public void init() throws Exception {

  final ServiceLocator sl = ServiceLocator.getInstance();

  final Field classResolver = sl.getClass().getDeclaredField("classResolver");

  classResolver.setAccessible(true);

  classResolver.set(sl, this);

}


}
You mention some of the changes required on stackoverflow.com, but would you be able to help me in the context of the above class, e.g. what specifically should I replace the missing classes with?

Also, I commented out some of the missing classes from this class to try and see if my application would at least start, but am now getting a NoSuchFieldException on this line of code:

final ServiceLocator sl = ServiceLocator.getInstance(); final Field classResolver = sl.getClass().getDeclaredField("classResolver");
It seems it can't find the 'classResolver' field in ServiceLocation, but I opened the .class file in eclipse and the field is there, any ideas whats going on?

Just a quick update here…



So i changed

public void init() throws Exception {

  final ServiceLocator sl = ServiceLocator.getInstance();

  final Field classResolver = sl.getClass().getDeclaredField("classResolver");

  classResolver.setAccessible(true);

  classResolver.set(sl, this);

}

to just

public void init() throws Exception {

  ServiceLocator.setInstance(new CustomResolverServiceLocator(this));

}

and added a few interface to class mappings to the above class listing that liquibase was complaining about;:

put(LockService.class, set(StandardLockService.class));


put(SnapshotGenerator.class,
set(JdbcSnapshotGenerator.class,
ColumnSnapshotGenerator.class,
H2ColumnSnapshotGenerator.class, UniqueConstraintSnapshotGenerator.class));

Just to get the class to compile, I commented out some of the classes my original post referred to:
//     set(DB2DatabaseSnapshotGenerator.class, DerbyDatabaseSnapshotGenerator.class,

//      H2DatabaseSnapshotGenerator.class, HsqlDatabaseSnapshotGenerator.class,

//          InformixDatabaseSnapshotGenerator.class, MSSQLDatabaseSnapshotGenerator.class,

//          MySQLDatabaseSnapshotGenerator.class, OracleDatabaseSnapshotGenerator.class,

//          PostgresDatabaseSnapshotGenerator.class, SQLiteDatabaseSnapshotGenerator.class,

//          StandardJdbcDatabaseSnapshotGenerator.class));*/</div></span></div>
and

// put(TypeConverter.class,

//
set(CacheTypeConverter.class, DB2TypeConverter.class,
DefaultTypeConverter.class, DerbyTypeConverter.class,

//
FirebirdTypeConverter.class, H2TypeConverter.class, HsqlTypeConverter.class,

//
InformixTypeConverter.class, MaxDBTypeConverter.class, MSSQLTypeConverter.class,

//
MySQLTypeConverter.class, OracleTypeConverter.class, PostgresTypeConverter.class,

//
Postgres83TypeConverter.class, SQLiteTypeConverter.class,
//SybaseASATypeConverter.class,

// SybaseTypeConverter.class));

When I run my app now though, I'm seeing the following exception;

liquibase.exception.LockException: java.lang.NullPointerException
at liquibase.lockservice.StandardLockService.acquireLock(StandardLockService.java:211)[343:org.liquibase.osgi:3.2.3]
at liquibase.lockservice.StandardLockService.waitForLock(StandardLockService.java:151)[343:org.liquibase.osgi:3.2.3]
at liquibase.Liquibase.update(Liquibase.java:182)[343:org.liquibase.osgi:3.2.3]
at liquibase.Liquibase.update(Liquibase.java:174)[343:org.liquibase.osgi:3.2.3]
at liquibase.integration.spring.SpringLiquibase.performUpdate(SpringLiquibase.java:345)[343:org.liquibase.osgi:3.2.3]
at liquibase.integration.spring.SpringLiquibase.afterPropertiesSet(SpringLiquibase.java:302)[343:org.liquibase.osgi:3.2.3]
at com.myapp.bootstrap.liquibase.LiquibaseFactoryImpl.upgradeDatabase(LiquibaseFactoryImpl.java:264)[319:com.myapp.bootstrap:3.0.1.SNAPSHOT]
at commyapp.bootstrap.liquibase.LiquibaseFactoryImpl.upgradeDatabase(LiquibaseFactoryImpl.java:146)[319:com.myapp.bootstrap:3.0.1.SNAPSHOT]
at com.myapp.data.source.liquibase.LiquibaseRunner.upgradeDatabase(LiquibaseRunner.java:46)[307:com.myapp.data.source:3.0.1.SNAPSHOT]
at com.myapp.data.source.DatasourceManagedServiceFactory.upgradeDatabase(DatasourceManagedServiceFactory.java:235)[307:com.myapp.data.source:3.0.1.SNAPSHOT]
at com.myapp.data.source.DatasourceManagedServiceFactory.access$300(DatasourceManagedServiceFactory.java:46)[307:com.myapp.data.source:3.0.1.SNAPSHOT]
at com.myapp.data.source.DatasourceManagedServiceFactory$1.run(DatasourceManagedServiceFactory.java:95)[307:com.myapp.data.source:3.0.1.SNAPSHOT]
Caused by: java.lang.NullPointerException
at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:153)[343:org.liquibase.osgi:3.2.3]
at liquibase.snapshot.DatabaseSnapshot.init(DatabaseSnapshot.java:51)[343:org.liquibase.osgi:3.2.3]
at liquibase.snapshot.DatabaseSnapshot.(DatabaseSnapshot.java:33)[343:org.liquibase.osgi:3.2.3]
at liquibase.snapshot.JdbcDatabaseSnapshot.(JdbcDatabaseSnapshot.java:22)[343:org.liquibase.osgi:3.2.3]
at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:126)[343:org.liquibase.osgi:3.2.3]
at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:119)[343:org.liquibase.osgi:3.2.3]
at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:107)[343:org.liquibase.osgi:3.2.3]
at liquibase.snapshot.SnapshotGeneratorFactory.has(SnapshotGeneratorFactory.java:97)[343:org.liquibase.osgi:3.2.3]
at liquibase.snapshot.SnapshotGeneratorFactory.hasDatabaseChangeLogLockTable(SnapshotGeneratorFactory.java:166)[343:org.liquibase.osgi:3.2.3]
at liquibase.lockservice.StandardLockService.hasDatabaseChangeLogLockTable(StandardLockService.java:138)[343:org.liquibase.osgi:3.2.3]
at liquibase.lockservice.StandardLockService.init(StandardLockService.java:85)[343:org.liquibase.osgi:3.2.3]
at liquibase.lockservice.StandardLockService.acquireLock(StandardLockService.java:185)[343:org.liquibase.osgi:3.2.3]
... 11 more

Any help is much appreciated!

Sorry for the delay getting back to you. I’ve been trying to get liquibase 3.3.1 out and it took longer than I was hoping.

So it looks like your class is mainly an alternative to the normal Liquibase class-finding logic to better fit in your environment? You aren't necessarily using the missing classes, but you need to make sure all the standard liquibase classes are being loaded so that it works as it should. Is that correct? Or are there extension classes of your own that are not compiling?

The NullPointerException is odd for running 3.3.0 since that corresponds to “return true”. Are you sure there isn’t another liquibase version in your classpath somewhere?

Nathan

Thanks for getting back to me Nathan.

Just for some context, the original issue I was encountering was this;

  1. I upgraded the application I’m using liquibase 2.0.3 in (note my application runs on JBoss Fuse 6.0.0)
  1. When the application started up for the first time, it created the db tables via a liquibase script, all ok
  1. However, when I restarted my application, it seems it couldn’t connect to the db anymore, and I was seeing this;

liquibase.exception.ServiceNotFoundException: Could not find implementation of liquibase.logging.Logger

My previous version of the application (which is fine, and restarting it doesn’t cause any issues), is also using JBoss Fuse 6.0.0 and liquibase 2.0.3, so I am unsure what has changed in my application to cause this issue to start appearing.

I had a google for this error and see it mentioned a couple of times before;

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

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

So at this point, I was going to try and upgrade liquibase from 2.0.3 to 3.3.0 just in case the issue had been fixed in a later release.

I’ll double check the classpath to ensure I haven’t another liquibase version on it in case thats causing the NPE, and do a bit more digging around.

Thanks for your help