在 Gradle Spring Boot Hibernate 项目中设置 LiquiBase



我很难在我的Spring Boot项目中设置LiquiBase。我尝试浏览文档并找到一些指南 - 但它们似乎相互矛盾。

我希望通过 Gradle 使用 LiquiBase,我希望它从 Hibernate 生成更改日志,并最终得到一个可以在服务器上运行的 SQL 脚本,以将架构更新到适当的版本。

为了让它通过 Gradle 运行,我正在使用这个插件 https://github.com/liquibase/liquibase-gradle-plugin 使用他们的自述文件中显示的推荐设置。

为了让休眠差异工作,我正在使用 https://github.com/liquibase/liquibase-hibernate

这是我的build.gradle文件:

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')
}

通过以下方式运行它

> .gradlew diffChangeLog -PrunList=main

但失败了

任务:d iffChangeLog liquibase-plugin:运行"主要"活动...开始 Liquibase 于 周三, 26 九月 2018 13:36:24 CEST (版本 3.6.2 构建于 2018-07-03 11:28:09( 线程"main"中的异常 java.lang.NoClassDefFoundError: org/springframework/core/io/ClassPathResource at liquibase.ext.hibernate.database.HibernateSpringPackageDatabase.isXmlFile(HibernateSpringPackageDatabase.java:54(

看起来找不到Spring Boot。所以我随后尝试删除liquibaseRuntime但随后 LiquiBase Gradle 插件抱怨liquibaseRuntime丢失。

似乎我陷入了一个循环。什么是理智的设置方式? 我真的不想重复liquibaseRuntime中的每个依赖项.文档的字面意思也说:

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'
}

注意

除了... 除了

...

为什么会这样?

另外,我注意到您必须编写两次数据库配置。当它已经在 Spring 启动配置中设置时,为什么需要它?

<小时 />

进度

所以liquibaseRuntime改为

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')

使错误消失。但它仍然不起作用。

运行以下命令:

.gradlew diff

给我这个输出:

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

针对空数据库运行时。

事实证明,我需要添加一些未记录的魔法酱。

diff.dependsOn compileJava
diffChangeLog.dependsOn compileJava
generateChangelog.dependsOn compileJava
dependencies {
// as before
liquibaseRuntime sourceSets.main.output // replaces liquibaseRuntime files('src/main')
}

我知道这是一个古老的线程,但我想为那些稍后找到这个答案的人添加一些澄清......

liquibaseRuntime配置不会继承自任何其他配置。 这是因为在大多数情况下,Liquibase 只需要能够解析更改日志并连接到数据库。 要使用Hibernate模块之类的东西,或者从代码生成更改日志,你需要向liquibaseRuntime添加额外的东西,比如Hibernate或Spring Data,你需要srcSets.main.output才能找到你的项目文件本身。

评论说"除了......之外,您所有正常的项目依赖项都会在这里......"指的是块中有一堆其他依赖项来构建和运行项目的事实,而不是它们将成为liquibaseRuntime配置的一部分。 如果您确实希望项目中的所有库也成为liquibaseRuntime的一部分,则可以configurations.liquibaseRuntime.extendsFrom configurations.runtimebuild.gradle中添加,或者如果您已经有一个configurations块,则可以向该块添加liquibaseRuntime.extendsFrom runtime。 这应该将所有项目依赖项和项目文件本身添加到您的 liquibaseRuntime 中。

我希望这有所帮助。

这就是它在 Gradle 6.3.0 中的工作方式:

configurations {
liquibaseRuntime.extendsFrom runtimeClasspath
}
dependencies {
liquibaseRuntime sourceSets.main.output
}

最新更新