本篇文章为你整理了Maven 聚合工程的创建(maven聚合工程打包)的详细内容,包含有maven项目 maven聚合工程打包 idea创建maven聚合工程 maven聚合和继承区别 Maven 聚合工程的创建,希望能帮助你了解 Maven 聚合工程的创建。
简单场景举例
聚合工程创建示例
说明:
创建 Maven Project:表示创建 maven 项目,new Project 方式创建
创建 Maven Module:表示创建 maven 项目,new Module 方式创建
创建 SpringBoot Module:表示创建 SpringBoot 项目,new Module 方式创建
注意:各个子工程的包名要保持一致
创建 Maven Project,命名 parent-project,删除 src 目录,pom 中添加 packing 标签,指定打包类型为 pom,此项目作为父工程,不写代码,做依赖管理。
在父工程 parent-project 下,创建 Maven Module,命名 common-project,此项目作为公共工程,写那些可复用的代码功能,打包安装后供其他子工程模块复用。
说明:在公共工程中书写代码后,使用侧边栏 maven 管理 Lifecycle 中 install 命令进行打包安装,在其他子工程中直接添加该公共工程的依赖即可复用其中的代码功能。
在父工程 parent-project 下,创建 SpringBoot Module,命名 a-project,此项目作为子工程,写功能代码,同时,可复用公共工程 common-project。(子模块 pom 中添加公共模块依赖坐标即可在工程中复用功能代码)
说明:
创建 SpringBoot 项目时,项目 pom 中可能会有指向 spring-boot-starter-parent 的父依赖存在,也可能没有。
详细参考:https://blog.51cto.com/u_15692960/5405687
子工程 pom 整理说明:
如果创建的子工程有 parent 标签且继承的是 spring-boot-starter-parent,则直接将其剪切到父工程中;
parent
groupId org.springframework.boot /groupId
artifactId spring-boot-starter-parent /artifactId
version 2.6.6 /version
/parent
如果创建的子工程没有 parent 标签继承的 spring-boot-starter-parent,则代表项目本身已做相关配置,不需要该父依赖,不需要做其他处理,此步骤忽略!
注意:有无 parent 标签可能是 SpringBoot 项目创建的方式不同(国内和国外方式)
将 common-project 中 parent 标签(含父工程坐标)复制一份到本子工程中【也就是添加父依赖,继承父工程】
将子工程中公共的配置挪到父工程中,如需要交给父工程管理的依赖、一些 properties 以及 build 等公共配置
以下展示聚合工程各工程模块中 pom 示例:
【实际开发,接口应用子工程创建一个 SpringBoot 项目即可,其他公共子工程皆使用 maven 创建】
目录总览:(实际开发应该是父工程下多个公共工程,一个应用接口启动工程)
parent-project:父工程
common-project:公共工程
a-project:子工程 a
b-project:子工程 b
c-project:子工程 c
parent-project 的 pom.xml:
?xml version="1.0" encoding="UTF-8"?
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.0 /modelVersion
!-- 有教程有,有教程没有,看是否能正常启动再决定是否添加 --
!-- parent --
!-- groupId org.springframework.boot /groupId --
!-- artifactId spring-boot-starter-parent /artifactId --
!-- version 2.6.6 /version --
!-- /parent --
!-- 父工程坐标 --
groupId com.luis /groupId
artifactId parent-project /artifactId
version 1.0.0 /version
!-- 必须 --
packaging pom /packaging
!-- 子模块 --
modules
module common-project /module
module a-project /module
module b-project /module
module c-project /module
/modules
!-- 设置相关属性 --
properties
java.version 1.8 /java.version
project.build.sourceEncoding UTF-8 /project.build.sourceEncoding
project.reporting.outputEncoding UTF-8 /project.reporting.outputEncoding
spring-boot.version 2.3.7.RELEASE /spring-boot.version
/properties
!-- 公共依赖 --
dependencies
dependency
groupId org.springframework.boot /groupId
artifactId spring-boot-starter-web /artifactId
/dependency
dependency
groupId org.projectlombok /groupId
artifactId lombok /artifactId
optional true /optional
/dependency
dependency
groupId org.springframework.boot /groupId
artifactId spring-boot-starter-test /artifactId
scope test /scope
exclusions
exclusion
groupId org.junit.vintage /groupId
artifactId junit-vintage-engine /artifactId
/exclusion
/exclusions
/dependency
/dependencies
!-- 依赖管理,配置对应 jar 包版本--
dependencyManagement
dependencies
dependency
groupId org.springframework.boot /groupId
artifactId spring-boot-dependencies /artifactId
version ${spring-boot.version} /version
type pom /type
scope import /scope
/dependency
/dependencies
/dependencyManagement
!-- 相关插件 --
build
plugins
plugin
groupId org.apache.maven.plugins /groupId
artifactId maven-compiler-plugin /artifactId
version 3.8.1 /version
configuration
source 1.8 /source
target 1.8 /target
encoding UTF-8 /encoding
/configuration
/plugin
plugin
groupId org.springframework.boot /groupId
artifactId spring-boot-maven-plugin /artifactId
version 2.3.7.RELEASE /version
configuration
mainClass com.luis.AProjectApplication /mainClass
/configuration
executions
execution
id repackage /id
goals
goal repackage /goal
/goals
/execution
/executions
/plugin
/plugins
/build
/project
common-project 的 pom.xml:
?xml version="1.0" encoding="UTF-8"?
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 parent-project /artifactId
groupId com.luis /groupId
version 1.0.0 /version
/parent
modelVersion 4.0.0 /modelVersion
artifactId common-project /artifactId
/project
a-project 的 pom.xml:
?xml version="1.0" encoding="UTF-8"?
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 https://maven.apache.org/xsd/maven-4.0.0.xsd"
!-- 继承父工程 --
parent
artifactId parent-project /artifactId
groupId com.luis /groupId
version 1.0.0 /version
/parent
modelVersion 4.0.0 /modelVersion
artifactId a-project /artifactId
dependencies
!-- common-project 依赖--
dependency
groupId com.luis /groupId
artifactId common-project /artifactId
version 1.0.0 /version
/dependency
/dependencies
/project
b-project 的 pom.xml:
?xml version="1.0" encoding="UTF-8"?
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 https://maven.apache.org/xsd/maven-4.0.0.xsd"
!-- 继承父工程 --
parent
artifactId parent-project /artifactId
groupId com.luis /groupId
version 1.0.0 /version
/parent
modelVersion 4.0.0 /modelVersion
artifactId b-project /artifactId
dependencies
!-- common-project 依赖--
dependency
groupId com.luis /groupId
artifactId common-project /artifactId
version 1.0.0 /version
/dependency
/dependencies
/project
c-project 的 pom.xml:
?xml version="1.0" encoding="UTF-8"?
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 https://maven.apache.org/xsd/maven-4.0.0.xsd"
!-- 继承父工程 --
parent
artifactId parent-project /artifactId
groupId com.luis /groupId
version 1.0.0 /version
/parent
modelVersion 4.0.0 /modelVersion
artifactId c-project /artifactId
dependencies
!-- common-project 依赖--
dependency
groupId com.luis /groupId
artifactId common-project /artifactId
version 1.0.0 /version
/dependency
/dependencies
/project
在父工程 pom 的 dependencies 标签中添加的依赖,在其所有子工程中都有,而且和父工程依赖的版本完全一致。
在父工程 pom 的 dependencyManagement 标签中添加的依赖,子工程中默认是没有的。
但是,如果子工程中需要使用,则直接在其 dependencies 标签中添加即可,此时可不指定版本号,默认使用的是父类中指定的版本号。
若子工程不想使用父类中指定的版本号,则自己需要明确指定所用依赖的版本号。
父工程的标志:pom 中存在 modules 和 packing 标签,且 packaging 标签中打包类型必须为 pom。
dependencyManagement 组件用来申明依赖,但不导入;dependencies 组件用于导入依赖
子项目不会继承 dependencyManagement 组件中声明的依赖,但如果子项目想导入某个父 pom 中 dependencyManagement 中的依赖,只需要填写 groupId 和 artifactId,不需要填写版本号,maven 会自动去父 pom 的 dependencyManagement 中找对应的 version,包括scope、exclusions 等
fmmall 聚合工程项目各模块以及依赖管理一览图:
项目模块目录:
父工程模块:fmmal
子工程模块:common、beans、mapper、service、api
注意:以上所有工程模块,除 api 是创建的 SpringBoot 项目,其他模块都是创建的 maven 项目。
聚合工程中的子工程,除了接口工程(需要启动运行)需要创建为 SpringBoot 工程外,其他工程一般创建为 maven 工程,为接口工程提供复用服务。(如 common、beans、mapper、service 等此类工程)
依赖配置说明
所有子工程都要求有的依赖:在父工程 pom 的 dependencies 公共依赖中添加
多个子工程需要相同的依赖:在父工程 pom 的 dependencyManagement 依赖管理中添加,然后在需要依赖的子工程中自行添加(不用指定版本号),让父工程做统一的依赖版本管理
子工程单独需要的依赖:则直接在其 pom 中自行添加即可
关于聚合工程 install 问题
因为是聚合工程,所以一定存在工程之间互相依赖;而被依赖的工程通常是需要打包后才可供给其他工程使用的。
在开发环境中,虽然我们直接运行启动类也可正常调用相关代码服务,但是我们一般会先将父工程 install一下,保证所有子工程都可正常打包后,再运行接口启动类运行项目。
基于以上说明,如果父工程 install 出现问题,如提示“程序包xxx不存在,找不到符号”,可参考以下解决办法:
原因分析:
项目 build 过程出现问题,个人估计一般这种情况就是依赖问题,pom.xml 中导入有问题,有可能是 springboot 自身的编译插件 spring-boot-maven-plugin 导致的。
build
plugins
plugin
groupId org.springframework.boot /groupId
artifactId spring-boot-maven-plugin /artifactId
/plugin
/plugins
/build
解决方案:
不要将此插件放到顶级父工程中,在需要打成可执行 jar 的地方添加就好,如果是需要被依赖的,就不要添加此插件!
分析:结合此聚合案例,我们需要将此插件放到 api 接口工程中,它不是顶级工程,它不需要被依赖,它需要打成可执行 jar!
install 相关,关于包明明存在,却出现编译错误:程序包不存在的问题,详细可参考:点击查看原博文
聚合工程各 pom.xml 示例
ffmall 父工程的 pom.xml
?xml version="1.0" encoding="UTF-8"?
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.0 /modelVersion
!-- 看情况添加 --
!-- parent --
!-- groupId org.springframework.boot /groupId --
!-- artifactId spring-boot-starter-parent /artifactId --
!-- version 2.6.6 /version --
!-- /parent --
!-- 父工程坐标 --
groupId com.luis /groupId
artifactId fmmall /artifactId
version 2.0.1 /version
!-- 打包类型为pom,必须!--
packaging pom /packaging
!-- 子模块 --
modules
module common /module
module beans /module
module mapper /module
module service /module
module api /module
/modules
!-- 设置相关属性 --
properties
java.version 1.8 /java.version
project.build.sourceEncoding UTF-8 /project.build.sourceEncoding
project.reporting.outputEncoding UTF-8 /project.reporting.outputEncoding
spring-boot.version 2.3.7.RELEASE /spring-boot.version
/properties
!-- 公共依赖 --
dependencies
dependency
groupId org.projectlombok /groupId
artifactId lombok /artifactId
optional true /optional
/dependency
!-- dependency --
!-- groupId org.springframework.boot /groupId --
!-- artifactId spring-boot-starter-test /artifactId --
!-- scope test /scope --
!-- exclusions --
!-- exclusion --
!-- groupId org.junit.vintage /groupId --
!-- artifactId junit-vintage-engine /artifactId --
!-- /exclusion --
!-- /exclusions --
!-- /dependency --
/dependencies
!-- 依赖管理,配置对应 jar 包版本--
dependencyManagement
dependencies
dependency
groupId org.springframework.boot /groupId
artifactId spring-boot-dependencies /artifactId
version ${spring-boot.version} /version
type pom /type
scope import /scope
/dependency
/dependencies
/dependencyManagement
!--不要将此插件放到顶级父工程中,在需要打成可执行jar的地方添加就好了,如果是需要被依赖的,就不要添加此插件--
!-- build --
!-- plugins --
!-- plugin --
!-- groupId org.apache.maven.plugins /groupId --
!-- artifactId maven-compiler-plugin /artifactId --
!-- version 3.8.1 /version --
!-- configuration --
!-- source 1.8 /source --
!-- target 1.8 /target --
!-- encoding UTF-8 /encoding --
!-- /configuration --
!-- /plugin --
!-- plugin --
!-- groupId org.springframework.boot /groupId --
!-- artifactId spring-boot-maven-plugin /artifactId --
!-- version 2.3.7.RELEASE /version --
!-- configuration --
!-- mainClass com.luis.fmmall.ApiApplication /mainClass --
!-- /configuration --
!-- executions --
!-- execution --
!-- id repackage /id --
!-- goals --
!-- goal repackage /goal --
!-- /goals --
!-- /execution --
!-- /executions --
!-- /plugin --
!-- /plugins --
!-- /build --
/project
common 子工程的 pom.xml
?xml version="1.0" encoding="UTF-8"?
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 fmmall /artifactId
groupId com.luis /groupId
version 2.0.1 /version
/parent
modelVersion 4.0.0 /modelVersion
artifactId common /artifactId
!-- 不指定默认也是 jar --
packaging jar /packaging
/project
beans 子工程的 pom.xml
?xml version="1.0" encoding="UTF-8"?
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 fmmall /artifactId
groupId com.luis /groupId
version 2.0.1 /version
/parent
modelVersion 4.0.0 /modelVersion
artifactId beans /artifactId
!-- 不指定默认也是 jar --
packaging jar /packaging
/project
mapper 子工程的 pom
?xml version="1.0" encoding="UTF-8"?
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 fmmall /artifactId
groupId com.luis /groupId
version 2.0.1 /version
/parent
modelVersion 4.0.0 /modelVersion
artifactId mapper /artifactId
!-- 不指定默认也是 jar --
!-- packaging jar /packaging --
dependencies
!-- beans --
dependency
groupId com.luis /groupId
artifactId beans /artifactId
version 2.0.1 /version
/dependency
!-- mysql --
dependency
groupId mysql /groupId
artifactId mysql-connector-java /artifactId
version 5.1.47 /version
/dependency
!-- mybatis--
dependency
groupId org.mybatis.spring.boot /groupId
artifactId mybatis-spring-boot-starter /artifactId
version 2.1.4 /version
/dependency
!-- spring-boot-starter --
dependency
groupId org.springframework.boot /groupId
artifactId spring-boot-starter /artifactId
version 2.4.4 /version
/dependency
!-- druid --
dependency
groupId com.alibaba /groupId
artifactId druid-spring-boot-starter /artifactId
version 1.2.9 /version
/dependency
!-- test --
dependency
groupId org.springframework.boot /groupId
artifactId spring-boot-starter-test /artifactId
version 2.4.4 /version
/dependency
!-- junit 单元测试--
dependency
groupId junit /groupId
artifactId junit /artifactId
scope test /scope
/dependency
/dependencies
/project
service 子工程的 pom
?xml version="1.0" encoding="UTF-8"?
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 fmmall /artifactId
groupId com.luis /groupId
version 2.0.1 /version
/parent
modelVersion 4.0.0 /modelVersion
artifactId service /artifactId
!-- 不指定默认也是 jar --
!-- packaging jar /packaging --
dependencies
!-- mapper --
dependency
groupId com.luis /groupId
artifactId mapper /artifactId
version 2.0.1 /version
/dependency
!-- common 需要用到 vo,utils,封装数据传参到前端以及工具类 --
dependency
groupId com.luis /groupId
artifactId common /artifactId
version 2.0.1 /version
/dependency
/dependencies
/project
api 子工程的 pom
?xml version="1.0" encoding="UTF-8"?
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
https://maven.apache.org/xsd/maven-4.0.0.xsd"
!-- 父工程信息 --
parent
groupId com.luis /groupId
artifactId fmmall /artifactId
version 2.0.1 /version
/parent
modelVersion 4.0.0 /modelVersion
artifactId api /artifactId
!-- 依赖配置 --
dependencies
!-- service --
dependency
groupId com.luis /groupId
artifactId service /artifactId
version 2.0.1 /version
/dependency
dependency
groupId org.springframework.boot /groupId
artifactId spring-boot-starter-web /artifactId
/dependency
/dependencies
!--不要将此插件放到顶级父工程中,在需要打成可执行jar的地方添加就好了,如果是需要被依赖的,就不要添加此插件--
build
plugins
plugin
groupId org.apache.maven.plugins /groupId
artifactId maven-compiler-plugin /artifactId
version 3.8.1 /version
configuration
source 1.8 /source
target 1.8 /target
encoding UTF-8 /encoding
/configuration
/plugin
plugin
groupId org.springframework.boot /groupId
artifactId spring-boot-maven-plugin /artifactId
version 2.3.7.RELEASE /version
configuration
mainClass com.luis.fmmall.ApiApplication /mainClass
/configuration
executions
execution
id repackage /id
goals
goal repackage /goal
/goals
/execution
/executions
/plugin
/plugins
/build
/project
以上就是Maven 聚合工程的创建(maven聚合工程打包)的详细内容,想要了解更多 Maven 聚合工程的创建的内容,请持续关注盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。