gpt4 book ai didi

java - 提供者不是 docker 容器内的子类型

转载 作者:行者123 更新时间:2023-11-30 06:12:00 25 4
gpt4 key购买 nike

情况

我正在开发一个使用 Java 的 URLClassLoaderServiceLoader 来加载 jar 文件的应用程序。这些 jar 文件里面是实现我的接口(interface)的提供者。文件夹结构如this post by oracle中所述。这意味着:

  • 该接口(interface)与插件中实现该接口(interface)的类 (com.x.projectname.plugin.IInterface.java) 位于同一目录中。在插件中,接口(interface)和实现它的类都位于 com.x.projectname.plugin 文件夹中。
  • 插件中有一个 resources.META-INF.services 目录,其中包含一个文件:com.x.projectname.plugin.IInterface,其中包含以下内容: com.x.projectname.plugin.ClassThatImplementsIInterface

在我的本地计算机上运行时(使用 Oracle JDK 1.8 162 和 OpenJDK 1.8 171 进行测试),插件加载正常,应用程序可以根据需要使用该插件。

问题

在 Docker 容器中运行主应用程序时,它无法加载所需的插件。 Docker 容器在安装在其中的机器上有一个文件夹,插件所在的位置。应用程序的docker镜像使用openjdk:8-jdk-alpine,但无论我是否使用alpine版本,问题仍然存在。

尝试使用 Serviceloader.load() 加载插件时(参见 ServiceLoader.load(InterfaceName.class, ClassLoader loader)

它崩溃并出现以下错误:Provider com.x.projectname.plugin.InterfaceImplementingClass不是子类型。

这是堆栈跟踪的相关部分:

Caused by: java.util.ServiceConfigurationError: com.x.projectname.plugin.IInterface: Provider com.x.projectname.plugin.ImplementingClass not a subtype
at java.util.ServiceLoader.fail(ServiceLoader.java:239) ~[na:1.8.0_151]
at java.util.ServiceLoader.access$300(ServiceLoader.java:185) ~[na:1.8.0_151]
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:376) ~[na:1.8.0_151]
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404) ~[na:1.8.0_151]
at java.util.ServiceLoader$1.next(ServiceLoader.java:480) ~[na:1.8.0_151]
at com.x.projectname.loader.PluginLoader.loadPlugins(PluginLoader.java:118) ~[classes!/:na]
at com.x.projectname.loader.PluginLoader.initializePluginLoading(PluginLoader.java:67) ~[classes!/:na]
at com.x.projectname.service.PluginService.<init>(PluginService.java:37) ~[classes!/:na]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_151]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_151]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_151]

知道为什么它在 Docker 容器内运行时不会加载插件吗?

编辑1:Dockerfile和docker运行命令

FROM openjdk:8-jdk-alpine
ARG JAR_FILE
ADD ${JAR_FILE} /CICD-dashboard.jar

# Remote debugging port for intelliJ == address
EXPOSE 50505
ENTRYPOINT [ "java", "-Xrunjdwp:transport=dt_socket,address=50505,suspend=n,server=y", "-jar", "/X-project.jar"]

docker运行命令:

docker run -d -v /home/folder/pluginfolder:/pluginfolder -p=50505:50505 image-name

最佳答案

事实证明,答案正如 Saqib 在评论中所说:构建一个 fat jar 子。我为此使用了shadowJar:http://imperceptiblethoughts.com/shadow/#configuring_shadow .

关于java - 提供者不是 docker 容器内的子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50040181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com