I'm using the liquibase-maven-plugin
to version my PostgreSQL db. When I execute the plugin, my db is successfully updated, but I always get a stack trace with a Snowflake-related ClassNotFoundException
. I'm not using Snowflake at all, and I have no other Snowflake dependencies. I've tried excluding the liquibase-snowflake
transitive dependency; this had no effect.
Here's a sample pom that recreates the issue every time. (The changelog file must exist, but can be completely empty for purposes of recreating the Snowflake stack trace.)
<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>
<groupId>my.test</groupId>
<artifactId>lb-snowflake</artifactId>
<version>1.0-SNAPSHOT</version>
<name>lb-snowflake</name>
<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.5</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>4.32.0</version>
<executions>
<execution>
<id>run-lb</id>
<configuration>
<changeLogFile>src/main/lb/databasechangelog.xml</changeLogFile>
<verbose>true</verbose>
</configuration>
<goals>
<goal>update</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
I execute the plugin with this:
mvn -X liquibase:update@run-lb \
-Dliquibase.url=jdbc:postgresql://localhost:5432/my_db \
-Dliquibase.username=postgres_username \
-Dliquibase.password=""
Here's the stack trace I get:
Starting Liquibase at 14:52:37 using Java 21.0.4 (version 4.32.0 #8159 built at 2025-05-19 23:00+0000)
[INFO] Cannot load service: liquibase.database.DatabaseConnection: com.datical.liquibase.ext.database.jvm.SnowflakeProJdbcConnection Unable to get public no-arg constructor
java.util.ServiceConfigurationError: liquibase.database.DatabaseConnection: com.datical.liquibase.ext.database.jvm.SnowflakeProJdbcConnection Unable to get public no-arg constructor
at java.util.ServiceLoader.fail (ServiceLoader.java:586)
at java.util.ServiceLoader.getConstructor (ServiceLoader.java:679)
at java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService (ServiceLoader.java:1240)
at java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext (ServiceLoader.java:1273)
at java.util.ServiceLoader$2.hasNext (ServiceLoader.java:1309)
at java.util.ServiceLoader$3.hasNext (ServiceLoader.java:1393)
at liquibase.servicelocator.StandardServiceLocator.findInstances (StandardServiceLocator.java:24)
at liquibase.database.ConnectionServiceFactory.<init> (ConnectionServiceFactory.java:75)
at liquibase.database.ConnectionServiceFactory.getInstance (ConnectionServiceFactory.java:22)
at liquibase.database.DatabaseFactory.openConnection (DatabaseFactory.java:238)
at liquibase.database.DatabaseFactory.openConnection (DatabaseFactory.java:188)
at liquibase.database.DatabaseFactory.openDatabase (DatabaseFactory.java:153)
at liquibase.integration.commandline.CommandLineUtils.createDatabaseObject (CommandLineUtils.java:94)
at liquibase.integration.commandline.CommandLineUtils.createDatabaseObject (CommandLineUtils.java:62)
at org.liquibase.maven.plugins.AbstractLiquibaseMojo.lambda$execute$2 (AbstractLiquibaseMojo.java:1022)
at liquibase.Scope.lambda$child$0 (Scope.java:216)
at liquibase.Scope.child (Scope.java:225)
at liquibase.Scope.child (Scope.java:215)
at liquibase.Scope.child (Scope.java:194)
at org.liquibase.maven.plugins.AbstractLiquibaseMojo.lambda$execute$3 (AbstractLiquibaseMojo.java:995)
at liquibase.Scope.lambda$child$0 (Scope.java:216)
at liquibase.Scope.child (Scope.java:225)
at liquibase.Scope.child (Scope.java:215)
at liquibase.Scope.child (Scope.java:194)
at org.liquibase.maven.plugins.AbstractLiquibaseMojo.execute (AbstractLiquibaseMojo.java:917)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:328)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:903)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:280)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:203)
at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103)
at java.lang.reflect.Method.invoke (Method.java:580)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:255)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:201)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:361)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:314)
Caused by: java.lang.NoClassDefFoundError: net/snowflake/client/jdbc/internal/org/bouncycastle/operator/OperatorCreationException
at java.lang.Class.getDeclaredConstructors0 (Native Method)
at java.lang.Class.privateGetDeclaredConstructors (Class.java:3549)
at java.lang.Class.getConstructor0 (Class.java:3754)
at java.lang.Class.getConstructor (Class.java:2442)
at java.util.ServiceLoader$1.run (ServiceLoader.java:666)
at java.util.ServiceLoader$1.run (ServiceLoader.java:663)
at java.security.AccessController.doPrivileged (AccessController.java:571)
at java.util.ServiceLoader.getConstructor (ServiceLoader.java:674)
at java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService (ServiceLoader.java:1240)
at java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext (ServiceLoader.java:1273)
at java.util.ServiceLoader$2.hasNext (ServiceLoader.java:1309)
at java.util.ServiceLoader$3.hasNext (ServiceLoader.java:1393)
at liquibase.servicelocator.StandardServiceLocator.findInstances (StandardServiceLocator.java:24)
at liquibase.database.ConnectionServiceFactory.<init> (ConnectionServiceFactory.java:75)
at liquibase.database.ConnectionServiceFactory.getInstance (ConnectionServiceFactory.java:22)
at liquibase.database.DatabaseFactory.openConnection (DatabaseFactory.java:238)
at liquibase.database.DatabaseFactory.openConnection (DatabaseFactory.java:188)
at liquibase.database.DatabaseFactory.openDatabase (DatabaseFactory.java:153)
at liquibase.integration.commandline.CommandLineUtils.createDatabaseObject (CommandLineUtils.java:94)
at liquibase.integration.commandline.CommandLineUtils.createDatabaseObject (CommandLineUtils.java:62)
at org.liquibase.maven.plugins.AbstractLiquibaseMojo.lambda$execute$2 (AbstractLiquibaseMojo.java:1022)
at liquibase.Scope.lambda$child$0 (Scope.java:216)
at liquibase.Scope.child (Scope.java:225)
at liquibase.Scope.child (Scope.java:215)
at liquibase.Scope.child (Scope.java:194)
at org.liquibase.maven.plugins.AbstractLiquibaseMojo.lambda$execute$3 (AbstractLiquibaseMojo.java:995)
at liquibase.Scope.lambda$child$0 (Scope.java:216)
at liquibase.Scope.child (Scope.java:225)
at liquibase.Scope.child (Scope.java:215)
at liquibase.Scope.child (Scope.java:194)
at org.liquibase.maven.plugins.AbstractLiquibaseMojo.execute (AbstractLiquibaseMojo.java:917)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:328)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:903)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:280)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:203)
at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103)
at java.lang.reflect.Method.invoke (Method.java:580)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:255)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:201)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:361)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:314)
Caused by: java.lang.ClassNotFoundException: net.snowflake.client.jdbc.internal.org.bouncycastle.operator.OperatorCreationException
at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass (SelfFirstStrategy.java:42)
at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass (ClassRealm.java:225)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass (ClassRealm.java:210)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass (ClassRealm.java:205)
at java.lang.Class.getDeclaredConstructors0 (Native Method)
at java.lang.Class.privateGetDeclaredConstructors (Class.java:3549)
at java.lang.Class.getConstructor0 (Class.java:3754)
at java.lang.Class.getConstructor (Class.java:2442)
at java.util.ServiceLoader$1.run (ServiceLoader.java:666)
at java.util.ServiceLoader$1.run (ServiceLoader.java:663)
at java.security.AccessController.doPrivileged (AccessController.java:571)
at java.util.ServiceLoader.getConstructor (ServiceLoader.java:674)
at java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService (ServiceLoader.java:1240)
at java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext (ServiceLoader.java:1273)
at java.util.ServiceLoader$2.hasNext (ServiceLoader.java:1309)
at java.util.ServiceLoader$3.hasNext (ServiceLoader.java:1393)
at liquibase.servicelocator.StandardServiceLocator.findInstances (StandardServiceLocator.java:24)
at liquibase.database.ConnectionServiceFactory.<init> (ConnectionServiceFactory.java:75)
at liquibase.database.ConnectionServiceFactory.getInstance (ConnectionServiceFactory.java:22)
at liquibase.database.DatabaseFactory.openConnection (DatabaseFactory.java:238)
at liquibase.database.DatabaseFactory.openConnection (DatabaseFactory.java:188)
at liquibase.database.DatabaseFactory.openDatabase (DatabaseFactory.java:153)
at liquibase.integration.commandline.CommandLineUtils.createDatabaseObject (CommandLineUtils.java:94)
at liquibase.integration.commandline.CommandLineUtils.createDatabaseObject (CommandLineUtils.java:62)
at org.liquibase.maven.plugins.AbstractLiquibaseMojo.lambda$execute$2 (AbstractLiquibaseMojo.java:1022)
at liquibase.Scope.lambda$child$0 (Scope.java:216)
at liquibase.Scope.child (Scope.java:225)
at liquibase.Scope.child (Scope.java:215)
at liquibase.Scope.child (Scope.java:194)
at org.liquibase.maven.plugins.AbstractLiquibaseMojo.lambda$execute$3 (AbstractLiquibaseMojo.java:995)
at liquibase.Scope.lambda$child$0 (Scope.java:216)
at liquibase.Scope.child (Scope.java:225)
at liquibase.Scope.child (Scope.java:215)
at liquibase.Scope.child (Scope.java:194)
at org.liquibase.maven.plugins.AbstractLiquibaseMojo.execute (AbstractLiquibaseMojo.java:917)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:328)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:903)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:280)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:203)
at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103)
at java.lang.reflect.Method.invoke (Method.java:580)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:255)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:201)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:361)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:314)
It looks like LB attempts to auto-configure about two dozen different db flavors on startup, but I couldn't find anything in their docs on how to configure/suppress. A search of the LB GitHub project didn't turn up any related bugs. After hours of research, I haven't stumbled on anyone reporting the same issue. LLM suggestions are to downgrade to a pre-Snowflake version or rebundle the library myself! Is there a way to suppress auto-detection for Snowflake, or just exclude it altogether?
Turns out this is an actual bug in 4.32.0: github.com/liquibase/liquibase/issues/6982
Temp workaround is to downgrade to 4.31.0.
Thanks to @mario-champion for posting about it in the comments below!