Exposed: Can't load implementation for DatabaseConnectionAutoRegistration

Created on 30 Dec 2019  路  10Comments  路  Source: JetBrains/Exposed

java.lang.ExceptionInInitializerError: null
    at one.xjcyan1de.creativeplus.CreativePlus.connectDatabase(CreativePlus.kt:70) ~[?:?]
    at one.xjcyan1de.creativeplus.CreativePlus.enable(CreativePlus.kt:43) ~[?:?]
    at com.github.xjcyan1de.cyanlibz.plugin.ExtendedBukkitPlugin.onEnable(ExtendedBukkitPlugin.kt:38) ~[?:?]
    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:263) ~[patched_1.15.1.jar:git-Paper-27]
    at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:338) ~[patched_1.15.1.jar:git-Paper-27]
    at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:420) ~[patched_1.15.1.jar:git-Paper-27]
    at org.bukkit.craftbukkit.v1_15_R1.CraftServer.enablePlugin(CraftServer.java:468) ~[patched_1.15.1.jar:git-Paper-27]
    at org.bukkit.craftbukkit.v1_15_R1.CraftServer.enablePlugins(CraftServer.java:382) ~[patched_1.15.1.jar:git-Paper-27]
    at net.minecraft.server.v1_15_R1.MinecraftServer.a(MinecraftServer.java:481) ~[patched_1.15.1.jar:git-Paper-27]
    at net.minecraft.server.v1_15_R1.DedicatedServer.init(DedicatedServer.java:290) ~[patched_1.15.1.jar:git-Paper-27]
    at net.minecraft.server.v1_15_R1.MinecraftServer.run(MinecraftServer.java:884) ~[patched_1.15.1.jar:git-Paper-27]
    at java.lang.Thread.run(Thread.java:834) [?:?]
Caused by: java.lang.IllegalStateException: Can't load implementation for DatabaseConnectionAutoRegistration
    at org.jetbrains.exposed.sql.Database.<clinit>(Database.kt:64) ~[?:?]
    ... 12 more

CreativePlus.connectDatabase:

    private fun connectDatabase() = Database.connect(
        HikariDataSource(HikariConfig().apply {
            jdbcUrl = Config.sqlUrl
            driverClassName = Config.sqlDriver
            username = Config.sqlUsername
            password = Config.sqlPassword
            maximumPoolSize = 4
            addDataSourceProperty("cachePrepStmts", "true")
            addDataSourceProperty("prepStmtCacheSize", "250")
            addDataSourceProperty("prepStmtCacheSqlLimit", "2048")
            addDataSourceProperty("characterEncoding", "utf8")
            addDataSourceProperty("useUnicode", "true")
            addDataSourceProperty("useSSL", "false")
            addDataSourceProperty("useJDBCCompliantTimezoneShift", "true")
            addDataSourceProperty("useLegacyDatetimeCode", "false")
            addDataSourceProperty("serverTimezone", TimeZone.getDefault().id)
        })
    )
bug

Most helpful comment

Encountered the same issue. The problem is that exposed classes here are loaded by other ClassLoader instance, but line 64 of org.jetbrains.exposed.sql.Database uses contextClassLoader under the hood: ServiceLoader.load(DatabaseConnectionAutoRegistration::class.java) invokes overload with Thread.currentThread().getContextClassLoader(). I suggest to manually specify the classloader to search (org.jetbrains.exposed.sql.Database::class.java.classLoader, for example). This way dynamically loaded jars (like Bukkit plugins) can also use Exposed.

All 10 comments

System Info: Java 11 (Dynamic Code Evolution 64-Bit Server VM 11.0.5+5-201912121506) Host: Windows 10 10.0 (amd64)

kotlin-stdlib-1.3.61
exposed-core-0.20.2

Encountered the same issue. The problem is that exposed classes here are loaded by other ClassLoader instance, but line 64 of org.jetbrains.exposed.sql.Database uses contextClassLoader under the hood: ServiceLoader.load(DatabaseConnectionAutoRegistration::class.java) invokes overload with Thread.currentThread().getContextClassLoader(). I suggest to manually specify the classloader to search (org.jetbrains.exposed.sql.Database::class.java.classLoader, for example). This way dynamically loaded jars (like Bukkit plugins) can also use Exposed.

You have to add exposed-jdbc into your dependency. It's a transport layer implementation (the only at the moment).

@Tapac its already added. but ServiceLoader didn't load DatabaseConnectionAutoRegistration as service, because Bukkit classloader. Check @StepByStepler comment

So if i use @StepByStepler suggestion its loads exposed-jdbc connection impl. but exposed still use context service loader.

        val bukkitClassLoader = Database::class.java.classLoader
        val bukkitServiceLoader = ServiceLoader.load(DatabaseConnectionAutoRegistration::class.java,bukkitClassLoader)
        println("[Bukkit] ClassLoader: $bukkitClassLoader ServiceLoader: ${bukkitServiceLoader.toList()}")

        val contextClassLoader = Thread.currentThread().contextClassLoader
        val contextServiceLoader = ServiceLoader.load(DatabaseConnectionAutoRegistration::class.java,contextClassLoader)
        println("[Context] ClassLoader: $contextClassLoader ServiceLoader: ${contextServiceLoader.toList()}")

        database = connectDatabase()
java.lang.ExceptionInInitializerError: null
    at one.xjcyan1de.creativeplus.CreativePlus.connectDatabase(CreativePlus.kt:80) ~[?:?]
    at one.xjcyan1de.creativeplus.CreativePlus.enable(CreativePlus.kt:53) ~[?:?]
    at com.github.xjcyan1de.cyanlibz.plugin.ExtendedBukkitPlugin.onEnable(ExtendedBukkitPlugin.kt:43) ~[?:?]
    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:263) ~[patched_1.15.1.jar:git-Paper-27]
    at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:338) ~[patched_1.15.1.jar:git-Paper-27]
    at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:420) ~[patched_1.15.1.jar:git-Paper-27]
    at org.bukkit.craftbukkit.v1_15_R1.CraftServer.enablePlugin(CraftServer.java:468) ~[patched_1.15.1.jar:git-Paper-27]
    at org.bukkit.craftbukkit.v1_15_R1.CraftServer.enablePlugins(CraftServer.java:382) ~[patched_1.15.1.jar:git-Paper-27]
    at net.minecraft.server.v1_15_R1.MinecraftServer.a(MinecraftServer.java:481) ~[patched_1.15.1.jar:git-Paper-27]
    at net.minecraft.server.v1_15_R1.DedicatedServer.init(DedicatedServer.java:290) ~[patched_1.15.1.jar:git-Paper-27]
    at net.minecraft.server.v1_15_R1.MinecraftServer.run(MinecraftServer.java:884) ~[patched_1.15.1.jar:git-Paper-27]
    at java.lang.Thread.run(Thread.java:834) [?:?]
Caused by: java.lang.IllegalStateException: Can't load implementation for DatabaseConnectionAutoRegistration
    at org.jetbrains.exposed.sql.Database.<clinit>(Database.kt:64) ~[?:?]
    ... 12 more

Fixed in master. Will be released soon.

It's still in version 0.28.1

This issue also seems to occur with relocating via shadow jars... 馃憖 Any idea what can be done to solve this?

It's still in version 0.28.1

I'm on 0.28.1, and the advice to include exposed-jdbc worked for me.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

kszymanski85 picture kszymanski85  路  4Comments

michele-grifa picture michele-grifa  路  4Comments

fmgonsalves picture fmgonsalves  路  3Comments

gcscaglia picture gcscaglia  路  3Comments

gertvdijk picture gertvdijk  路  4Comments