【问题标题】:java.lang.ClassNotFoundException: Unable to load class: com.microsoft.sqlserver.jdbc.SQLServerDriver on new docker containerjava.lang.ClassNotFoundException:无法在新的 docker 容器上加载类:com.microsoft.sqlserver.jdbc.SQLServerDriver
【发布时间】:2020-01-11 00:33:40
【问题描述】:

我正在尝试使用 Sql server JDBC Driver 创建一个 docker 映像。

但是我收到了这个错误:

Caused by: java.lang.ClassNotFoundException: Unable to load class: com.microsoft.sqlserver.jdbc.SQLServerDriver from ClassLoader:java.net.URLClassLoader@71423665;ClassLoader:java.net.URLClassLoader@71423665
        at org.apache.tomcat.jdbc.pool.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:56)
        at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:281)
        ... 41 more
Caused by: java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:398)
        at org.apache.tomcat.jdbc.pool.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:38)
        ... 42 more

我的 Docker 文件是这样的:

FROM alpine:3.10 as builder

ARG VERSION=7.12.0
ARG DISTRO=tomcat
ARG SNAPSHOT=true

ARG EE=false
ARG USER
ARG PASSWORD

RUN apk add --no-cache \
        ca-certificates \
        maven \
        tar \
        wget \
        xmlstarlet

COPY settings.xml download.sh camunda-tomcat.sh camunda-wildfly.sh  /tmp/

RUN /tmp/download.sh


##### FINAL IMAGE #####

FROM alpine:3.10

ARG VERSION=7.12.0

#MSSQL SERVER JDBC DRIVER INSTALL
COPY sqljdbc_7.4.1.0_enu.tar.gz /tmp/
WORKDIR /tmp
RUN tar -xf sqljdbc_7.4.1.0_enu.tar.gz
RUN export CLASSPATH="$CLASSPATH:/tmp/sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre8.jar"

ENV CAMUNDA_VERSION=${VERSION}
ENV DB_DRIVER=com.microsoft.sqlserver.jdbc.SQLServerDriver
ENV DB_URL=jdbc:sqlserver://xx.database.windows.net:1433;database=camundadb;user=demo@xx;password=xxx.;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
ENV DB_USERNAME=
ENV DB_PASSWORD=
ENV DB_CONN_MAXACTIVE=20
ENV DB_CONN_MINIDLE=5
ENV DB_CONN_MAXIDLE=20
ENV DB_VALIDATE_ON_BORROW=false
ENV DB_VALIDATION_QUERY="SELECT 1"
ENV SKIP_DB_CONFIG=
ENV WAIT_FOR=
ENV WAIT_FOR_TIMEOUT=120
ENV TZ=UTC
ENV DEBUG=TRUE
ENV JAVA_OPTS="-Xmx768m -XX:MaxMetaspaceSize=256m"

EXPOSE 8080 8000



# Downgrading wait-for-it is necessary until this PR is merged
# https://github.com/vishnubob/wait-for-it/pull/68
RUN apk add --no-cache \
        bash \
        ca-certificates \
        openjdk11-jre-headless \
        tzdata \
        tini \
        xmlstarlet \
    && wget -O /usr/local/bin/wait-for-it.sh \
      "https://raw.githubusercontent.com/vishnubob/wait-for-it/a454892f3c2ebbc22bd15e446415b8fcb7c1cfa4/wait-for-it.sh" \
    && chmod +x /usr/local/bin/wait-for-it.sh

RUN addgroup -g 1000 -S camunda && \
    adduser -u 1000 -S camunda -G camunda -h /camunda -s /bin/bash -D camunda
WORKDIR /camunda
USER camunda

ENTRYPOINT ["/sbin/tini", "--"]
CMD ["./camunda.sh"]

COPY --chown=camunda:camunda --from=builder /camunda .

更新 1:

我删除了导出行并添加了:

ENV CLASSPATH ${CLASSPATH}:/tmp/sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre8.jar ARG CLASSPATH=${CLASSPATH}:/tmp/sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre8.jar

基于其他 SO 问题,我也尝试了 jre11 和 jre12 版本的驱动程序,但仍然有同样的错误,无法加载类。

更新 2:

根据此处的 Camunda 文档:https://github.com/camunda/docker-camunda-bpm-platform

Java 版本 我们的 docker 镜像使用 Camunda BPM 支持的最新 LTS OpenJDK 版本。这目前意味着:

Camunda 7.12 将基于 OpenJDK 11 所有以前的版本都基于 OpenJDK 8

根据此处的 Microsoft 文档: https://docs.microsoft.com/en-us/sql/connect/jdbc/system-requirements-for-the-jdbc-driver?view=sql-server-2017

Microsoft JDBC Driver 7.4 for SQL Server:

JDBC Driver 7.4在每个安装包中包含三个JAR类库:mssql-jdbc-7.4.1.jre8.jar、mssql-jdbc-7.4.1.jre11.jar和mssql-jdbc-7.4.1。 jre12.jar。

JDBC 驱动程序 7.4 旨在与所有主要 Java 虚拟机一起使用并受其支持,但仅在 OpenJDK 1.8、OpenJDK 11.0、OpenJDK 12.0、Azul Zulu JRE 1.8、Azul Zulu JRE 11.0 和 Azul Zulu JRE 上进行了测试12.0.

OpenJDK 支持 7.4 版本

【问题讨论】:

  • 大多数运行 Java 应用程序的方式根本不会使用 CLASSPATH 环境变量。
  • 有什么建议可以解决这个问题吗?
  • 可能将驱动程序复制到 tomcat lib 文件夹而不是工作。

标签: java sql-server docker jdbc camunda


【解决方案1】:

RUN export CLASSPATH="$CLASSPATH:/tmp/sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre8.jar" 对您的dockerfile 无效:

您需要使用 ENV 运行时和 ARG 构建:

ENV CLASSPATH ${CLASSPATH}:/tmp/sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre8.jar
ARG CLASSPATH=${CLASSPATH}:/tmp/sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre8.jar

【讨论】:

  • 您是否再次构建映像?确保您从头开始构建新版本
  • 上面的这些命令会删除之前的类路径而不是附加它吗?
  • 您必须确保 CLASSPATH 语句只包含一个 Microsoft JDBC Driver for SQL Server,在 ENV 之后添加 echo $CLASSPATH 以查看结果......
  • 请尝试将jar文件复制到$CATALINA_HOME/lib/
猜你喜欢
  • 1970-01-01
  • 2013-06-21
  • 2016-01-30
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 2022-07-28
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多