SpringBootプロジェクトでLiquiBaseをセットアップするのに苦労しています。私はドキュメントを調べていくつかのガイドを見つけようとしましたが、それらは互いに矛盾しているようです:(
Gradle経由でLiquiBaseを使用したいのですが、Hibernateから変更ログを生成し、サーバー上で実行してスキーマを適切なバージョンに更新できるSQLスクリプトを作成したいと考えています。
Gradle経由で実行するには、このプラグインを使用しています https://github.com/liquibase/liquibase-gradle-plugin READMEに示されている推奨セットアップを使用しています。
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-プラグイン:「メイン」アクティビティを実行しています... 2018年9月26日水曜日にLiquibaseを開始13:36:24CEST(バージョン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)
SpringBootが見つからないようです。そこで、liquibaseRuntime
を削除しようとしましたが、LiquiBaseGradleプラグインが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' }
注意してください
//通常のプロジェクトの依存関係はすべてここにあります...
そうそう。なぜ...
助けてください!
また...データベース設定を2回書き込む必要があることに気づきました。 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 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モジュールのようなものを使用したり、コードから変更ログを生成したりするには、HibernateやSpring Dataなどの追加のものをliquibaseRuntimeに追加する必要があり、を見つけるにはsrcSets.main.output
が必要です。プロジェクトファイル自体。
「通常のプロジェクトの依存関係はすべて...に加えてここにあります」というコメントは、プロジェクトをビルドして実行するためのブロック内に他の依存関係がたくさんあるという事実に言及していましたが、それらは一部ではありませんliquibaseRuntime
構成の。プロジェクトのすべてのライブラリをliquibaseRuntime
の一部にしたい場合は、build.gradleにconfigurations.liquibaseRuntime.extendsFrom configurations.runtime
を追加できます。または、すでにconfigurations
がある場合はブロックの場合、そのブロックにliquibaseRuntime.extendsFrom runtime
を追加できます。これにより、すべてのプロジェクトの依存関係とプロジェクトファイル自体がliquibaseRuntimeに追加されます。
これがお役に立てば幸いです。