Maven 聚合工程的创建(maven聚合工程打包)

  本篇文章为你整理了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: