@Override
    protected boolean performMigration(final DataSource dataSource, final Injector injector) {

        // Force all module data sources to be created, so we can be sure all db modules are
        // fully migrated in order for us to do cross-module migrations
        injector.getInstance(Key.get(GuiceUtil.setOf(DataSource.class)));

        // Get all our app-wide java migs
        final List<JavaMigration> javaMigrations = getCrossModuleMigrations(injector);

        // Add any additional migs, i.e. test data for migration testing
//        javaMigrations.addAll(getAdditionalMigrations(injector));

        // Add any additional migs, i.e. test data for migration testing
        getAdditionalMigrationClasses().stream()
                .map(injector::getInstance)
                .forEach(javaMigrations::add);

        LOGGER.info("Using migrations classes:\n{}",
                javaMigrations.stream()
                        .sorted(Comparator.comparing(JavaMigration::getVersion))
                        .map(migration -> "  " + migration.getVersion() + " - " + migration.getClass().getName())
                        .collect(Collectors.joining("\n")));

        FlywayUtil.migrate(
                dataSource,
                javaMigrations, // Guice injected java migrations only
                getMigrationTarget().orElse(null), // Where to migrate up to
                getFlyWayTableName(),
                getModuleName());
        return true;
    }
This DB module is a bit special. The aim is run java only flyway migrations across all
dbConnProviders, so we can do cross-module migrations. You can't do SQL migrations as
each module could potentially be on a different database instance/connection.
stroom-app/src/main/java/stroom/app/db/migration/CrossModuleDbMigrationsModule.java