首页 > 解决方案 > Docker 容器中的 Spring Boot 资源

问题描述

我正在将 Docker 用于 Spring Boot 应用程序,到目前为止一切正常。

我有一个资源文件src/main/resources/db/data/dummydata.csv

在引导类中,此文件用于将虚拟数据导入数据库。

私人乐趣 getDummyData(): List { var fileReader: BufferedReader? =空

val dummyData = ArrayList<DummyDataEntity>()

try {
    var line: String?

    val res = ResourceUtils.getFile("classpath:db/data/dummydata.csv")
    fileReader = BufferedReader(FileReader(res.path))

    // Read CSV header
    fileReader.readLine()

   ... Processing the data ...

} catch (e: Exception) {
    e.printStackTrace()
} finally {
    try {
        fileReader!!.close()
    } catch (e: Exception) {
        e.printStackTrace()
    }

    return dummyData
}

}

当我在 IntelliJ 中运行应用程序时,一切正常,但是当我在 Docker 中运行它时,却找不到它。

Jar 和 Docker 镜像是使用 Kotlin DSL Gradle 创建的。

import com.palantir.gradle.docker.DockerExtension
import io.spring.gradle.dependencymanagement.dsl.DependencyManagementExtension
import org.gradle.tooling.model.GradleTask
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.springframework.boot.gradle.tasks.bundling.BootJar

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath(Libs.springBootGradlePlugin)
        classpath(Libs.kotlinGradlePlugin)
        classpath(Libs.kotlinAllOpen)
        classpath(Libs.gradleDocker)
    }
}

plugins {
    // Apply the java-library plugin to add support for Java Library
    `java-library`
}

apply {
    plugin("kotlin")
    plugin("kotlin-spring")
    plugin("org.springframework.boot")
    plugin("io.spring.dependency-management")
    plugin("com.palantir.docker")
}

repositories {
    mavenCentral()
}

dependencies {
    compile(Libs.kotlinReflect)

    // Spring Boot
    compile(Libs.springBootStarterDataJpa)
}

configure<DependencyManagementExtension> {
    imports {
        mavenBom(Libs.vaadinBom)
    }
}

val bootJar: BootJar by tasks
bootJar.baseName = "reporting-app-site"
bootJar.version = "0.0.1"

configure<DockerExtension> {
    name = "brabantia/${bootJar.baseName}"
    files(bootJar.archivePath)
    buildArgs(mapOf("JAR_FILE" to bootJar.archiveName))
    dependsOn(tasks["build"])
}

val compileKotlin: KotlinCompile by tasks
compileKotlin.kotlinOptions.jvmTarget = "1.8"

Jar 确实包含BOOT-INF/classes/db/data/dummyData.csv,但是当应用程序运行时,抛出的错误是

java.io.FileNotFoundException: class path resource [db/data/dummydata.csv] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/app.jar!/BOOT-INF/classes!/db/data/dummydata.csv

我在这里想念什么?

标签: dockerspring-bootkotlin

解决方案


以下对我有用..,您需要使用 InputStream 而不是文件。

...

@Autowired
private ResourceLoader resourceLoader;

...

  Resource resource= resourceLoader.getResource("classpath:/account_info.html");

    InputStream inputStream= resource.getInputStream();

    Assert.notNull(inputStream,"Could not load template resource!");

    String email = null;

    try {
        byte[] bdata = FileCopyUtils.copyToByteArray(inputStream);
        email = new String(bdata, StandardCharsets.UTF_8);
    } catch (IOException e) {
        logger.warn("IOException", e);
    }finally {
        if ( inputStream != null) {
            IOUtils.closeQuietly(inputStream);
        }
    }

推荐阅读