Я использую файл 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()
}
}
@Antoniossss yml работает, если я запускаю IntelliJ.
тогда проблема может заключаться в следующем: 1. yml отсутствует в банке или 2. у вас есть какой-то профиль в cli/env, который останавливает выбор файла.
@PrasadU это репозиторий github.com/iamanbansal/kt-spring-boot-url-shortener
а когда у вас не работает?
Ах хорошо, так что вы не знаете, как упаковать приложение. Голосование за закрытие, поскольку предоставлен нерелевантный код, не предоставлены подробности или обстоятельства (например, тот факт, что он не работает после упаковки, но работает в ide)
@Antoniossss Извините, мой плохой, я обновил вопрос.
Удаление вашей настройки для 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) }
// })
//
//}
он выдает исключение, что основной класс не найден, поэтому я добавил это.
может быть потому, что вы пытаетесь использовать -plain.jar
; используйте обычную банку - весенняя загрузочная упаковка работает нормально.
Спасибо, это сработало. Я знал разницу между -plain.jar и .jar
2 вещи: возможно, опечатка в имени соединения jdbc/драйвера или, возможно, отсутствует библиотека драйверов.