基建项目POM结构
2022-08-30 19:55:32 0 举报
AI智能生成
maven项目整体架构
作者其他创作
大纲/内容
parent
无
properties
java.version等一些Maven内部的属性
pom管理的所有依赖包的版本都应该定义为properties,参考spring的顶层pom
modules
顶层pom,最好不要使用modules,modules一般用于打包时,会把子模块一起打包,一般适用于项目级别组件级别的顶层pom。而像spring或者是我们自己封装的顶层pom,这类pom一般用来对依赖的包的声明(避免冲突),定义打包环境,maven仓库等配置,对其来说,其对其下的所有子模块都应该是无感的,故不应该去配置modules。且如果配置modules的话,每次对pom的重新发布都需要保证子模块也在工作空间才行,而顶部pom应该是独立于所有子模块的。
profiles
用于打包时,区分不同的环境,一般来说这里我们会区分开发,测试,生产环境,不同的环境有不同的构建方式,不同的依赖,都可以在这里面进行配置。
build
profiles中会写明不同的环境下的不同构建方式,build中一般定义任何环境都需要的构建配置。毕竟在各个环境中都重复配置一遍是不优雅的。一般来说这部分我们可以沿用springboot的构建方式或者maven默认的构建方式。
dependencies
顶层pom最好不要使用dependencies,否者会导致所有的子模块都依赖dependencies中定义的jar包,会导致子模块依赖到一些完全没有用到的jar包,使项目变的臃肿。我们来思考一下这样设计的出发点,显然是因为大多数的子模块都依赖到了这些包,子模块不想在自己的pom中去重复写一遍这些依赖了。事实上这种场景我们是有更好的方式去解决的。即收集某种使用广泛的场景下所需要依赖的所有包,再单独定义一个pom依赖所有这些包。这样如果某些子模块引用到了这个场景,那么只需要依赖这一个pom即可。这种业务场景的概念是略大于组件概念的,需要根据公司的技术选型进行个性化定制,一般囊括了多个开源组件,如springboot+mybatis+springmvc+日志这就是一个典型的场景。
dependencyManagement
用于管理项目中可能用到的所有依赖,保证各个依赖之间是兼容的。值的注意的是,dependencyManagement仅仅是声明依赖,子模块需要用到某个依赖的时候,还是需要自己去引用,规范来说子模块中不需要也不允许定义明确的版本。dependencyManagement中已经声明了版本,只要子模块中依赖的包在dependencyManagement中存在就会沿用其版本。只有这样dependencyManagement解决各依赖包之间冲突的意义才能体现。
进阶:当依赖的包足够多的时候,因为maven只支持单继承,其导致的问题就是,当子模块足够多的情况下,顶层pom可能需要依赖大量的jar包,且这些jar包互相之间没有做边界管理的,即所有的jar包混在一起了。maven提供了scope:imort的模式,可以对pom文件的依赖进行拆分。其作用其实和dependencies中我们提供的按场景拆分思路相同,但效果上有区别。上面提到的是使用scope:pom,依赖这个pom就会把其内的所有依赖都依赖到项目中。而scope:imort仅仅是对其内的依赖进行声明。
延续上面第二点来讲,如果使用scope:import的话,其拆分场景可能就不是按业务场景进行拆分了。因为如果需要某个业务场景,那么该业务场景相关的包都依赖进来是合理的。但如果使用scope:import还按业务场景进行拆分的话,那么仅仅是对该业务场景所需要的包进行了一次全量的声明,子模块还需要自己引用一遍,这样拆分的话意义就不大了。所以scope:import一般用于管理同样功能的组件(可选型),如所有的日志框架的管理我们可以定义一个pom进行统一声明。最终子模块只会用到其内的一个实现依赖,这时候其作用就体现在了同类型组件的统一管理上了。
pluginManagement
统一定义好打包,编译,部署,测试等各个阶段的插件,子模块都可以继承这些插件的功能。
repositories
定义了从哪个库地址下载项目依赖的库文件,注意repositories不仅仅是pom中生效,其是和本地的setting.xml文件(用户级别 系统级别)共同生效的,他们会做合并覆盖(同id覆盖),pom中定义的优先级最高。一般来说在公司级别的pom,在这里定义一下公司的私人仓库地址,是合适的。但如果作为一个开源的组件,这里就无需做这种配置了。
distributionManagement
定义了deploy时,包往哪个仓库发布。其生效规则和repositories一样。其使用场景也是repositories一样。对于公司级别的顶层pom,定义出distributionManagement是合适和合理的。
进阶
参考spirngboot的POM的设计
静态配置层(最顶层)
主要用来声明所有的依赖
properties
依赖的jar包的版本号,全部以properties的形式进行定义
dependencyManagement
pluginManagement
就是定依赖的插件进行声明,未使用
动态配置层(第二层)
主要定义一些动作,操作,打包时需要的配置
properties
编译jdk版本,编码,字符编码等
build
如何打包的动作
pluginManagement
插件的使用
子模块使用规范
不要显示声明任何依赖的版本
用到什么包,就依赖什么包,不要打包依赖
除非特殊情况,无需自己定义打包插件,构建方式
收藏
收藏
0 条评论
下一页