You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WireMock Docker容器中加载wiremock-state-extension并解决启动异常

问题描述

我使用WireMock 3.12版本,尝试将本地文件夹中的wiremock-state-extension加载至Docker容器内,参考官方文档操作后出现启动异常:

Exception in thread "main" java.util.ServiceConfigurationError: com.github.tomakehurst.wiremock.extension.ExtensionFactory: Provider org.wiremock.extensions.state.StandaloneStateExtension could not be instantiated
at java.base/java.util.ServiceLoader.fail(Unknown Source)
at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(Unknown Source)
at java.base/java.util.ServiceLoader$ProviderImpl.get(Unknown Source)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
at java.base/java.util.ServiceLoader$ProviderSpliterator.tryAdvance(Unknown Source)
at java.base/java.util.Spliterator.forEachRemaining(Unknown Source)
at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(Unknown Source)
at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Unknown Source)
at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source)
at java.base/java.util.stream.ReferencePipeline.collect(Unknown Source)
at com.github.tomakehurst.wiremock.extension.Extensions.load(Extensions.java:111)
at com.github.tomakehurst.wiremock.core.WireMockApp.(WireMockApp.java:108)
at com.github.tomakehurst.wiremock.WireMockServer.(WireMockServer.java:68)
at com.github.tomakehurst.wiremock.standalone.WireMockServerRunner.run(WireMockServerRunner.java:71)
at wiremock.Run.main(Run.java:23)
Caused by: java.lang.NoSuchMethodError: 'void com.github.tomakehurst.wiremock.extension.responsetemplating.TemplateEngine.(java.util.Map, java.lang.Long, java.util.Set, boolean)'
at org.wiremock.extensions.state.StateExtension.(StateExtension.java:60)
at org.wiremock.extensions.state.StandaloneStateExtension.(StandaloneStateExtension.java:28)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source)

我的Dockerfile内容如下:

# Use the official WireMock image as base
FROM wiremock/wiremock:3x

# Copy mapping files into the correct directory inside the container
COPY mappings /home/wiremock/mappings

# Ensure the correct directory for extensions exists
RUN mkdir -p /var/wiremock/extensions

# Copy the WireMock State Extension JAR into the correct directory
COPY extensions/wiremock-state-extension-standalone-0.4.0.jar /var/wiremock/extensions/

# Set WireMock to load extensions and enable response templating
CMD ["--global-response-templating"]

请问是否可以在Docker容器中使用WireMock扩展?同时该如何解决上述启动异常?


解答

1. Docker容器支持WireMock扩展

WireMock官方Docker镜像完全支持加载自定义扩展,只要将扩展JAR放置到正确目录并配置启动参数即可,你的整体思路没问题,问题出在版本兼容性和路径配置上。

2. 异常原因及解决方案

核心原因:版本不兼容

你使用的wiremock-state-extension-standalone-0.4.0.jar是旧版本,它依赖的WireMock内部API(TemplateEngine构造方法)在WireMock 3.12中已发生变更,导致找不到对应方法,抛出NoSuchMethodError。

具体修复步骤

  • 升级状态扩展版本:WireMock 3.x需要搭配1.x版本的wiremock-state-extension(例如1.2.0),该版本与WireMock 3.x的API完全兼容。
  • 修正扩展目录路径:官方WireMock Docker镜像的扩展目录是/home/wiremock/extensions,而非/var/wiremock/extensions,错误的路径会导致扩展无法被加载。
  • 明确指定扩展启动参数:虽然独立版扩展会自动注册,但显式指定扩展类名能确保加载逻辑更可靠。

修改后的Dockerfile示例:

# 使用指定版本的WireMock镜像,避免版本漂移
FROM wiremock/wiremock:3.12.0

# 复制映射文件到默认目录
COPY mappings /home/wiremock/mappings

# 复制兼容版本的状态扩展JAR到正确的扩展目录
COPY extensions/wiremock-state-extension-standalone-1.2.0.jar /home/wiremock/extensions/

# 启动参数:启用全局响应模板+指定加载状态扩展
CMD ["--global-response-templating", "--extensions", "org.wiremock.extensions.state.StandaloneStateExtension"]

验证步骤

启动容器后,可通过访问http://<容器IP>:8080/__admin/extensions接口,检查返回结果中是否包含org.wiremock.extensions.state.StandaloneStateExtension,确认扩展已成功加载。

内容的提问来源于stack exchange,提问作者kaushal sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 08:42:25