I'm trying to implement liquibase in an existing SpringBoot project with MYSQL database. I want to be able to generate changesets which specify the differences when an entity is changed.
What I've done:
I've added liquibase dependencies and the gradle liquibase plugin in my build.gradle
file. After making a domain change, I've run gradle generateChangeLog
. The command executes successfully but nothing happens.
I read somewhere that this gradle plugin works only for the inmemory h2 database? Is that true? If yes then what alternative should I use to generate changelogs automatically.
I could not find a working SpringBoot gradle based example which uses MYSQL and has liquibase implemented WITH automatic change generation ability. It would be great if someone could provide that.
References:
The solutions is to write a gradle task which invokes liquibase diffChangeLog
Create a liquibase.gradle
file in the project root directory, add liquibase-hibernate extension and write a gradle task that invokes the liquibase diffChangeLog
command.
configurations {
liquibase
}
dependencies {
liquibase group: 'org.liquibase.ext', name: 'liquibase-hibernate4', version: 3.5
}
//loading properties file.
Properties liquibaseProps = new Properties()
liquibaseProps.load(new FileInputStream("src/main/resources/liquibase-task.properties"))
Properties applicationProps = new Properties()
applicationProps.load(new FileInputStream("src/main/resources/application.properties"))
task liquibaseDiffChangelog(type: JavaExec) {
group = "liquibase"
classpath sourceSets.main.runtimeClasspath
classpath configurations.liquibase
main = "liquibase.integration.commandline.Main"
args "--changeLogFile=" + liquibaseProps.getProperty('liquibase.changelog.path')+ buildTimestamp() +"_changelog.xml"
args "--referenceUrl=hibernate:spring:" + liquibaseProps.getProperty('liquibase.domain.package') + "?dialect=" + applicationProps.getProperty('spring.jpa.properties.hibernate.dialect')
args "--username=" + applicationProps.getProperty('spring.datasource.username')
args "--password=" + applicationProps.getProperty('spring.datasource.password')
args "--url=" + applicationProps.getProperty('spring.datasource.url')
args "--driver=com.mysql.jdbc.Driver"
args "diffChangeLog"
}
def buildTimestamp() {
def date = new Date()
def formattedDate = date.format('yyyyMMddHHmmss')
return formattedDate
}
NOTE: I have used properties files to pass arguments to the liquibase command, you could add the values directly, but that would not be a good practice.
Next, you would need to apply the liquibase.gradle
file from within the project's build.gradle
file. and add the liquibase dependency
apply from: 'liquibase.gradle'
//code omitted
dependencies {
compile (group: 'org.liquibase', name: 'liquibase-core', version: "3.4.2")
}
After this step liquibase would be setup completely.
You can now use
gradle liquibaseDiffChangeLog
to generate changelogs.
You can have the Custom task as mentioned by @Hazim and liquibase gradle plugin as well for doing things apart from generating a diff. Check out this post. Git Issue
plugins {
id 'org.liquibase.gradle' version '2.0.1'
}
The Gradle liquibase plugin worked for me after I added built resources and classes to its runtime dependencies, as follows:
dependencies {
liquibaseRuntime 'org.liquibase:liquibase-core:3.5.3'
liquibaseRuntime 'org.liquibase:liquibase-groovy-dsl:2.0.1'
liquibaseRuntime 'mysql:mysql-connector-java:5.1.34'
liquibaseRuntime 'org.liquibase.ext:liquibase-hibernate4:3.6'
liquibaseRuntime 'javax.persistence:javax.persistence-api:2.2'
liquibaseRuntime files('build/classes/java/main')
liquibaseRuntime files('build/resources/main')
// Your other dependencies...
}
I defined its main activity as:
liquibase {
activities {
main {
changeLogFile 'build/liquibase_change_log.xml'
url 'jdbc:mysql://localhost/YOURDATABASE'
username 'YOURUSER'
password 'YOURPASSWORD'
driver 'com.mysql.jdbc.Driver'
referenceUrl 'hibernate:classic:/hibernate.cfg.xml'
}
}
}
Note that I'm just using a classic Hibernate configuration to define the source schema.
The hibernate4 integration of liquibase looks for /hibernate.cfg.xml in the classpath of the JVM that is running liquibase. It will also need to find your schema classes.
I also added this:
diffChangeLog.dependsOn build
来源:https://stackoverflow.com/questions/35716378/unable-to-generate-difference-from-liquibase-gradle-plugin