java.lang.ClassNotFoundException: Unable to load class: com.microsoft.sqlserver.jdbc.SQLServerDriver on new docker container

Luis Valencia :

I am trying to create a docker image with Sql server JDBC Driver.

However I am getting this error:

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

My Docker file is like this:

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 .

Update 1:

I removed the export line and added:

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

based on other SO questions, I tried also the jre11 and jre12 versions of the driver, but still have the same error, unable to load class.

Update 2:

According to Camunda documentation here: https://github.com/camunda/docker-camunda-bpm-platform

Java Versions Our docker images are using the latest LTS OpenJDK version supported by Camunda BPM. This currently means:

Camunda 7.12 will be based on OpenJDK 11 All previous versions are based on OpenJDK 8

According to Microsoft documentation here: 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:

The JDBC Driver 7.4 includes three JAR class libraries in each installation package: mssql-jdbc-7.4.1.jre8.jar, mssql-jdbc-7.4.1.jre11.jar, and mssql-jdbc-7.4.1.jre12.jar.

The JDBC Driver 7.4 is designed to work with and be supported by all major Java virtual machines, but is tested only on OpenJDK 1.8, OpenJDK 11.0, OpenJDK 12.0, Azul Zulu JRE 1.8, Azul Zulu JRE 11.0, and Azul Zulu JRE 12.0.

version 7.4 is supported by OpenJDK

LinPy :

that RUN export CLASSPATH="$CLASSPATH:/tmp/sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre8.jar" will has no effect in your dockerfile:

instead you need to use ENV for runtime and ARG for build:

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

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=139932&siteId=1