Я интегрировал поддержку PostgreSQL через Exposed DAO, и в IDE (Idea) все прошло гладко, но после компиляции jar-файла начались странные ошибки, которых я не могу найти ни в гугле, ни здесь.
Вот кусок кода, который вызывает проблемы:
fun main(args: Array<String>) {
var appConfigPath: String
val logger = logger("main")
val version = "0.0.3-alpha"
// Sentry initializer
try {
throw Exception("Application initialized")
} catch (e: Exception) {
logger.info(e)
}
// Parse command line arguments
...
val dataSource = try {
PGDataSource().apply {
serverName = appConfig.db.serverName
databaseName = appConfig.db.databaseName
user = appConfig.db.user
password = appConfig.db.password
}
} catch (e: Exception) {
logger.fatal("Unable to create data source", e)
exitProcess(-1)
}
И вот что я получаю в командной строке:
ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.impossibl.postgres.jdbc.DataSourceSettings.<clinit>(DataSourceSettings.java:50)
at com.impossibl.postgres.jdbc.AbstractDataSource.<init>(AbstractDataSource.java:73)
at com.impossibl.postgres.jdbc.AbstractGeneratedDataSource.<init>(AbstractGeneratedDataSource.java:12)
at com.impossibl.postgres.jdbc.PGDataSource.<init>(PGDataSource.java:50)
at com.mazekine.pay2say.MainKt.main(Main.kt:105)
Caused by: java.lang.IllegalArgumentException: Unable to parse setting "ssl.key.password.callback" from 'com.impossibl.postgres.protocol.ssl.ConsolePasswordCallbackHandler'
at com.impossibl.postgres.system.Setting.fromString(Setting.java:692)
at com.impossibl.postgres.system.Setting.init(Setting.java:554)
at com.impossibl.postgres.system.SystemSettingsInit.init(SystemSettingsInit.java:36)
at com.impossibl.postgres.system.SystemSettings.<clinit>(SystemSettings.java:354)
... 5 more
Приложение скомпилировано с целью Java 11 через Adpot-OpenJDK.
Первая ошибка заключается в том, чтобы иметь дело с log4j2
. Я попробовал все решения, предложенные здесь, но это не помогло. не помогает, поэтому я думаю, что основная проблема связана с Exposed DAO, но я могу ошибаться.
Что касается самого DAO, я инициализирую подключение к локальному источнику данных PostgreSQL 13 из файла конфигурации:
{
"db": {
"server_name": "localhost",
"database_name": "silence",
"user": "silence_connect",
"password": "test1234"
}
}
Самое странное, что внутри IntelliJ Idea все работает нормально, а после того, как я скомпилирую банку через Shadow, она перестает работать.
Вот также build.gradle.kts
со всеми зависимостями:
plugins {
kotlin("jvm") version "1.4.31"
application
java
id("com.github.johnrengelman.shadow") version "6.1.0"
}
group = "com.mazekine"
version = "0.0.2-alpha"
// Version variables
val novaLibVersion = "0.0.5-alpha"
val telegramBotVersion = "6.0.1"
val exposedVersion = "0.29.1"
val pgJDBCVersion = "0.8.6"
val jvmTargetVersion = "11"
repositories {
mavenCentral()
jcenter()
maven { url = uri("https://jitpack.io") }
}
dependencies {
implementation(kotlin("stdlib", "1.3.0"))
implementation("org.jetbrains.kotlin:kotlin-reflect:1.3.0")
// Broxus
implementation("com.broxus:nova-lib:$novaLibVersion")
// Kotlin Telegram Bot
implementation("io.github.kotlin-telegram-bot.kotlin-telegram-bot:telegram:$telegramBotVersion")
// Exposed
implementation("org.jetbrains.exposed:exposed-core:$exposedVersion")
implementation("org.jetbrains.exposed:exposed-dao:$exposedVersion")
implementation("org.jetbrains.exposed:exposed-jdbc:$exposedVersion")
implementation("org.jetbrains.exposed:exposed-java-time:$exposedVersion")
implementation("com.impossibl.pgjdbc-ng:pgjdbc-ng:$pgJDBCVersion")
// Logging
implementation("org.apache.logging.log4j:log4j-api-kotlin:1.0.0")
implementation("org.apache.logging.log4j:log4j-api:2.13.3")
implementation("org.apache.logging.log4j:log4j-core:2.13.3")
implementation("org.apache.logging.log4j:log4j-slf4j-impl:2.13.3")
implementation("org.apache.logging.log4j:log4j-to-slf4j:2.13.3")
implementation("ch.qos.logback:logback-classic:1.2.3")
implementation("ch.qos.logback:logback-core:1.2.3")
implementation("io.sentry:sentry-log4j2:4.2.0")
// State machine
implementation("com.ToxicBakery.kfinstatemachine:kfin:4.3.50")
}
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>() {
kotlinOptions.jvmTarget = "1.8"
}.forEach {
it.kotlinOptions { freeCompilerArgs = listOf("-Xnew-inference") }
}
application {
mainClassName = "com.mazekine.pay2say.MainKt" // Have to leave it here until shadowJar fixes the compatibility bug
mainClass.set("com.mazekine.pay2say.MainKt")
}
val compileKotlin: org.jetbrains.kotlin.gradle.tasks.KotlinCompile by tasks
compileKotlin.kotlinOptions {
jvmTarget = jvmTargetVersion
}
val compileTestKotlin: org.jetbrains.kotlin.gradle.tasks.KotlinCompile by tasks
compileTestKotlin.kotlinOptions {
jvmTarget = jvmTargetVersion
}
tasks.jar {
archiveBaseName.set("pay2say")
archiveVersion.set("")
archiveClassifier.set("")
archiveExtension.set("jar")
manifest.attributes["Main-Class"] = "com.mazekine.pay2say.MainKt"
}
tasks.shadowJar {
archiveBaseName.set("pay2say")
archiveVersion.set("")
archiveClassifier.set("")
archiveExtension.set("jar")
minimize()
}
Любые идеи, что я делаю неправильно?