diff --git a/node/src/main/kotlin/net/corda/node/internal/DataSourceFactory.kt b/node/src/main/kotlin/net/corda/node/internal/DataSourceFactory.kt index 7304fa22cc..42a56e3955 100644 --- a/node/src/main/kotlin/net/corda/node/internal/DataSourceFactory.kt +++ b/node/src/main/kotlin/net/corda/node/internal/DataSourceFactory.kt @@ -14,7 +14,6 @@ import com.zaxxer.hikari.HikariConfig import com.zaxxer.hikari.HikariDataSource import com.zaxxer.hikari.util.PropertyElf import net.corda.core.internal.declaredField -import net.corda.core.internal.div import org.h2.engine.Database import org.h2.engine.Engine import org.slf4j.LoggerFactory @@ -58,8 +57,8 @@ object DataSourceFactory { } } - fun createDatasourceFromDriverJars(dataSourceProperties: Properties, baseClassLoader: ClassLoader, driverJarsPath: Path): DataSource { - return URLClassLoader(Files.newDirectoryStream(driverJarsPath, "*.jar").map { it.toUri().toURL() }.toTypedArray(), baseClassLoader).use { driversClassLoader -> + fun createDatasourceFromDriverJarFolders(dataSourceProperties: Properties, baseClassLoader: ClassLoader, driverJarsPath: List): DataSource { + return URLClassLoader(driverJarsPath.flatMap { Files.newDirectoryStream(it, "*.jar") }.map { it.toUri().toURL() }.toTypedArray(), baseClassLoader).use { driversClassLoader -> val dataSourceClassName = dataSourceProperties["dataSourceClassName"] as String? val dataSourceClass = driversClassLoader.loadClass(dataSourceClassName) val dataSourceInstance = dataSourceClass.newInstance() as DataSource @@ -75,8 +74,8 @@ object DataSourceFactory { } } - fun createHikariDatasourceFromDriverJars(dataSourceProperties: Properties, baseClassLoader: ClassLoader, driverJarsPath: Path): DataSource { - val dataSource = createDatasourceFromDriverJars(dataSourceProperties, baseClassLoader, driverJarsPath) + fun createHikariDatasourceFromDriverJarFolders(dataSourceProperties: Properties, baseClassLoader: ClassLoader, driverJarsPath: List): DataSource { + val dataSource = createDatasourceFromDriverJarFolders(dataSourceProperties, baseClassLoader, driverJarsPath) val cfg = HikariConfig(dataSourceProperties) cfg.dataSource = dataSource return HikariDataSource(cfg) diff --git a/tools/dbmigration/src/main/kotlin/com/r3/corda/dbmigration/Launcher.kt b/tools/dbmigration/src/main/kotlin/com/r3/corda/dbmigration/Launcher.kt index d0b5d9b3ed..0cc6c581bf 100644 --- a/tools/dbmigration/src/main/kotlin/com/r3/corda/dbmigration/Launcher.kt +++ b/tools/dbmigration/src/main/kotlin/com/r3/corda/dbmigration/Launcher.kt @@ -22,7 +22,7 @@ import net.corda.core.internal.MigrationHelpers import net.corda.core.internal.copyTo import net.corda.core.internal.div import net.corda.core.schemas.MappedSchema -import net.corda.node.internal.DataSourceFactory.createDatasourceFromDriverJars +import net.corda.node.internal.DataSourceFactory.createDatasourceFromDriverJarFolders import net.corda.node.internal.cordapp.CordappLoader import net.corda.node.services.config.ConfigHelper import net.corda.node.services.config.configOf @@ -108,7 +108,7 @@ fun main(args: Array) { } } -data class Configuration(val dataSourceProperties: Properties, val database: DatabaseConfig) +data class Configuration(val dataSourceProperties: Properties, val database: DatabaseConfig, val jarDirs: List = emptyList()) private fun runCommand(options: OptionSet, parser: OptionParser) { @@ -222,8 +222,8 @@ private fun getMigrationOutput(baseDirectory: Path, options: OptionSet): Writer } private fun runWithDataSource(config: Configuration, baseDirectory: Path, classLoader: ClassLoader, withDatasource: (DataSource) -> Unit) { - val driversFolder = baseDirectory / "drivers" - return withDatasource(createDatasourceFromDriverJars(config.dataSourceProperties, classLoader, driversFolder)) + val driversFolder = (baseDirectory / "drivers") + return withDatasource(createDatasourceFromDriverJarFolders(config.dataSourceProperties, classLoader, listOf(driversFolder) + config.jarDirs.map { Paths.get(it) })) } private fun errorAndExit(message: String?) {