Я не могу запустить приложение в тестовой среде из-за отсутствия драйвера.
Вот такая ошибка, которую я получаю: java.lang.ClassNotFoundException: com.vertica.jdbc.Driver
Поскольку это многомодульный проект, это зависимости в родительском pom.
<dependencies>
<!-- spring cloud -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-dependencies</artifactId>
<version>${spring-cloud-stream.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<!-- swagger -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>${springdoc.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
<version>${spring-cloud-config-server.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>${maven-deploy-plugin.version}</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>${json.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
<version>${spring-cloud-config-client.version}</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${google-guava.version}</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.3</version>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>4.2.2</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
Это pom из модуля, в котором необходимо создать вертикальное соединение.
<?xml version = "1.0" encoding = "UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>core</artifactId>
<groupId>it.xx.xx.xx</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>xxxxx-service</artifactId>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<spring-cloud-config-client.version>3.1.1</spring-cloud-config-client.version>
</properties>
<dependencies>
<!-- spring cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
<version>${spring-cloud-config-client.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-kafka-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- spring boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<optional>true</optional>
</dependency>
<!-- kafka -->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-streams</artifactId>
</dependency>
<!-- misc -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20231013</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.16.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.16.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.13.3</version>
</dependency>
<dependency>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.12.239</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>2.16.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<!-- swagger -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.6.6</version>
</dependency>
<dependency>
<groupId>io.swagger.core.v3</groupId>
<artifactId>swagger-core</artifactId>
<version>2.1.13</version>
</dependency>
<dependency>
<groupId>io.swagger.core.v3</groupId>
<artifactId>swagger-annotations</artifactId>
<version>2.1.13</version>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-data-rest</artifactId>
<version>1.6.6</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.11</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- testing -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.11.2</version>
</dependency>
<dependency>
<groupId>software.amazon.msk</groupId>
<artifactId>aws-msk-iam-auth</artifactId>
<version>1.1.4</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-core</artifactId>
<version>1.12.322</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>6.1.4</version>
</dependency>
<!-- Vertica -->
<dependency>
<groupId>com.vertica.jdbc</groupId>
<artifactId>vertica-jdbc</artifactId>
<version>24.1.0-0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.4</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- for testing porpoises -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<argLine>--add-opens java.base/java.lang=ALL-UNNAMED</argLine>
</configuration>
</plugin>
</plugins>
</build>
</project>
Это мой файл свойств:
## Vertica DB configuration properties
spring.vertica-datasource.url=jdbc:vertica://XXX.XXX.XXX.XXX:5433/dbname
spring.vertica-datasource.username=XXXX
spring.vertica-datasource.password=XXXXXX
spring.vertica-datasource.driver-class-name=com.vertica.jdbc.Driver
spring.vertica-datasource.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
И это класс конфигурации
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages = "it.xx.xx.xx.repo.vertica",
entityManagerFactoryRef = "verticaEntityManagerFactory",
transactionManagerRef = "verticaTransactionManager")
public class VerticaDataSourceConfig {
@Value("${spring.vertica-datasource.hibernate.dialect}")
private String dialect;
@Bean(name = "verticaDBProperties")
@ConfigurationProperties("spring.vertica-datasource")
public DataSourceProperties dataSourceProperties() {
return new DataSourceProperties();
}
@Bean(name = "verticaDBDatasource")
@ConfigurationProperties(prefix = "spring.vertica-datasource")
public DataSource datasource(@Qualifier("verticaDBProperties") DataSourceProperties properties){
return properties.initializeDataSourceBuilder().build();
}
@Bean(name = "verticaEntityManagerFactoryBuilder")
public EntityManagerFactoryBuilder entityManagerFactoryBuilder() {
return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(), new HashMap<>(), null);
}
@Bean(name = "verticaEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean
(@Qualifier("verticaEntityManagerFactoryBuilder") EntityManagerFactoryBuilder builder, @Qualifier("verticaDBDatasource") DataSource dataSource){
Map<String, String> properties = new HashMap<>();
properties.put("hibernate.dialect", dialect);
return builder.dataSource(dataSource)
.packages("it.xx.xx.xx.entity.db.vertica")
.persistenceUnit("verticaDB")
.properties(properties)
.build();
}
@Bean(name = "verticaTransactionManager")
public PlatformTransactionManager transactionManager(
@Qualifier("verticaEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
Проблема в том, что ошибка появляется только в тестовой среде, локально я использую докеризованный экземпляр vertica, и проблем не возникает.
Мы используем AWS для развертывания и создания приложения. Я вижу, что зависимость загружается из центра Maven, но при создании модуля (мы используем kubernetes) при запуске выдается исключение ClassNotFoundException.
Я также попытался загрузить драйвер с помощью файла jar через ResourceLoader с тем же результатом, работал локально, но не работал в тестовой среде.
У меня заканчиваются идеи, пожалуйста, любая помощь будет принята с благодарностью.
Спасибо за ответ, сообщение обновлено зависимостями, дайте мне знать, если мне нужно предоставить что-то еще.
На первый взгляд вы очень стараетесь обойти предоставляемое управление зависимостями Spring Boot. Какую версию Spring Boot вы на самом деле используете?
Я использую Spring Boot версии 2.6.4. Не могли бы вы пояснить, что вы имеете в виду под «очень стараться обойти предоставленное управление зависимостями Spring Boot»? Я искренне хочу понять, есть ли более оптимальный подход, который мне следует рассмотреть. Никаких обид; Я ценю ваш вклад и здесь, чтобы учиться и совершенствоваться.
Вы определяете множество зависимостей, которые уже есть в зависимостях spring-boot-starter-*, spring-boot-dependencies находится не в том месте, а также вы включаете несовместимые зависимости. spring-boot-starter-web уже включает spring-boot-starter-tomcat, spring-jdbc не нужен и несовместим. spring-boot-autoconfigure уже входит во все остальные стартеры и совсем не обязателен. Смешивание версий зависимостей Apache POI и Jacksons. spring-cloud-config-client версия управляется вне зависимостей Spring Cloud.
Спасибо за понимание. Очень признателен за ваш подробный отзыв, и я рассмотрю зависимости. Могут ли проблемы с зависимостями быть причиной того, что драйвер Vertica работает локально, но не работает в тестовой среде?
spring-jdbc, по крайней мере, проблематичен, поскольку он не предназначен для Spring Boot 2.6.x (который больше не поддерживается, чтобы вы знали). Если банка находится в вашей конечной банке, ее следует найти, поэтому, если вы не копируете не ту банку или не выполняете с ней какую-либо другую обработку, она может быть удалена. Наконец, почему существует зависимость jaxb2-maven-plugin? Плагин как зависимость на самом деле не имеет смысла.
Я удалил Spring-jdbc, и теперь все работает правильно, спасибо за ваше терпение и рекомендации во всем, но я не понимаю, почему зависимость не вызывала проблем при работе на моей машине.




Вы сообщили конфигурации, что здесь находится драйвер Vertica?
/opt/vertica/lib/vertica-jdbc-xx.x.x-x.jar
(Где x обозначает цифру - а формат указывает версию драйвера)...
В конце концов, основной проблемой стала зависимость Spring-jdbc. Я его удалил и все стало работать корректно, без использования ручной загрузки из jar
В конце концов, причиной проблемы была зависимость spring-jdbc, указанная @M. Дейнум.
с этим удалил все загружается правильно.
Спасибо @M. Дейнуму за предложения о том, как лучше управлять зависимостями весенней загрузки.
Покажите свои зависимости.