title: Setup LiquiBase in a Gradle Spring Boot Hibernate project
body: <p>I'm having a hard time setting up LiquiBase in my Spring Boot project. I tried looking through the docs and finding some guides - but they seem contradict each other :(</p>
  
  <p>I wish to use LiquiBase via Gradle and I want it to generate the changelogs from Hibernate and end up with a SQL script I can run on the server to update the schema to the appropriate version.</p>
  
  <p>To get it to run via Gradle I'm using this plugin  <a href="https://github.com/liquibase/liquibase-gradle-plugin" rel="noreferrer">https://github.com/liquibase/liquibase-gradle-plugin</a> using the recommended setup shown in their README.</p>
  
  <p>To get the Hibernate diff to work I'm using <a href="https://github.com/liquibase/liquibase-hibernate" rel="noreferrer">https://github.com/liquibase/liquibase-hibernate</a></p>
  
  <p>Here's my <strong>build.gradle</strong> file:</p>
  
  <pre><code>buildscript {
      ext {
          springBootVersion = '2.0.5.RELEASE'
      }
      repositories {
          mavenCentral()
      }
      dependencies {
          classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
      }
  }
  
  plugins {
      id 'java'
      id 'net.ltgt.apt' version '0.10' // https://projectlombok.org/setup/gradle
      id 'org.liquibase.gradle' version '2.0.1' // https://github.com/liquibase/liquibase-gradle-plugin
  }
  
  apply plugin: 'eclipse-wtp'
  apply plugin: 'org.springframework.boot'
  apply plugin: 'io.spring.dependency-management'
  apply plugin: 'war'
  
  group = 'com.example'
  version = '0.0.1-SNAPSHOT'
  sourceCompatibility = 1.8
  
  repositories {
      mavenCentral()
  
      maven {
          credentials {
              username = oracleUser
              password = oraclePass
          }
          url 'https://www.oracle.com/content/secure/maven/content'
      }
  }
  
  liquibase {
    activities {
      main {
        changeLogFile 'main.groovy'
        url 'jdbc:oracle:thin:@localhost:1521:XE'
        referenceUrl 'hibernate:spring:com.example?dialect=org.hibernate.dialect.Oracle10gDialect'
        username 'user'
        password 'pass'
      }
    }
  }
  
  configurations {
      providedRuntime
  }
  
  dependencies {
      compile('org.springframework.boot:spring-boot-starter-data-jpa')
      compile('org.springframework.boot:spring-boot-starter-data-rest')
      compile('org.springframework.boot:spring-boot-starter-hateoas')
      compile('org.springframework.boot:spring-boot-starter-jooq')
      compile('org.springframework.boot:spring-boot-starter-web')
      compile('org.springframework.boot:spring-boot-starter-mail')
      compile('com.github.waffle:waffle-spring-boot-starter:1.9.0')
      compile('com.oracle.jdbc:ojdbc8:12.2.0.1')
      runtime('org.springframework.boot:spring-boot-devtools')
      compileOnly('org.projectlombok:lombok')
      apt('org.projectlombok:lombok:1.18.2')
      liquibaseRuntime('org.liquibase:liquibase-core:3.6.2')
      liquibaseRuntime('org.liquibase:liquibase-groovy-dsl:2.0.1')
      liquibaseRuntime('org.liquibase.ext:liquibase-hibernate5:3.6')
      liquibaseRuntime('com.oracle.jdbc:ojdbc8:12.2.0.1') // duplicate...
      providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
      testCompile('org.springframework.boot:spring-boot-starter-test')
      testCompile('org.springframework.restdocs:spring-restdocs-mockmvc')
  }
  </code></pre>
  
  <p>Running it via</p>
  
  <blockquote>
    <p><code>&gt; .\gradlew diffChangeLog -PrunList=main</code></p>
  </blockquote>
  
  <p>But fails with</p>
  
  <blockquote>
    <p>Task :diffChangeLog liquibase-plugin: Running the 'main' activity... Starting Liquibase at Wed, 26 Sep 2018 13:36:24 CEST (version 3.6.2
    built at 2018-07-03 11:28:09) Exception in thread "main"
    java.lang.NoClassDefFoundError:
    org/springframework/core/io/ClassPathResource
            at liquibase.ext.hibernate.database.HibernateSpringPackageDatabase.isXmlFile(HibernateSpringPackageDatabase.java:54)</p>
  </blockquote>
  
  <p>It looks like it cannot find Spring Boot. So I then tried removing the <code>liquibaseRuntime</code> but then the LiquiBase Gradle plugin complains that <code>liquibaseRuntime</code> is missing.</p>
  
  <p>Seems I'm stuck in a loop. What is a sane way of setting this up?
  I really don't want to repeat every dependency inside the <code>liquibaseRuntime</code>. Also the doc literally says:</p>
  
  <blockquote>
  <pre><code>dependencies {
    // All of your normal project dependencies would be here in addition to...
    liquibaseRuntime 'org.liquibase:liquibase-core:3.6.1'
    liquibaseRuntime 'org.liquibase:liquibase-groovy-dsl:2.0.1'
    liquibaseRuntime 'mysql:mysql-connector-java:5.1.34'
  }
  </code></pre>
  </blockquote>
  
  <p>Note the </p>
  
  <blockquote>
    <p>// All of your normal project dependencies would be here in addition to...</p>
  </blockquote>
  
  <p>So yeah. Why...</p>
  
  <p>Please help!</p>
  
  <p>Also... I noticed that you have to write database config twice. Why is that needed when it's already set in spring boot config?</p>
  
  <hr>
  
  <p><strong>PROGRESS</strong></p>
  
  <p>So changing <code>liquibaseRuntime</code> to</p>
  
  <pre><code>liquibaseRuntime('org.liquibase:liquibase-core:3.6.2')
  liquibaseRuntime('org.liquibase:liquibase-groovy-dsl:2.0.1')
  liquibaseRuntime('org.liquibase.ext:liquibase-hibernate5:3.6')
  liquibaseRuntime('com.oracle.jdbc:ojdbc8:12.2.0.1')
  liquibaseRuntime('org.springframework.boot:spring-boot-starter-data-jpa')
  liquibaseRuntime files('src/main')
  </code></pre>
  
  <p>Makes the errors go away. But it still doesn't work.</p>
  
  <p>Running this command</p>
  
  <blockquote>
    <p>.\gradlew diff</p>
  </blockquote>
  
  <p>Gives me this output</p>
  
  <blockquote>
  <pre><code>&gt; Task :diff
  liquibase-plugin: Running the 'main' activity...
  Starting Liquibase at Wed, 26 Sep 2018 16:47:19 CEST (version 3.6.2 built at 2018-07-03 11:28:09)
  
  Diff Results:
  Reference Database: null @ hibernate:spring:com.example.model?dialect=org.hibernate.dialect.Oracle10gDialect (Default Schema: HIBERNATE)
  Comparison Database: SYSTEM @ jdbc:oracle:thin:@localhost:1521:XE (Default Schema: SYSTEM)
  Compared Schemas: HIBERNATE -&gt; SYSTEM
  Product Name:
       Reference:   'Hibernate'
       Target: 'Oracle'
  Product Version:
       Reference:   '5.2.17.Final'
       Target: 'Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production'
  Missing Catalog(s):
       HIBERNATE
  Unexpected Catalog(s): NONE
  Changed Catalog(s): NONE
  Missing Column(s): NONE
  Unexpected Column(s): NONE
  Changed Column(s): NONE
  Missing Foreign Key(s): NONE
  Unexpected Foreign Key(s): NONE
  Changed Foreign Key(s): NONE
  Missing Index(s): NONE
  Unexpected Index(s): NONE
  Changed Index(s): NONE
  Missing Primary Key(s): NONE
  Unexpected Primary Key(s): NONE
  Changed Primary Key(s): NONE
  Missing Sequence(s): NONE
  Unexpected Sequence(s): NONE
  Changed Sequence(s): NONE
  Missing Stored Procedure(s): NONE
  Unexpected Stored Procedure(s): NONE
  Changed Stored Procedure(s): NONE
  Missing Table(s): NONE
  Unexpected Table(s): NONE
  Changed Table(s): NONE
  Missing Unique Constraint(s): NONE
  Unexpected Unique Constraint(s): NONE
  Changed Unique Constraint(s): NONE
  Missing View(s): NONE
  Unexpected View(s): NONE
  Changed View(s): NONE
  Liquibase command 'diff' was executed successfully.
  
  
  BUILD SUCCESSFUL in 7s
  1 actionable task: 1 executed
  </code></pre>
  </blockquote>
  
  <p>When running against an empty database. So yeah - it doesn't work :(</p>