首页 > 解决方案 > spring boot 无法读取安装在多个实例中的 minikube 主机路径中的类路径中提供的库

问题描述

我有一个 spring boot 应用程序,它将与所有其他应用程序一起添加为 Kubernetes 中的 side car 应用程序。这个应用程序有一些子模块,只有在需要时才能通过类路径添加。我可以通过使用主机路径将卷安装到 Kubernetes 来实现这一点。

因为,我在我的本地 mac 电脑上使用 minikube。我必须先将我的本地文件夹挂载到 minikube(使用 minikube mount /Users/nischal/Documents/kubeApps/app1/:/app1),然后以下列方式在 pod 中使用它。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-pod-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app1
  template:
    metadata:
      labels:
        app: app1
    spec:
        containers:
           - name: app1
             image: app1
             imagePullPolicy: Never
             ports:
                - containerPort: 8080
             volumeMounts:
                - mountPath: /app/lib
                  name: app-lib-storage-dep
                  readOnly: true
        volumes:
           - name: app-lib-storage-dep
             hostPath:
                path: /app1/lib
                type: Directory

以下是我的码头文件

FROM openjdk:11.0.8-jre-slim as builder
WORKDIR application
COPY finproxy-runner-1.0.0.jar app.jar
RUN java -Djarmode=layertools -jar app.jar extract

FROM openjdk:11.0.8-jre-slim
WORKDIR application
COPY --from=builder application/application/ ./
COPY --from=builder application/spring-boot-loader ./
ENTRYPOINT ["java","-cp","/app/lib/external/*:/app/lib/internal/*:/application","org.springframework.boot.loader.JarLauncher"]

这工作正常,但是当我将副本增加到 2 时。两个应用程序都没有出现并导致这个奇怪的错误。

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.base/java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:109)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)
Caused by: java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
    at com.finacle.finproxy.FinProxyApplication.main(FinProxyApplication.java:13)
    ... 8 more
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
    at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
    ... 9 more

我尝试了不同的调试方式,我可以登录到这两个实例,并且可以看到可用的文件,但应用程序无法读取它们。

我将此 lib 文件夹复制到 minikube 并尝试启动应用程序,它没有任何问题。

有人可以帮我解释这个问题可能发生的原因吗?

标签: javaspring-bootkubernetesminikube

解决方案


推荐阅读