Класс не загружен из файла 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", странно, мне не пришлось явно делать это для веб-приложения, добавление этого оператора решило проблему для меня. Похоже, что для веб-приложения, этот класс не загружается автоматически (до сих пор не понимаю, почему)