liquibaseliquibase-maven-plugin

Can Snowflake auto-detection be disabled in Liquibase?


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?


Solution

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