Не удалось настроить источник данных из application.yml в SpringBoot Kotlin

Я использую файл application.yml для настройки источника данных. Когда я запускаю файл jar, я получаю исключение.

Он отлично работает, если я запускаю проект в IntelliJ (кнопка запуска)

Команда, которую я использую для сборки и запуска jar

./gradlew build -x check   

java -jar build/libs/UrlShortener-0.0.1-SNAPSHOT-plain.jar

приложение.yml

spring:
  datasource:
    url: jdbc:postgresql://localhost:5332/dbName
    username: username
    password: password
    driverClassName: org.postgresql.Driver

Исключение

05:13:50.339 [main] ERROR org.springframework.boot.SpringApplication - Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration': Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception with message: Failed to determine a suitable driver class

build.gradle.kts

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id("org.springframework.boot") version "3.0.2"
    id("io.spring.dependency-management") version "1.1.0"
    kotlin("jvm") version "1.7.22"
    kotlin("plugin.spring") version "1.7.22"
    kotlin("plugin.jpa") version "1.7.22"
}

group = "url.shortener"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_17

repositories {
    mavenCentral()
}

tasks.withType<Jar> {
    manifest {
        attributes["Main-Class"] = "url.shortener.UrlShortenerApplicationKt"
    }
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    from({
        configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) }
    })

}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    implementation("org.postgresql:postgresql")
    val kotlinxHtmlVersion = "0.8.0"
    implementation("org.jetbrains.kotlinx:kotlinx-html-jvm:$kotlinxHtmlVersion")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs = listOf("-Xjsr305=strict")
        jvmTarget = "17"
    }
}

tasks.withType<Test> {
    useJUnitPlatform()
}

Но если настроить через котлин, то работает

@Configuration
class Config {

    @Bean
    fun getDataSource(): DataSource {
        val dataSourceBuilder = DataSourceBuilder.create()
        dataSourceBuilder.driverClassName("org.postgresql.Driver")
        dataSourceBuilder.url("jdbc:postgresql://localhost:5332/dbName")
        dataSourceBuilder.username("username")
        dataSourceBuilder.password("password")
        return dataSourceBuilder.build()

    }
}

2 вещи: возможно, опечатка в имени соединения jdbc/драйвера или, возможно, отсутствует библиотека драйверов.

Antoniossss 04.02.2023 02:13

@Antoniossss yml работает, если я запускаю IntelliJ.

iamanbansal 04.02.2023 02:19

тогда проблема может заключаться в следующем: 1. yml отсутствует в банке или 2. у вас есть какой-то профиль в cli/env, который останавливает выбор файла.

PrasadU 04.02.2023 02:27

@PrasadU это репозиторий github.com/iamanbansal/kt-spring-boot-url-shortener

iamanbansal 04.02.2023 03:47

а когда у вас не работает?

Antoniossss 04.02.2023 11:46

Ах хорошо, так что вы не знаете, как упаковать приложение. Голосование за закрытие, поскольку предоставлен нерелевантный код, не предоставлены подробности или обстоятельства (например, тот факт, что он не работает после упаковки, но работает в ide)

Antoniossss 04.02.2023 11:47

@Antoniossss Извините, мой плохой, я обновил вопрос.

iamanbansal 05.02.2023 05:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
7
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Удаление вашей настройки для jar, похоже, решает проблему.

//tasks.withType<Jar> {
//  manifest {
//      attributes["Main-Class"] = "url.shortener.UrlShortenerApplicationKt"
//  }
//  duplicatesStrategy = DuplicatesStrategy.EXCLUDE
//  from({
//      configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) }
//  })
//
//}

он выдает исключение, что основной класс не найден, поэтому я добавил это.

iamanbansal 04.02.2023 10:01

может быть потому, что вы пытаетесь использовать -plain.jar ; используйте обычную банку - весенняя загрузочная упаковка работает нормально.

PrasadU 05.02.2023 02:09

Спасибо, это сработало. Я знал разницу между -plain.jar и .jar

iamanbansal 05.02.2023 05:39

Другие вопросы по теме