java - 无法在 docker 中运行 jmeter 测试,获取类未找到异常
问题描述
我正在尝试通过 docker 运行 jmeter,但我得到了一个找不到类的异常。maven 依赖项在那里,我可以使用命令行在本地运行它。
这是我得到的例外:
2021-02-13 17:48:35,315 ERROR o.a.j.JMeter: Uncaught exception in thread Thread[Thread Group 1-2,5,main]
java.lang.NoClassDefFoundError: Could not initialize class com.amazonaws.auth.DefaultAWSCredentialsProviderChain
at Utils.TestParameters.<init>(TestParameters.java:62) ~[Performance-1.0-SNAPSHOT.jar:?]
at InitTest.InitTest(InitTest.java:96) ~[Performance-1.0-SNAPSHOT.jar:?]
at InitTest.runTest(InitTest.java:33) ~[Performance-1.0-SNAPSHOT.jar:?] at org.apache.jmeter.protocol.java.sampler.JavaSampler.sample(JavaSampler.java:197) ~[ApacheJMeter_java.jar:5.4.1] at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:635) ~[Performance-1.0-SNAPSHOT.jar:?] at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:558) ~[Performance-1.0-SNAPSHOT.jar:?] at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:489) ~[Performance-1.0-SNAPSHOT.jar:?] at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:256) ~[Performance-1.0-SNAPSHOT.jar:?]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_282]
正如我所说,我可以在本地运行它,但为了这张票,我在项目 pom.xml 中包含了上述依赖项:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-core</artifactId>
<version>1.11.924</version>
</dependency>
我的 dockerfile 包含以下命令,它将我的 jar 复制到 lib 位置(此 jar 包含上述依赖项):
COPY Performance-1.0-SNAPSHOT.jar /opt/apache-jmeter-5.4.1/lib/Performance-1.0-SNAPSHOT.jar
我是 docker 新手,如果我在这里遗漏了一些基本的东西,我深表歉意。
编辑:
这是我的码头文件:
FROM ubuntu:latest
# setup jmeter version to use
ARG JMETER_VERSION="5.4.1"
ARG JMETER_PLUGINS_MANAGER_VERSION="1.3"
ARG CMDRUNNER_VERSION="2.2"
ENV JMETER_HOME /opt/apache-jmeter-${JMETER_VERSION}
ENV JMETER_BIN ${JMETER_HOME}/bin
ENV MIRROR_HOST https://archive.apache.org/dist/jmeter
ENV JMETER_DOWNLOAD_URL ${MIRROR_HOST}/binaries/apache-jmeter-${JMETER_VERSION}.tgz
ENV JMETER_PLUGINS_DOWNLOAD_URL https://repo1.maven.org/maven2/kg/apc
ENV JMETER_PLUGINS_FOLDER ${JMETER_HOME}/lib/ext/
ENV PATH $PATH:$JMETER_BIN
# Install Everything.
RUN \
sed -i -e 's/# \(.*multiverse$\)/\1/g' /etc/apt/sources.list && \
apt-get update && \
apt-get install -y build-essential && \
apt-get install -y software-properties-common && \
apt-get install -y byobu openjdk-8-jre curl git htop man unzip vim wget python3-pip && \
mkdir -p /tmp/dependencies && \
curl -L --silent ${JMETER_DOWNLOAD_URL} > /tmp/dependencies/apache-jmeter-${JMETER_VERSION}.tgz && \
mkdir -p /opt && \
tar -xzf /tmp/dependencies/apache-jmeter-${JMETER_VERSION}.tgz -C /opt && \
rm -rf /tmp/dependencies && \
rm -rf /var/lib/apt/lists/*
# Install jmeter lib and dependency jars
RUN curl -L --silent ${JMETER_PLUGINS_DOWNLOAD_URL}/jmeter-plugins-manager/${JMETER_PLUGINS_MANAGER_VERSION}/jmeter-plugins-manager-${JMETER_PLUGINS_MANAGER_VERSION}.jar -o ${JMETER_PLUGINS_FOLDER}/jmeter-plugins-manager-${JMETER_PLUGINS_MANAGER_VERSION}.jar
RUN curl -L --silent ${JMETER_PLUGINS_DOWNLOAD_URL}/cmdrunner/${CMDRUNNER_VERSION}/cmdrunner-${CMDRUNNER_VERSION}.jar -o ${JMETER_HOME}/lib/cmdrunner-${CMDRUNNER_VERSION}.jar && \
java -cp ${JMETER_PLUGINS_FOLDER}/jmeter-plugins-manager-${JMETER_PLUGINS_MANAGER_VERSION}.jar org.jmeterplugins.repository.PluginManagerCMDInstaller && \
PluginsManagerCMD.sh install jpgc-cmd=2.2,jpgc-dummy=0.4,jpgc-filterresults=2.2,jpgc-synthesis=2.2,jpgc-graphs-basic=2.0 \
&& jmeter --version \
&& PluginsManagerCMD.sh status \
RUN ln -nsf /usr/bin/pip3 /usr/bin/pip
RUN ln -nfs /usr/bin/python3 /usr/bin/python
RUN pip3 install awscli && pip3 install xmltodict
# sheel script has script to convert JTL to CSV
COPY run.sh /
COPY performance.jmx /performance.jmx
COPY Performance-1.0-SNAPSHOT.jar /opt/apache-jmeter-5.4.1/lib/Performance-1.0-SNAPSHOT.jar
# Set environment variables.
ENV HOME /root
# Final cleanup
RUN apt-get --purge autoremove
RUN ["chmod", "+x", "/run.sh"]
# Define working directory.
WORKDIR /
CMD /run.sh
这是我启动jmeter的方法:
echo "START Running Jmeter on `date`"
JVM_ARGS="-Xms2048m -Xmx8192m" jmeter -n -t /performance.jmx -l /jmeter.jtl 2>&1
java -jar /opt/apache-jmeter-5.4.1/lib/cmdrunner-2.2.jar --tool Reporter --plugin-type AggregateReport --input-jtl /jmeter.jtl --generate-csv /results/results.csv 2>&1
cat /results/results.csv
echo "END Running Jmeter on `date`"
解决方案
我与 Docker 的合作不多,但我怀疑 Apache Commons Logging JAR 不知何故在类路径上丢失或不在。
该错误java.lang.NoClassDefFoundError: Could not initialize class <SomeClassName>
并不意味着SomeClassName
找不到该类。这意味着 JVM 找到了该类,但在执行静态初始化时遇到了错误。此外,仅当先前对此类执行静态初始化失败时才会引发此异常。您之前可能会或可能不会在日志中看到不同的错误。
类的静态初始化包括使用看似在同一个包中的各种类的实例DefaultAWSCredentialsProviderChain
创建一个字段。INSTANCE
其中,EC2ContainerCredentialsProviderWrapper
使用 Apache Commons Logging 记录器,但其余所有似乎只使用内置 Java 类或com.amazonaws
.
超类的静态初始化AWSCredentialsProviderChain
也需要进行,其中还包括来自 Apache Commons Logging 的记录器。
推荐阅读
- javascript - JQuery - 向输入添加值,但一个输入没有“.value”属性
- git - 我不想检查一个特定的分支,即使是偶然
- c# - 如何将大量数据中的内容从 sql 对齐到 web?
- spring-boot - 零对一(可选的一对一)实体关系问题(尝试分配空的一对一属性)
- excel - 如何用单元格之间的空白扩展动态范围?
- java - 添加 Openfeign 依赖项时出现 java.lang.IllegalStateException
- php - 如何修复 PHP 中的“无法重新声明”错误?
- php - Gmail使用PHP Mailer在我的超链接中去除href
- python-3.x - 如何在 tkinter 中使用多列表框制作标题和子标题
- git - 如何撤消 git reset --hard 恢复丢失的数据?