Добавление ресурсов в classpath в загрузке kotlin / java / spring с использованием gradle в качестве инструмента сборки - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь добавить import.sql из ресурсов в classpath, чтобы он загружался hibernate и некоторые тестовые данные импортировались в базу данных при запуске приложения.

Я использую kotlin и gradle со следующими плагинами:

  • jvm
  • plugin.spring
  • plugin.jpa
  • org.springframework.boot
  • io.spring.dependency-management

При запуске приложения из IntelliJ (задача bootRun) ресурсы располагаются в build/resources/main и классах Java. расположены в build/classes/java/main. Поэтому, когда hibernate пытается загрузить import.sql, он не может быть найден, поскольку путь к классу java находится в build/classes/java/main (попытался запустить getResources(""), и он вернул эту папку). Сгенерированную структуру папок, application.properties и сборку Gradle можно найти ниже.

generated build folder structure

application.properties

logging.level.org.hibernate.*=TRACE
logging.level.org.hibernate.SQL=trace
spring.datasource.data=classpath://import.sql

spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
spring.h2.console.path=/console

build.gradle.kts

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

val kotlinVersion = "1.3.50"
val springBootVersion = "2.1.9.RELEASE"
val h2Version = "1.4.200"
val hibernateVersion = "5.4.6.Final"
val snippetsDir = "./build/generated-snippets"
val test = "./gradle/test"

group = "org.testkotlin"
version = "0.0.1-SNAPSHOT"

java{
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

configurations {
    compileOnly {
        extendsFrom(configurations.annotationProcessor.get())
    }
}

repositories {
    gradlePluginPortal()
    mavenCentral()
}

extra["snippetsDir"] = file(snippetsDir)

plugins {
    idea
    kotlin("jvm") version "1.3.50"
    kotlin("plugin.spring") version "1.3.50"
    kotlin("plugin.jpa") version "1.3.50"
    id("org.springframework.boot") version "2.1.9.RELEASE"
    id("io.spring.dependency-management") version "1.0.8.RELEASE"
    id("org.asciidoctor.convert") version "1.5.8"
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-actuator")
    implementation("org.springframework.boot:spring-boot-starter-data-rest")
    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.hibernate:hibernate-core:$hibernateVersion")
    runtimeOnly("com.h2database:h2:$h2Version")
    annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation("org.springframework.restdocs:spring-restdocs-mockmvc")
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

tasks.test {
    outputs.dir(snippetsDir)
}

tasks.asciidoctor {
    inputs.dir(snippetsDir)
    dependsOn(test)
}

tasks.bootRun {
    doFirst {
        classpath = files("$buildDir/classes/main", "$buildDir/resources/main")
    }
}

Итак, мои вопросы:

  • Как добавить ресурсы в classpath?
  • Возможно ли изменить задачу bootRun, чтобы сделать это (doFirst не вариант, так как задача полагается на classes/java, не существовавшей заранее)
  • Есть ли какое-то свойство внутри bootRun или сборка Gradle, которая позволяет это?
  • В конечном счете, как мне получить hibernate для автоматического распознавания import.sql без ручного перемещения его в build/classes/java/main?

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Вы правильно определяете папку ресурсов, и Gradle с плагином Spring Boot автоматически добавит ее в путь к классам. Если этого не произойдет, Spring также не сможет загрузить ваш файл application.properties, что, как я полагаю, происходит.

Я также предполагаю, что вы хотите использовать Hibernate для загрузки ваших данных, так какэто поведение по умолчанию, если у вас есть файл с именем import.sql. Но это происходит только в том случае, если для свойства ddl-auto установлено значение create или create-drop, а для вас - update.

. Вы также можете разрешить Spring Boot обрабатывать инициализацию источника данных вместо Hibernate, ноу вас это все еще будет происходить только тогда, когда схема (заново) создана, а не только при подключении к ней.

Кроме того, даже если это не является причиной ваших проблем, я не верю, что ресурсы classpathвесной должен начинаться с косой черты, но по крайней мере не с двумя (classpath://import.sql).

0 голосов
/ 17 октября 2019

Перво-наперво - ресурсы в Spring Boot следует размещать в папке src/main/resources, а не build/classes/java/main. build пакеты являются продуктом задачи bootRun и будут меняться каждый раз при запуске.

Просмотр Spring документация :

Spring Bootвключает его по умолчанию и загружает SQL из стандартных расположений schema.sql и data.sql (в корне пути к классам).

Это означает, что Spring ищет файл import.sql в корнеclasspath (папка ресурсов). В IntelliJ это выглядит так:

IntelliJ resources folder

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...