Java-Maven-在客户端和服务器端项目中重用实体层
我正在从事一个Spring Boot、Hibernate、Thymeleaf项目,我对实现重用实体层的最佳体系结构感到有点困惑 我有两个Maven父项目,我想通过创建一个ProjectEntity(在两个父项目中重用它)来实现下面的项目层次结构Java-Maven-在客户端和服务器端项目中重用实体层,java,spring,maven,spring-boot,Java,Spring,Maven,Spring Boot,我正在从事一个Spring Boot、Hibernate、Thymeleaf项目,我对实现重用实体层的最佳体系结构感到有点困惑 我有两个Maven父项目,我想通过创建一个ProjectEntity(在两个父项目中重用它)来实现下面的项目层次结构 项目家长 a) 项目实体 b) 项目存储库 c) ProjectAPI ProjectClientUIParent a) 项目实体 b) ProjectClientUI 问题是一个子项目不能有多个父项目 现在,我可以选择只创建一个基本父项目,但问题是它听
你的意见很重要。谢谢:)做出这样的决定并没有一个惯用的规则 就我个人而言,我选择了一个人工制品的父项目,该项目体现了与客户最强烈的自然所有权关系 例如,如果
ProjectEntity
源代码设计为仅由projectapipradent
项目的开发人员修改并与一起发布,projectapipradent
很可能是ProjectEntity
模块的Maven父级(及其聚合器pom)。而ProjectClientUIParent
也应该使用ProjectEntity
作为依赖项
但是,如果您无法清楚地识别与此工件具有这种关系的父项目,那么您可能不应该将ProjectEntity
作为它们的子项目。在这种情况下,将
ProjectEntity
作为这两个项目的依赖项更有意义
作为旁注,无论您对父pom的选择如何,您都可以在
projectapiporent
和ProjectClientUIParent
的aggregator pom.xml中将ProjectEntity
定义为Maven模块(以避免与Maven子模块混淆),您可以建立以下内容:
+- ApplicationParent
+- APIParent
| +- ProjectAPI
| +- Repository
+- ClientUIParent
| +- ClientUI
+- Entity
ApplicationParent
POM:
<modules>
<module>APIParent</module>
<module>ClientUIParent</module>
</modules>
<modules>
<module>../Entity</module>
<module>Repository</module>
<module>ProjectAPI</module>
</modules>
<modules>
<module>../Entity</module>
<module>ClientUI</module>
</modules>
ClientUIParent
POM:
<modules>
<module>APIParent</module>
<module>ClientUIParent</module>
</modules>
<modules>
<module>../Entity</module>
<module>Repository</module>
<module>ProjectAPI</module>
</modules>
<modules>
<module>../Entity</module>
<module>ClientUI</module>
</modules>
../实体
客户端
你可以:
- 作为一个整体构建应用程序(通过
)ApplicationParent
- 分别构建
和apiporent
当然,您必须注意,ClientUIParent
和APIParent
不能在本地同时单独构建ClientUIParent
- 在
ApplicationParent
- 用于为任何子项目中使用的所有依赖项声明一次依赖项详细信息
- 某些子项目仅在各个POM中需要单独声明
ProjectEntity
成为一个库并在两者中都使用它不是一个选项?使其成为一个库很难维护,因为每次更改此项目的代码后,我都必须为该项目单独运行maven package或maven install命令。我明白了,也许使用像詹金斯这样的工具可以帮助你。对我来说是有意义的。等待更多的答案,也许这会改变我的看法。你是对的。其他观点可能会很有趣。*Re“源代码设计为仅通过”–一个(通常)构建如何修改源代码(除了资源过滤或类似的内容)?@Gerold Broser你是对的。现在还不清楚。“由projectAPRIPARENT
project的开发人员编写”更清楚。谢谢,非常感谢。您的回答很有趣,对于我们希望集成到单个根目录中的模块很有意义。但OP希望避免两个大项目之间的耦合:“现在,我可以选择只创建一个基本父项目,但问题是这听起来不正确,因为我希望客户端和服务器端项目之间完全松散耦合。”@davidxxx我更多地从源代码本身及其相互依赖性而不是从构建环境中了解松耦合这个术语。但是,APIParent
和ClientUIParent
是(非常)松散耦合的。事实上,它们根本不耦合。它们是单独的项目。他们中没有一个人知道关于其他人的任何事情——构建方面(除了问题中没有说明的可能的依赖项)。只有他们的共同父级ApplicationParent
知道这两个。应该是这样的,不是吗?我需要理解一件不清楚的事情。ApplicationParent
模块既是聚合器又是父pom吗?正如您所说:“只需在ApplicationParent
中声明一次对所有人(例如JUnit)通用的东西”,这意味着ApplicationParent
两者都是。在这种情况下,它会产生更强的耦合。@davidxxx是的,两者都有(因此POM中的
)。我想我知道你的意思。您是否将其与Java的类层次结构进行比较,在Java的类层次结构中,超类甚至不知道子类的存在?这不是一个开发环境,而是一个构建环境。如果聚合器ApplicationParent
不知道应用程序的组件,那么您如何构建整个应用程序?谢谢,Gerold,我从您的回答中学到了很多。我赞成你的答案。