Maven Multi Module настаивает на дублировании application.properties источника данных в бизнес-модуле

У меня есть многомодульная структура spring boot maven java. Моя структура:

product (parent pom module)
..product-data (child pom module)
..product-business (has dependency for product-data) 
..product-rest (has dependency for product-business) 
..product-entities (child pom module)

product-data вернет объект сущности в product-business, а product-business вернет объект сущности в product-rest, а product-rest вернет объект json.

product-data работает нормально. Но как только я запускаю продуктовый бизнес, я получаю сообщение об ошибке "Невозможно определить класс драйвера встроенной базы данных для типа базы данных NONE". Spring ищет свойства spring.datasource.... в моем файле product-business/src/main/resources/application.properties. Если я определяю здесь все свойства, ошибка исчезает, и я получаю данные из данных о продукте.

Но!! Я уже определил свойства в файле product-data/src/main/resources/application.properties. Почему я должен дублировать одни и те же свойства в моем бизнес-модуле продукта? Вся цель состоит в том, чтобы разделить уровни. product-data отвечает за выборку данных и должен найти свойства spring.datasource... в своей собственной структуре. Почему это заставляет меня дублировать свойства и в бизнес-модуле? Я уверен, что что-то упускаю. Кто-нибудь знает?

У меня было много подобных вопросов о SO, но в большинстве из них отсутствовали свойства, поэтому моя проблема не решается. Я предполагаю, что мои файлы pom не являются подозреваемыми, потому что, как только я скопирую и вставлю свойства из данных о продукте в продукт-бизнес, ошибка исчезнет. Но на всякий случай, если вы все еще хотите увидеть мою помпон:

Исходный продукт ПОМ

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.owner</groupId>
    <artifactId>product</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <nopeasti.version>1.0.0-SNAPSHOT</nopeasti.version>
    </properties>

    <dependencies>

    </dependencies>

    <modules>
        <module>product-data</module>
        <module>product-business</module>
        <module>product-rest</module>
        <module>product-entities</module>
    </modules>
</project>

POM-данные о продукте

<project>
    <artifactId>product-data</artifactId>
    <packaging>jar</packaging>
    <parent>
        <groupId>com.owner</groupId>
        <artifactId>product</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <dependencyManagement>
         <dependencies>
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>1.5.8.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.0.0.M6</version>
            </plugin>
        </plugins>
    </build>
</project>

продукт-бизнес POM

<project>
    <artifactId>product-business</artifactId>
    <packaging>jar</packaging>
    <parent>
        <groupId>com.owner</groupId>
        <artifactId>product</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <dependencyManagement>
         <dependencies>
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>1.5.8.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.owner</groupId>
            <artifactId>product-data</artifactId>
            <scope>compile</scope>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.0.0.M6</version>
            </plugin>
        </plugins>
    </build>
</project>

person suomi-dev    schedule 15.11.2017    source источник
comment
Я получаю сообщение об ошибке: APPLICATION FAILED TO START Описание: Не удается определить класс драйвера встроенной базы данных для типа базы данных NONE Действие: Если вам нужна встроенная база данных, поместите поддерживаемую базу данных в путь к классам. Если у вас есть настройки базы данных, которые нужно загрузить из определенного профиля, вам может потребоваться активировать его (в настоящее время нет активных профилей).   -  person suomi-dev    schedule 16.11.2017
comment
Вы должны использовать плагин spring-boot-maven с той же версией, что и импортированные зависимости весенней загрузки... они не подходят друг другу...   -  person khmarbaise    schedule 16.11.2017
comment
product-data и product-business используют одну и ту же версию весенней загрузки   -  person suomi-dev    schedule 16.11.2017
comment
@suomi-dev ты нашел решение своей проблемы? Я столкнулся с той же проблемой   -  person aleksaRazer22    schedule 30.04.2020


Ответы (2)


Согласно этому,

Не рекомендуется размещать application.properties в библиотеке, потому что может возникнуть конфликт во время выполнения в приложении, которое его использует (только один application.properties когда-либо загружается из пути к классам)

Чтобы решить эту проблему и сохранить несвязанную архитектуру, я создал еще один файл data.properties в папке ресурсов модуля product-data и указал аннотацию @PropertySource. в файле конфигурации. Вот файл конфигурации модуля product-data. В этом файле были определены свойства spring.datasource. Тогда не было необходимости в свойствах spring.datasource в других 2 модулях.

@ComponentScan
@EnableAutoConfiguration
@SpringBootConfiguration
@PropertySource(value = "data.properties")
public class NopeastiDataConfig {
    // no main needed here as this is library consumed by business layer
}

Подробнее читайте здесь: Внешняя конфигурация

person suomi-dev    schedule 26.11.2017

Вы можете использовать свойство spring.config.name, чтобы переопределить значение по умолчанию application и поместить туда больше имен файлов свойств.

E.g.:

spring.config.name=entities,business,application

В таком случае вы можете иметь entity.properties в модуле сущностей, business.properties в бизнес-модуле и application.properties в остальном или в модуле приложения. Последнее имя конфигурации (приложение) имеет наивысший приоритет, а первое (сущности) — наименьший приоритет.

person martinsefcik    schedule 18.01.2021