モジュール化したプロジェクトでFlywayを使うときは「db.migration」を公開する

Java

FlywayException: Unable to obtain inputstream for resource: db/migration/V1__sample.sql

モジュール化したプロジェクトでFlywayを使用するとmigrate時にエラーになってしまいました。
モジュール化するとFlywayから「db.migration」が参照できないため、エラーになってしまうようです。
module-info.java に「opens db.migration」を追加して公開するとエラーが解消しました。

java.lang.reflect.InvocationTargetException
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: org.flywaydb.core.api.FlywayException: Unable to obtain inputstream for resource: db/migration/V1__sample.sql
	at org.flywaydb.core@6.5.2/org.flywaydb.core.internal.resource.classpath.ClassPathResource.read(ClassPathResource.java:90)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.internal.resolver.ChecksumCalculator.calculateChecksumForResource(ChecksumCalculator.java:67)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.internal.resolver.ChecksumCalculator.calculate(ChecksumCalculator.java:46)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.internal.resolver.sql.SqlMigrationResolver.getChecksumForLoadableResource(SqlMigrationResolver.java:143)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.internal.resolver.sql.SqlMigrationResolver.addMigrations(SqlMigrationResolver.java:181)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.internal.resolver.sql.SqlMigrationResolver.resolveMigrations(SqlMigrationResolver.java:88)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.internal.resolver.sql.SqlMigrationResolver.resolveMigrations(SqlMigrationResolver.java:44)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.internal.resolver.CompositeMigrationResolver.collectMigrations(CompositeMigrationResolver.java:127)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.internal.resolver.CompositeMigrationResolver.doFindAvailableMigrations(CompositeMigrationResolver.java:109)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.internal.resolver.CompositeMigrationResolver.resolveMigrations(CompositeMigrationResolver.java:95)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.internal.resolver.CompositeMigrationResolver.resolveMigrations(CompositeMigrationResolver.java:46)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.internal.info.MigrationInfoServiceImpl.refresh(MigrationInfoServiceImpl.java:130)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.internal.command.DbValidate$2.call(DbValidate.java:142)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.internal.command.DbValidate$2.call(DbValidate.java:130)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.internal.jdbc.TransactionalExecutionTemplate.execute(TransactionalExecutionTemplate.java:66)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.internal.command.DbValidate.validate(DbValidate.java:130)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.Flyway.doValidate(Flyway.java:286)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.Flyway.access$100(Flyway.java:73)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.Flyway$1.execute(Flyway.java:166)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.Flyway$1.execute(Flyway.java:158)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.Flyway.execute(Flyway.java:527)
	at org.flywaydb.core@6.5.2/org.flywaydb.core.Flyway.migrate(Flyway.java:158)
	at sample.flyway/sample.flyway.App.main(App.java:38)
	... 11 more
Exception running application sample.flyway.App

サンプル実装

sample.flyway.App.java

package sample.flyway;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import org.flywaydb.core.Flyway;

public class App {

	private static final String DB_URL = "jdbc:h2:./sample";

	public static void main(String[] args) {
		//
		Flyway flyway = Flyway.configure().dataSource(DB_URL, "sa", "").load();
		flyway.migrate();

		try (Connection conn = DriverManager.getConnection(DB_URL, "sa", "");
				Statement stmt = conn.createStatement();) {

			stmt.executeUpdate("DELETE FROM car");

			String insertSql = "INSERT INTO car(id, license_plate, color) VALUES "
					+ "(1, '沖縄123あ4567', '白'),"
					+ "(2, '横浜000あ2468', '赤')";
			stmt.executeUpdate(insertSql);

			String selectSql = "SELECT * FROM car";
			ResultSet rs = stmt.executeQuery(selectSql);
			while(rs.next()){
				System.out.println("--------------------");
				System.out.println("id: " + rs.getInt("id"));
				System.out.println("license_plate: " + rs.getString("license_plate"));
				System.out.println("color: " + rs.getString("color"));
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

module-info.java

module sample.flyway {
	requires org.flywaydb.core;
	requires java.sql;

	opens db.migration;

	exports sample.flyway;
}

db/migration/V1__sample.sql

CREATE TABLE car(
  id INT NOT NULL PRIMARY KEY
  , license_plate VARCHAR NOT NULL
  , color VARCHAR NOT NULL
);

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>sample</groupId>
    <artifactId>sample-flyway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
        	<groupId>com.h2database</groupId>
        	<artifactId>h2</artifactId>
        	<version>1.4.197</version>
        </dependency>
        <dependency>
        	<groupId>org.flywaydb</groupId>
        	<artifactId>flyway-maven-plugin</artifactId>
        	<version>6.5.2</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>11</release>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

コメント

タイトルとURLをコピーしました