标签用于父子工程项目,什么是父子工程?
顾名思义,maven父子项目是一个有一个父项目,父项目下面又有很多子项目的maven工程,当然,子项目下面还可以添加子项目,从而形成一个树形的结构。那么,这么做有什么好处呢?有以下两点:
父工程package 需要指定pom
子工程需要声明parent,否则无法使用父pom的依赖
标签导入依赖
和dependencyManagement 一起出现,指定的版本优先级更高,通常出现在父pom
&
区别通常parent用于做结构管理,声明子工程继承父工程的
A依赖B C继承B
标签版本控制,只声明版本,不进行依赖导入
标签执定子工程,如果不指定,不能识别子工程
子项目的版本优先更高
子项目 dependency
子项目 dependencyManagement
父项目 dependency
父项目 dependencyManagement
如果出现同一个pom,多个不同版本的相同依赖,最下方优先级最高
最外层的pom.xml
即为父工程,一般用于控制子工程版本
父pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>cn.wolfcodegroupId>
<artifactId>caro2oartifactId>
<version>3.8.3version>
<name>caro2oname>
<url>http://www.ruoyi.vipurl>
<description>e店邦o2o平台管理系统description>
<properties>
<caro2o.version>3.8.3caro2o.version>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<java.version>1.8java.version>
<maven-jar-plugin.version>3.1.1maven-jar-plugin.version>
<druid.version>1.2.11druid.version>
<bitwalker.version>1.21bitwalker.version>
<swagger.version>3.0.0swagger.version>
<kaptcha.version>2.3.2kaptcha.version>
<mybatis-spring-boot.version>2.2.2mybatis-spring-boot.version>
<pagehelper.boot.version>1.4.1pagehelper.boot.version>
<fastjson.version>2.0.8fastjson.version>
<oshi.version>6.1.6oshi.version>
<commons.io.version>2.11.0commons.io.version>
<commons.fileupload.version>1.4commons.fileupload.version>
<commons.collections.version>3.2.2commons.collections.version>
<poi.version>4.1.2poi.version>
<velocity.version>2.3velocity.version>
<jwt.version>0.9.1jwt.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>2.5.14version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druid-spring-boot-starterartifactId>
<version>${druid.version}version>
dependency>
<dependency>
<groupId>eu.bitwalkergroupId>
<artifactId>UserAgentUtilsartifactId>
<version>${bitwalker.version}version>
dependency>
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>${mybatis-spring-boot.version}version>
dependency>
<dependency>
<groupId>com.github.pagehelpergroupId>
<artifactId>pagehelper-spring-boot-starterartifactId>
<version>${pagehelper.boot.version}version>
dependency>
<dependency>
<groupId>com.github.oshigroupId>
<artifactId>oshi-coreartifactId>
<version>${oshi.version}version>
dependency>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-boot-starterartifactId>
<version>${swagger.version}version>
<exclusions>
<exclusion>
<groupId>io.swaggergroupId>
<artifactId>swagger-modelsartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>commons-iogroupId>
<artifactId>commons-ioartifactId>
<version>${commons.io.version}version>
dependency>
<dependency>
<groupId>commons-fileuploadgroupId>
<artifactId>commons-fileuploadartifactId>
<version>${commons.fileupload.version}version>
dependency>
<dependency>
<groupId>org.apache.poigroupId>
<artifactId>poi-ooxmlartifactId>
<version>${poi.version}version>
dependency>
<dependency>
<groupId>org.apache.velocitygroupId>
<artifactId>velocity-engine-coreartifactId>
<version>${velocity.version}version>
dependency>
<dependency>
<groupId>commons-collectionsgroupId>
<artifactId>commons-collectionsartifactId>
<version>${commons.collections.version}version>
dependency>
<dependency>
<groupId>com.alibaba.fastjson2groupId>
<artifactId>fastjson2artifactId>
<version>${fastjson.version}version>
dependency>
<dependency>
<groupId>io.jsonwebtokengroupId>
<artifactId>jjwtartifactId>
<version>${jwt.version}version>
dependency>
<dependency>
<groupId>com.github.pengglegroupId>
<artifactId>kaptchaartifactId>
<version>${kaptcha.version}version>
dependency>
<dependency>
<groupId>cn.wolfcodegroupId>
<artifactId>caro2o-quartzartifactId>
<version>${caro2o.version}version>
dependency>
<dependency>
<groupId>cn.wolfcodegroupId>
<artifactId>caro2o-generatorartifactId>
<version>${caro2o.version}version>
dependency>
<dependency>
<groupId>cn.wolfcodegroupId>
<artifactId>caro2o-frameworkartifactId>
<version>${caro2o.version}version>
dependency>
<dependency>
<groupId>cn.wolfcodegroupId>
<artifactId>caro2o-systemartifactId>
<version>${caro2o.version}version>
dependency>
<dependency>
<groupId>cn.wolfcodegroupId>
<artifactId>caro2o-commonartifactId>
<version>${caro2o.version}version>
dependency>
<dependency>
<groupId>cn.wolfcodegroupId>
<artifactId>caro2o-businessartifactId>
<version>${caro2o.version}version>
dependency>
dependencies>
dependencyManagement>
<modules>
<module>caro2o-adminmodule>
<module>caro2o-frameworkmodule>
<module>caro2o-systemmodule>
<module>caro2o-quartzmodule>
<module>caro2o-generatormodule>
<module>caro2o-commonmodule>
<module>caro2o-businessmodule>
modules>
<packaging>pompackaging>
<dependencies>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.1version>
<configuration>
<source>${java.version}source>
<target>${java.version}target>
<encoding>${project.build.sourceEncoding}encoding>
configuration>
plugin>
plugins>
build>
<repositories>
<repository>
<id>publicid>
<name>aliyun nexusname>
<url>https://maven.aliyun.com/repository/publicurl>
<releases>
<enabled>trueenabled>
releases>
repository>
repositories>
<pluginRepositories>
<pluginRepository>
<id>publicid>
<name>aliyun nexusname>
<url>https://maven.aliyun.com/repository/publicurl>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>falseenabled>
snapshots>
pluginRepository>
pluginRepositories>
project>
子项目迭代时一般是以相同版本迭代,所以用
来统一控制版本
写在
标签中的依赖为子项目可选择加载的依赖,若某子项目要加载该依赖则在自己的pom.xml中的dependencies里添加即可,不用再写版本号version,因为都交由父项目统一管理了,而这就避免了不同子项目引用相同依赖时因版本不同而产生冲突的问题。
写在
标签中的依赖为子项目必须加载的依赖,下略。
服务启动入口子项目caro2o-admin
的pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>caro2oartifactId>
<groupId>cn.wolfcodegroupId>
<version>3.8.3version>
parent>
<modelVersion>4.0.0modelVersion>
<packaging>jarpackaging>
<artifactId>caro2o-adminartifactId>
<description>
web服务入口
description>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-boot-starterartifactId>
dependency>
<dependency>
<groupId>io.swaggergroupId>
<artifactId>swagger-modelsartifactId>
<version>1.6.2version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
<dependency>
<groupId>cn.wolfcodegroupId>
<artifactId>caro2o-frameworkartifactId>
dependency>
<dependency>
<groupId>cn.wolfcodegroupId>
<artifactId>caro2o-quartzartifactId>
dependency>
<dependency>
<groupId>cn.wolfcodegroupId>
<artifactId>caro2o-generatorartifactId>
dependency>
<dependency>
<groupId>cn.wolfcodegroupId>
<artifactId>caro2o-businessartifactId>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<version>2.1.1.RELEASEversion>
<configuration>
<fork>truefork>
configuration>
<executions>
<execution>
<goals>
<goal>repackagegoal>
goals>
execution>
executions>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-war-pluginartifactId>
<version>3.1.0version>
<configuration>
<failOnMissingWebXml>falsefailOnMissingWebXml>
<warName>${project.artifactId}warName>
configuration>
plugin>
plugins>
<finalName>${project.artifactId}finalName>
build>
project>
比如该用若依框架搭建的demo项目,我要新增一个名为caro2o-business
的业务子项目,则需要将该业务子项目作为模块依赖添加到服务启动入口子项目caro2o-admin
的pom.xml里,否则服务启动后admin没加载到business模块内的代码,就会出现404或500等一系列错误。
然后在业务子项目的pom.xml里添加工具子项目等不同模块的依赖,如:
因为父项目已经控制版本号了,所以这里可以不用再写version。在图中的情况,若整个项目整体迭代而在父项目的pom.xml中升级更改了统一版本号,则会有报错的可能,因为Maven中首先取的是子项目自己pom.xml里的依赖版本号,就会导致引用caro2o-system
时和别的子项目版本出现冲突。
maven项目的groupId和artifactId什么意思?
首先要知道groupId和artifactId的存在是为了定位到你的项目,所以它们充当着坐标的角色。
groupId:group意思为组,所以理解为是组织Id,也是公司Id,通常它的写法与公司域名类似。一般分三段,即“域.公司名称.子项目”,域指org、com、cn
等,类似计算机网络里学过的,cn指china,com商业,org非盈利组织。
artifactId:即一个具体的项目,命名方式自己决定。
举个某马大型商城项目结构为例,该项目采用了微服务架构,所以使用了聚合方式,即一个大项目下几个小项目(这样是为了便于版本管理):
例如:
< groupId>com.leyou.parent< /groupId>,其中com为商业标识,leyou为这个乐优商城项目的公司名称,parent是项目名称,但是因为这个项目采用了聚合方式,下面还有许多项目,这个作为最顶层容器,所以起名parent。 < artifactId>leyou artifactId >代表这个项目的总名称为leyou。
其下面的子项目命名为 < groupId>com.leyou.user groupId>,前两段域和公司名都相同,只是项目那儿放的这个具体的子项目名称。
< artifactId>leyou-user< /artifactId>使用的leyou-user表示该项目是leyou项目下的user子项目,这种方式结构清晰易懂。
采用这种命名后,项目内部结构通常要相对应。
例如:
这个项目是大项目下每个项目作为一个单独的服务,对于那些可能被其他服务调用的服务,可以再拆分为两个,例如,这里子项目leyou-item因为为被其他服务调用,所以又才分为了interface和service两个子项目,interface对外提供服务调用,service作具体的业务操作。