Подключите Vertica DB в приложении SpringBoot с несколькими источниками данных

Я не могу запустить приложение в тестовой среде из-за отсутствия драйвера.

Вот такая ошибка, которую я получаю: 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 с тем же результатом, работал локально, но не работал в тестовой среде.

У меня заканчиваются идеи, пожалуйста, любая помощь будет принята с благодарностью.

Покажите свои зависимости.

M. Deinum 02.04.2024 13:33

Спасибо за ответ, сообщение обновлено зависимостями, дайте мне знать, если мне нужно предоставить что-то еще.

Snake_NG 02.04.2024 14:00

На первый взгляд вы очень стараетесь обойти предоставляемое управление зависимостями Spring Boot. Какую версию Spring Boot вы на самом деле используете?

M. Deinum 02.04.2024 14:04

Я использую Spring Boot версии 2.6.4. Не могли бы вы пояснить, что вы имеете в виду под «очень стараться обойти предоставленное управление зависимостями Spring Boot»? Я искренне хочу понять, есть ли более оптимальный подход, который мне следует рассмотреть. Никаких обид; Я ценю ваш вклад и здесь, чтобы учиться и совершенствоваться.

Snake_NG 02.04.2024 16:53

Вы определяете множество зависимостей, которые уже есть в зависимостях 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.

M. Deinum 02.04.2024 17:12

Спасибо за понимание. Очень признателен за ваш подробный отзыв, и я рассмотрю зависимости. Могут ли проблемы с зависимостями быть причиной того, что драйвер Vertica работает локально, но не работает в тестовой среде?

Snake_NG 02.04.2024 19:09

spring-jdbc, по крайней мере, проблематичен, поскольку он не предназначен для Spring Boot 2.6.x (который больше не поддерживается, чтобы вы знали). Если банка находится в вашей конечной банке, ее следует найти, поэтому, если вы не копируете не ту банку или не выполняете с ней какую-либо другую обработку, она может быть удалена. Наконец, почему существует зависимость jaxb2-maven-plugin? Плагин как зависимость на самом деле не имеет смысла.

M. Deinum 03.04.2024 08:24

Я удалил Spring-jdbc, и теперь все работает правильно, спасибо за ваше терпение и рекомендации во всем, но я не понимаю, почему зависимость не вызывала проблем при работе на моей машине.

Snake_NG 07.04.2024 19:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
8
86
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы сообщили конфигурации, что здесь находится драйвер Vertica?

/opt/vertica/lib/vertica-jdbc-xx.x.x-x.jar

(Где x обозначает цифру - а формат указывает версию драйвера)...

В конце концов, основной проблемой стала зависимость Spring-jdbc. Я его удалил и все стало работать корректно, без использования ручной загрузки из jar

Snake_NG 07.04.2024 19:41
Ответ принят как подходящий

В конце концов, причиной проблемы была зависимость spring-jdbc, указанная @M. Дейнум. с этим удалил все загружается правильно. Спасибо @M. Дейнуму за предложения о том, как лучше управлять зависимостями весенней загрузки.

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