diff --git a/bom/application/pom.xml b/bom/application/pom.xml
index e2d8abb95d336..0f033e67abb08 100644
--- a/bom/application/pom.xml
+++ b/bom/application/pom.xml
@@ -168,7 +168,7 @@
3.2.0
4.2.0
1.1.1
- 9.17.0
+ 9.20.0
3.0.3
4.20.0
2.0
@@ -6252,6 +6252,11 @@
flyway-mysql
${flyway.version}
+
+ org.flywaydb
+ flyway-database-oracle
+ ${flyway.version}
+
org.liquibase
liquibase-core
diff --git a/docs/src/main/asciidoc/flyway.adoc b/docs/src/main/asciidoc/flyway.adoc
index 259a1b4088cd6..27ce233f27c3a 100644
--- a/docs/src/main/asciidoc/flyway.adoc
+++ b/docs/src/main/asciidoc/flyway.adoc
@@ -28,6 +28,7 @@ In your build file, add the following dependencies:
* your JDBC driver extension (`quarkus-jdbc-postgresql`, `quarkus-jdbc-h2`, `quarkus-jdbc-mariadb`, ...)
* the MariaDB/MySQL support is now in a separate dependency, MariaDB/MySQL users need to add the `flyway-mysql` dependency from now on.
* the Microsoft SQL Server support is now in a separate dependency, Microsoft SQL Server users need to add the `flyway-sqlserver` dependency from now on.
+* the Oracle support is now in a separate dependency, Oracle users need to add the `flyway-database-oracle` dependency from now on.
[source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"]
.pom.xml
@@ -50,6 +51,12 @@ In your build file, add the following dependencies:
flyway-mysql
+
+
+ org.flywaydb
+ flyway-database-oracle
+
+
io.quarkus
@@ -66,6 +73,8 @@ implementation("io.quarkus:quarkus-flyway")
implementation("org.flywaydb:flyway-sqlserver")
// Flyway MariaDB/MySQL specific dependencies
implementation("org.flywaydb:flyway-mysql")
+// Flyway Oracle specific dependencies
+implementation("org.flywaydb:flyway-database-oracle")
// JDBC driver dependencies
implementation("io.quarkus:quarkus-jdbc-postgresql")
----
diff --git a/extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/FlywayCreator.java b/extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/FlywayCreator.java
index 1c7b2222b9710..45ef59cbed10b 100644
--- a/extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/FlywayCreator.java
+++ b/extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/FlywayCreator.java
@@ -67,8 +67,7 @@ public Flyway createFlyway(DataSource dataSource) {
configure.dataSource(jdbcUrl, flywayRuntimeConfig.username.get(),
flywayRuntimeConfig.password.get());
- } else {
-
+ } else if (dataSource != null) {
configure.dataSource(dataSource);
}
}
diff --git a/extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/graal/ClassicConfigurationSubstitutions.java b/extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/graal/ClassicConfigurationSubstitutions.java
new file mode 100644
index 0000000000000..6ee61f922bb4b
--- /dev/null
+++ b/extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/graal/ClassicConfigurationSubstitutions.java
@@ -0,0 +1,66 @@
+package io.quarkus.flyway.runtime.graal;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.flywaydb.core.extensibility.ConfigurationExtension;
+import org.flywaydb.core.internal.plugin.PluginRegister;
+import org.flywaydb.core.internal.util.MergeUtils;
+
+import com.google.gson.Gson;
+import com.oracle.svm.core.annotate.Alias;
+import com.oracle.svm.core.annotate.RecomputeFieldValue;
+import com.oracle.svm.core.annotate.Substitute;
+import com.oracle.svm.core.annotate.TargetClass;
+
+@TargetClass(className = "org.flywaydb.core.api.configuration.ClassicConfiguration")
+public final class ClassicConfigurationSubstitutions {
+
+ @Alias
+ @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.FromAlias)
+ private static Pattern ANY_WORD_BETWEEN_TWO_QUOTES_PATTERN = Pattern.compile("\"([^\"]*)\"");
+
+ @Alias
+ PluginRegister pluginRegister;
+
+ @Substitute
+ private void determineKeysToRemoveAndRemoveFromProps(HashMap> configExtensionsPropertyMap,
+ List keysToRemove, Map props) {
+ for (Map.Entry> property : configExtensionsPropertyMap.entrySet()) {
+ ConfigurationExtension cfg = null;
+ for (ConfigurationExtension c : pluginRegister.getPlugins(ConfigurationExtension.class)) {
+ if (c.getClass().toString().equals(property.getKey())) {
+ cfg = c;
+ break;
+ }
+ }
+ if (cfg != null) {
+ Map mp = property.getValue();
+ try {
+ Gson gson = new Gson();
+ ConfigurationExtension newConfigurationExtension = gson.fromJson(gson.toJson(mp), cfg.getClass());
+ MergeUtils.mergeModel(newConfigurationExtension, cfg);
+ } catch (Exception e) {
+ Matcher matcher = ANY_WORD_BETWEEN_TWO_QUOTES_PATTERN.matcher(e.getMessage());
+ if (matcher.find()) {
+ String errorProperty = matcher.group(1);
+ List propsToRemove = new ArrayList<>();
+ for (String k : keysToRemove) {
+ if (k.endsWith(errorProperty)) {
+ propsToRemove.add(k);
+ }
+ }
+ keysToRemove.removeAll(propsToRemove);
+ }
+ }
+ }
+ }
+
+ props.keySet().removeAll(keysToRemove);
+ }
+
+}
diff --git a/extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/graal/OracleDatabaseTypeSubstitution.java b/extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/graal/OracleDatabaseTypeSubstitution.java
index 9363bf1175e5b..67001f0d8c9f8 100644
--- a/extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/graal/OracleDatabaseTypeSubstitution.java
+++ b/extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/graal/OracleDatabaseTypeSubstitution.java
@@ -4,7 +4,6 @@
import java.util.function.BooleanSupplier;
import org.flywaydb.core.api.configuration.Configuration;
-import org.flywaydb.core.internal.database.oracle.OracleDatabaseType;
import org.flywaydb.core.internal.util.ClassUtils;
import com.oracle.svm.core.annotate.Substitute;
@@ -13,7 +12,9 @@
/**
* Avoid loading the oracle.jdbc.OracleConnection class if unavailable
*/
-@TargetClass(value = OracleDatabaseType.class, onlyWith = OracleDatabaseTypeSubstitution.OracleDriverUnavailable.class)
+@TargetClass(className = "org.flywaydb.database.oracle.OracleDatabaseType", onlyWith = {
+ OracleDatabaseTypeSubstitution.OracleAvailable.class,
+ OracleDatabaseTypeSubstitution.OracleDriverUnavailable.class })
public final class OracleDatabaseTypeSubstitution {
@Substitute
@@ -27,4 +28,12 @@ public boolean getAsBoolean() {
return !ClassUtils.isPresent("oracle.jdbc.OracleConnection", Thread.currentThread().getContextClassLoader());
}
}
+
+ public static final class OracleAvailable implements BooleanSupplier {
+ @Override
+ public boolean getAsBoolean() {
+ return ClassUtils.isPresent("org.flywaydb.database.oracle.OracleDatabaseType",
+ Thread.currentThread().getContextClassLoader());
+ }
+ }
}