質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Apache Maven 2

Apache Mavenは、ソフトウェアプロジェクトの管理ツールです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

2610閲覧

flywayを使ったモジュールをDBの入ってない環境でビルドするには

msss

総合スコア33

JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Apache Maven 2

Apache Mavenは、ソフトウェアプロジェクトの管理ツールです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

1クリップ

投稿2019/08/24 02:07

編集2019/08/24 02:08

困っている内容

Java(spring boot)mavenflywayを使用してDBのマイグレーションをする
プロジェクトを作成しようと考えています。

mavenでビルド(javaのwebアプリなのでwar作成)すると、
jUnitが実行される為、flywayのマイグレート処理が走ります。

ビルド時には、mavenのprofileで開発環境と本番環境の接続先を
変えているのですが、
開発環境向けにビルドする分にはローカルにDBが存在するので
ビルドは成功するのですが、ローカルマシンで
本番環境向けにビルドする時に以下の点で困っています。

  1. 本番環境の接続先が無いので接続先エラーとなってしまう
  2. DBの無い環境ではビルド出来ない

解決案

本番環境用にビルドする時にはmavenの-DskipTests=trueでテストをスキップする。
※ただ、やはりビルド時にはテストをしたいと考えています

質問内容

以下の3つの条件を満たす方法はないでしょうか

  • テストをスキップしない
  • 本番環境ビルド時にはflywayのマイグレーションおこなわない
  • APサーバへデプロイ時にはflywayのマイグレーションがおこなわれる

設定状況

  • pom.xml

xml

1 </dependencies> 2 ... 3 <dependency> 4 <groupId>org.flywaydb</groupId> 5 <artifactId>flyway-core</artifactId> 6 </dependency> 7 </dependencies> 8 <profiles> 9 <profile> 10 <id>dev</id> 11 <activation> 12 <activeByDefault>true</activeByDefault> 13 </activation> 14 <properties> 15 <datasource.driverClassName>com.mysql.cj.jdbc.Driver</datasource.driverClassName> 16 <datasource.url>jdbc:mysql://localhost/sample?serverTimezone=JST</datasource.url> 17 <datasource.username>admin</datasource.username> 18 <datasource.password>admin</datasource.password> 19 </properties> 20 21 </profile> 22 23 <profile> 24 <id>release</id> 25 <activation> 26 <activeByDefault>false</activeByDefault> 27 </activation> 28 <properties> 29 <datasource.driverClassName>com.mysql.cj.jdbc.Driver</datasource.driverClassName> 30 <datasource.url>jdbc:mysql://localhost/sample?serverTimezone=JST</datasource.url> 31 <datasource.username>admin</datasource.username> 32 <datasource.password>admin</datasource.password> 33 34 </properties> 35 </profile> 36 </profiles>
  • AppConfig.java

Java

1@Configuration 2public class AppConfig { 3 ... 4 @Bean(initMethod = "migrate") 5 Flyway flyway() { 6 return Flyway.configure().dataSource(dataSource()).load(); 7 } 8}

試したこと

プロファイルを使った切り替え

  • 本番環境のプロファイルの時だけ、spring.flyway.enabledを切り替えてflywayを実行しないと、デプロイ時にもマイグレーションされませんでした
  • Bean@Profile("release")等のプロファイル制御をかけた場合も上記と同じ結果でした

flywayの実行場所を変更する

  • Beanに書いてあるからJunit実行時に呼ばれてしまうんだと思い、mainクラスに以下のように書いてみましたが、ビルド時のJunit処理で呼び出されるのに代わりは無い為ダメでした

Java

1 public static void main(String[] args) { 2 SpringApplication.run(App.class, args); 3 } 4 5 @Override 6 protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 7 Flyway flyway = Flyway.configure().dataSource(dataSource).load(); 8 flyway.migrate(); 9 return application.sources(App.class); 10 }

Flyway Maven Pluginを使ってみる

  • Beanに書く代わりに、pom.xmlに以下のようにしてみましたが、解決しませんでした

xml

1 <plugin> 2 <groupId>org.flywaydb</groupId> 3 <artifactId>flyway-maven-plugin</artifactId> 4 <configuration> 5 <url>${datasource.url}</url> 6 <user>${datasource.username}</user> 7 <password>${datasource.password}</password> 8 <enable>false</enable> 9 </configuration> 10 </plugin> 11コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

euledge

2019/08/24 06:42

テスト時にはH2Databaseみたいな組込みDB使うとかでは駄目でしょうか? H2はメモリDBとしても、ファイルとしても使えますよ。
msss

2019/08/24 11:12

コメントありがとうございます。 これは`mvn package`時のJunitテストで、 flywayの接続先を切り替える方法があるということでしょうか。
msss

2019/08/24 11:31

euledgeさんのヒントから、junit時に`src/test/resources/application.yml`がある場合はこちらの設定が優先されることがわかり、`spring.flyway.enabled=false`を設定することで解決できました。 ありがとうございました。
guest

回答1

0

自己解決

自己解決と言っていいかわかりませんが解決方法です。

不足していた知識

src/test/resources/application.ymlがある場合は
Junit実行時にsrc/main/resources/application.ymlよりも優先して設定を読む。

対応した内容

src/test/resources/application.ymlspring.flyway.enabled=falseを設定することで
mvn packageのJunit時にはflywayが実行されなくなりました。

また、warをデプロイしたときにはflywayが実行されるようになりました。

参考にしたリンク

Spring Boot - テスト時に読み込むDBを変更する

投稿2019/08/24 11:38

msss

総合スコア33

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問