maven - Maven模块架构问题
问题描述
我正在尝试使用 Spring Boot 和 Maven 作为依赖管理器来设计一个微服务平台。
这是我正在尝试实现的架构:
主文件夹
- 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 模块中的类(即导入到核心(父)模块中)
这是核心模块的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>
这是 dep-core 模块的 pom
...
<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>
这是一个cfm模块的pom
<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 以查看问题。
解决方案
为了从父 POM 继承依赖项(依赖项将在您的类路径中,以便您可以访问其类),必须将依赖项声明为父 POM 的依赖项;因此,要将您的 dep-core 作为父 POM 中的依赖项,只需将其声明为男性并不会使其成为依赖项。你有一个问题,因为你不能将深层核心声明为核心的直接依赖关系,因为深层核心 POM 是核心 POM 的子级。这会导致循环依赖,阻止 Maven 编译你的核心。要解决这个问题,您需要一个从核心继承的中间 POM,并将深度核心作为依赖项。让我们称之为诗歌包装。现在您可以将包装器声明为您的叶子项目(cfm 和 pfm)的父 pom。
我为核心、包装器和 cfm-one 发布了正确的 POM。
核心.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>
包装器.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>
推荐阅读
- c# - C# ParseExact 异常
- javascript - 带有 Express 的 Axios “请求失败,状态码 404”
- imap - RocketChat:电子邮件身份验证不断失败
- javascript - Ruby on Rails,参数不可用?
- python-3.x - 使用 UNWIND 将数据加载到使用 python 的 Neo4j 的问题
- javascript - 单选按钮单击使用 css 的活动颜色更改
- django-rest-framework - 如何处理 DRF 中序列化程序中的保留字(来自)
- amazon-web-services - Docker 上下文不改变(docker 上下文使用)
- sql - 将 JSON 解析为 SQL 中的新行
- c# - 如何为 XSLT 代码片段配置 CruiseControl 的 C# 版本?