Snæ*_*ørn 5 java hibernate liquibase gradle spring-boot
我在Spring Boot项目中很难设置LiquiBase。我试图浏览文档并找到一些指南-但它们似乎彼此矛盾:(
我希望通过Gradle使用LiquiBase,并且希望它从Hibernate生成变更日志,并最终获得一个SQL脚本,我可以在服务器上运行该脚本以将架构更新为适当的版本。
为了使其通过Gradle运行,我使用了此插件 https://github.com/liquibase/liquibase-gradle-plugin,并使用了自述文件中显示的推荐设置。
为了使Hibernate diff能够正常工作,我正在使用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
但是失败了
任务:diffChangeLog liquibase-plugin:正在运行'main'活动...在2018年9月26日星期三CEST启动Liquibase(版本3.6.2创建于2018-07-03 11:28:09)异常线程“主要” java.lang.NoClassDefFoundError:org / springframework / core / io / ClassPathResource在liquibase.ext.hibernate.database.HibernateSpringPackageDatabase.isXmlFile(HibernateSpringPackageDatabase.java:54)
看起来找不到Spring Boot。因此,我尝试删除,liquibaseRuntime但随后LiquiBase Gradle插件抱怨liquibaseRuntime缺少该组件。
似乎我陷入了循环。什么是理智的设置方式?我真的不想重复内的所有依赖关系liquibaseRuntime。另外,文档字面意思是:
Run Code Online (Sandbox Code Playgroud)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 boot config中设置了它,为什么呢?
进展
因此更改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差异
给我这个输出
Run Code Online (Sandbox Code Playgroud)> 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')
}
小智 5
我知道这是一个旧线程,但我想为那些后来找到这个答案的人添加一些说明......
该liquibaseRuntime配置不从任何其他配置继承。这是因为在大多数情况下,Liquibase 只需要能够解析更改日志并连接到数据库。要使用 Hibernate 模块之类的东西,或者从代码生成更改日志,您需要向 liquibaseRuntime 添加额外的内容,例如 Hibernate 或 Spring Data,并且您需要srcSets.main.output能够自己找到项目文件。
评论说“除了...之外,您的所有正常项目依赖项都将在这里...”指的是您将在块中拥有一堆其他依赖项来构建和运行您的项目,而不是它们将成为一部分的liquibaseRuntime配置。如果你想所有的库从您的项目也成为团队的一分子liquibaseRuntime,你可以添加configurations.liquibaseRuntime.extendsFrom configurations.runtime你你的build.gradle,或者如果你已经有一个configurations块,你可以添加liquibaseRuntime.extendsFrom runtime到该块。这应该将所有项目依赖项和项目文件本身添加到您的 liquibaseRuntime。
我希望这有帮助。
| 归档时间: | 
 | 
| 查看次数: | 3185 次 | 
| 最近记录: |