Проблема архитектуры модуля Maven - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь спроектировать платформу микросервисов, используя Spring Boot и Maven в качестве менеджера зависимостей.

Это архитектура, которую я пытаюсь реализовать:

MainFolder

 - core/
     - pom.xml
     - dep-core/
        - pom.xml //core module as parent
        - src/main/...
 - cfm/
     - my-cfm-one/
        - pom.xml //core module as parent
        - src/main/...
     - my-cfm-two/
        - pom.xml //core module as parent
        - src/main/...
     - ...
 - pfm/
     - my-pfm-one/
        - pom.xml //core module as parent and import my-cfm-one as dependency
        - src/main/...
     - my-pfm-two/
        - pom.xml //core module as parent and import my-cfm-two as dependency
        - src/main/...
     - ...
 - ms/
     - my-ms-one/
        - pom.xml //core module as parent and import my-pfm-one and my-pfm-two as dependencies
        - src/main/...
     - ...

Моя проблема связана с модулем dep-core.Когда я устанавливаю ядро ​​модуля в качестве родителя для одного cfm, я не могу получить доступ к классам, определенным в модуле dep-core (который импортируется в модуль core (parent))

Это pom модуля ядра(Я опускаю некоторые части для сокращения)

    ...
    <groupId>it.test</groupId>
    <artifactId>core</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>core</name>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        ...
    </properties>


    <modules>
        <module>dep-core</module>
    </modules>

    <!-- I also tried ( with and without <module> tag )
        <dependencies>
            <dependency>
                <groupId>it.test</groupId>
                <artifactId>dep-core</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
        </dependencies>
    -->
</project>

Это pom модуля dep-core

    ...
    <groupId>it.test</groupId>
    <artifactId>dep-core</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>dep-core</name>

    <parent>
        <groupId>it.test</groupId>
        <artifactId>core</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../</relativePath>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        ...
    </dependencies>

    <dependencyManagement>
        ...
    </dependencyManagement>

    <repositories>
        ...
    </repositories>
</project>

И это pom одного модуля cfm

    <groupId>it.test</groupId>
    <artifactId>search-cfm</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>search-cfm</name>

    <parent>
        <groupId>it.test</groupId>
        <artifactId>core</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath/>
    </parent>

    <dependencies>
        <!--SPRING DEP-->
    </dependencies>
</project>

Может кто-нибудь дать мне правильный способ спроектировать мою архитектуру и решить мою проблему?

Я также добавил пример проекта в github, чтобы увидеть проблему.

https://github.com/jayturchi/test-maven-architecture

1 Ответ

0 голосов
/ 08 февраля 2019

для наследования зависимости (зависимость будет в вашем пути к классам, чтобы вы могли получить доступ к ее классам) от вашего родительского POM, зависимость должна быть объявлена ​​как зависимость родительского POM;поэтому, чтобы ваш dep-core был зависимым в родительском POM, просто объявите его как мужской, но не сделайте его зависимым.У вас есть проблема, потому что вы не можете объявить глубокое ядро ​​как прямую зависимость вашего ядра, так как глубокое ядро ​​POM является дочерним ядром ядра POM.Это вызывает циклическую зависимость, которая мешает maven компилировать ваше ядро.Чтобы решить эту проблему, вам нужен промежуточный POM, унаследованный от ядра и с глубоким ядром в качестве зависимости.Давайте назовем это обертка стихотворения.Теперь Вы можете объявить обертку как родительский pom для ваших листьев (cfm и pfm).

Я публикую исправления POM для core, wrapper и cfm-one.

core.pom

  <groupId>it.test</groupId>
        <artifactId>my-cfm-one</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>

        <name>my-cfm-one</name>

       <parent>
            <groupId>it.test</groupId>
            <artifactId>wrapper</artifactId>
            <version>1.0-SNAPSHOT</version>
            <relativePath>../</relativePath>
        </parent>

        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>

            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>

        </dependencies>

wrapper.pom

  <groupId>it.test</groupId>
    <artifactId>wrapper</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <parent>
        <groupId>it.test</groupId>
        <artifactId>core</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../</relativePath>
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
            <dependency>
            <groupId>it.test</groupId>
            <artifactId>dep-core</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

и, наконец, cfm-one

    <artifactId>my-cfm-one</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>my-cfm-one</name>
    <parent>
    <groupId>it.test</groupId>
    <artifactId>wrapper</artifactId>
     <version>1.0-SNAPSHOT</version>
     <relativePath>../</relativePath>
    </parent>

    <dependencies>
     <dependency>
    <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
<dependency>
<groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>

</dependencies>
...