Класс не загружен из файла JAR в веб-приложении Maven

Я пытаюсь добавить sqlserver42.jar в мое веб-приложение maven.

Я следовал за процессом, данным здесь

Отсутствует артефакт com.microsoft.sqlserver:sqljdbc4:jar:4.0

Я загрузил файл sqljdbc42.jar с веб-сайта Microsoft и выполнил следующую команду.

mvn install:install-file -Dfile=sqljdbc42.jar -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc42 -Dversion=4.2.0 -Dpackaging=jar

Он добавил файл JAR в мой локальный репозиторий, и я включил следующее в мой проект pom.xml

<dependency>
    <groupId>com.microsoft.sqlserver.jdbc</groupId>
    <artifactId>sqljdbc</artifactId>
    <version>${sqljdbc.version}</version>
</dependency>

Я уже дал значение для "sqljdbc.version" в свойствах, и оно разрешилось до нужного значения. После того, как я обновил проект maven и запустил "mvn clean install", я смог увидеть файлы jar в зависимостях моего проекта maven (в Eclipse).

Теперь, когда я пытаюсь запустить веб-приложение, оно не может выбрать класс драйвера из этого jar-файла, и я получаю следующее исключение:

java.sql.SQLException: не найден подходящий драйвер для jdbc:sqlserver://datawh.database.windows.net:1433; база данных =datawh; пользователь =username@datawh; пароль = пароль; encrypt = true;trustServerCertificate= false; hostNameInCertificate =.database.windows.net;loginTimeout= 30 в java.sql.DriverManager.getConnection(DriverManager.java:689) в java.sql.DriverManager.getConnection(DriverManager.java:270) в com.sprt.rest.dao.AccidentDAOImpl.listAllAccidents(AccidentDAOImpl.java:184) на com.sprt.rest.service.AccidentServiceImpl.listAllAccidents(AccidentServiceImpl.java:34) на com.sprt.rest.controller.AccidentController.listAccAccident.reflect.NativeMethodAccessorImpl.invoke0(собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) в sun.reflect.DelegatingMethodAccessorImpl.invod.or.java......Matinging

Я проверил сгенерированный файл war для своего приложения и заметил, что в WEB-INF/lib также доступен jar sqljdbc42-4.2.0

Я использовал файл jar в своем локальном репозитории в другом простом java-приложении без maven, и он смог выбрать класс драйвера. Что я делаю не так в своем веб-приложении maven?

Мои веб-приложения pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.b2b.rest</groupId>
    <artifactId>b2b-restapi</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>b2b-restapi Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <properties>
        <java-version>1.8</java-version>
        <springframework.version>4.3.1.RELEASE</springframework.version>
        <jackson.version>2.7.5</jackson.version>
        <servlet.version>3.1.0</servlet.version>
        <log4j.version>1.2.17</log4j.version>
        <hibernate.version>4.2.0.Final</hibernate.version>
        <springfox.version>2.5.0</springfox.version>
        <sqljdbc.version>4.2.0</sqljdbc.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${servlet.version}</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>${springfox.version}</version>
        </dependency>
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>sqljdbc42</artifactId>
            <version>${sqljdbc.version}</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>b2b-restapi</finalName>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat8-maven-plugin</artifactId>
                    <version>2.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>2.6</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <failOnMissingWebXml>false</failOnMissingWebXml>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.3</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

Строка подключения, которую я использую для подключения к базе данных

JDBC: SQLServer: //datawh.database.windows.net: 1433; база данных = datawh, пользователь = имя пользователя @ datawh, пароль = пароль, зашифровать = истина;trustServerCertificate= ложь;hostNameInCertificate=* database.windows.net;loginTimeout=. 30

Я также должен упомянуть, что я не пытаюсь подключиться к БД SQL-сервера, но пытаюсь подключиться к Microsoft Azure SQL Warehouse

1 ответ

Я был неправ, обвиняя в этом Мейвена. Maven включил соответствующий файл sqljdbc42.jar в папку lib в файле war. Так что он сделал свою работу. Я попытался воспроизвести тот же код в обычном (не Maven) веб-приложении, и он все еще не работал.

Я добавил следующее утверждение, прежде чем пытаться получить соединение

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

Для приложения, которое выполняется в ядре java, и если внешние библиотеки добавляются через "Configure Build Path", странно, мне не пришлось явно делать это для веб-приложения, добавление этого оператора решило проблему для меня. Похоже, что для веб-приложения, этот класс не загружается автоматически (до сих пор не понимаю, почему)

Другие вопросы по тегам