【问题标题】:Java - Maven - Reusing Entity layer at both client and server side projectsJava - Maven - 在客户端和服务器端项目中重用实体层
【发布时间】:2018-02-05 19:23:12
【问题描述】:

我正在开发一个 Spring Boot、Hibernate、Thymeleaf 项目,我对实现最佳架构以重用我的实体层感到有点困惑。

我有 2 个 Maven 父项目,我想通过创建一个 ProjectEntity(在两个父项目中重复使用它)来实现以下项目层次结构

  1. ProjectAPIParent

    a) 项目实体

    b) 项目库

    c) 项目API

  2. ProjectClientUIParent

    a) 项目实体

    b) ProjectClientUI

问题是一个子项目不能有多个父项目。

现在,我可以选择只创建一个基础父项目,但问题是它听起来不正确,因为我希望客户端和服务器端项目之间完全松散耦合。

在这种情况下你会建议我做什么?

您的意见很重要。谢谢:)

【问题讨论】:

  • ProjectEntity 设为库并在两者中使用它不是一种选择吗?
  • 将其作为一个库很难维护,因为每次更改此项目的代码后,我都必须为此项目单独运行 maven package 或 maven install 命令。
  • 我明白了,也许在这种情况下使用像 Jenkins 这样的工具可以帮助你。

标签: java spring maven spring-boot


【解决方案1】:

并没有真正的惯用规则来做出这种决定。

就个人而言,我选择与该项目表现出最强的自然所有权关系的项目作为工件的父级。

例如,如果ProjectEntity 源代码被设计为只能由ProjectAPIParent 项目的开发人员修改并发布,ProjectAPIParent 很可能是ProjectEntity 模块。而ProjectClientUIParent 应该使用ProjectEntity 作为依赖项。

但是,如果您无法清楚地确定与此工件有这种关系的父项目,您可能不应该将 ProjectEntity 设为它们都不是的子项目。
在这种情况下,让ProjectEntity 成为这两个项目的依赖项更有意义。


附带说明,无论您选择父 pom,您都可以在 ProjectAPIParentProjectClientUIParent 的聚合器 pom.xml 中将 ProjectEntity 定义为 Maven 模块(以免与 Maven 子级混淆)。

【讨论】:

  • 对我来说很有意义。等待更多答案,可能会改变我的看法。
  • 你是对的。其他意见可能很有趣。*
  • Re "source code is designed to be modified only by" – (通常的)构建如何修改源代码(除了资源过滤等)?跨度>
  • @Gerold Broser 你是对的。不清楚。 “ProjectAPIParent 项目的开发人员”更清楚。
  • 谢谢,非常感谢。
【解决方案2】:

您可以建立以下内容:

+- ApplicationParent
   +- APIParent
   |  +- ProjectAPI
   |  +- Repository
   +- ClientUIParent
   |  +- ClientUI
   +- Entity

ApplicationParentPOM:

<modules>
  <module>APIParent</module>
  <module>ClientUIParent</module>
</modules>

APIParentPOM:

<modules>
  <module>../Entity</module>
  <module>Repository</module>
  <module>ProjectAPI</module>
</modules>

ClientUIParentPOM:

<modules>
  <module>../Entity</module>
  <module>ClientUI</module>
</modules>

这样你可以:

  • 整体构建您的应用程序(通过ApplicationParent

  • 分别构建 APIParentClientUIParent

    当然,您必须注意APIParentClientUIParent 不要在本地同时单独构建。

  • ApplicationParent

    声明一次对所有人通用的东西(例如JUnit依赖)
  • 使用&lt;dependencyManagment&gt; 声明任何子项目中使用的所有依赖项的依赖项详细信息一次

  • 仅在各个 POM 中某些子项目所需的单独声明

【讨论】:

  • 您的回答很有趣,并且在我们想要集成到单个根中的模块中有意义。但是 OP 希望避免两个大项目之间的耦合:“现在,我可以选择只创建一个基础父项目,但问题是它听起来不正确,因为我希望客户端和客户端之间完全松散耦合服务器端项目。”
  • @davidxxx 我对松散耦合这个词的了解更多来自源代码本身及其相互依赖关系,而不是构建环境。但是,APIParentClientUIParent (非常)松散耦合。事实上,它们根本没有耦合。它们是单独的项目。他们都不知道对方的任何事情——构建方式(除了问题中未说明的可能依赖项)。唯一知道他们俩的是他们共同的父母ApplicationParent。应该是这样的,不是吗?
  • 我需要理解一个不清楚的事情。 ApplicationParent 模块既是聚合器又是父 pom 吗?正如您所说:“在ApplicationParent 中仅声明一次所有人共有的事物(例如JUnit)”,这意味着ApplicationParent 两者兼而有之。在这种情况下,它会产生更强的耦合。
  • @davidxxx 是的,两者都是(因此在其 POM 中使用了 &lt;modules&gt;)。我想我知道你的意思。您是否将其与例如Java的类层次结构,超类甚至不知道子类的存在?好吧,这不是开发环境,而是构建环境。如果聚合器 ApplicationParent 不知道它的组件,您将如何构建整个应用程序?
  • 谢谢,Gerold,我从您的回答中学到了很多。我投票赞成你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 2013-11-12
相关资源
最近更新 更多