docker - 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
我在这里想念什么?
解决方案
以下对我有用..,您需要使用 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);
}
}
推荐阅读
- c - C Linux 检查挂载中的可用空间
- kubernetes - Kuberenetes 主节点到节点的连接
- excel - Excel仪表板中的Excel工作表数据按一列作为x轴分组,另一列的总和作为y轴分组
- swift - 是否有提交催化剂应用程序的指南?
- sql-server - 在日期之间排除
- mysql - 如何从同一张表中获取不同id的常见记录?
- .net - SQL 过程超时
- python - 姜戈 | 'function' 对象没有属性'get' | 对于 request.POST.get('email')
- mongodb - Debezium mongodb kafka 连接器没有像在 mongodb 中那样在主题中产生一些记录
- java - FireBase 上传和检索图像 - NullPointerException