java工程拆分_Java第四十五天,Maven高级篇(二),工程拆分与聚合

本文详细介绍了Java项目中如何通过Maven进行工程拆分与聚合,旨在解决代码重复和系统拓展性的问题。内容包括Maven解决传统项目问题的思路,拆分与聚合的实现方法,以及实战步骤,最后讨论了依赖范围、子模块与父工程的关系以及启动方式。
摘要由CSDN通过智能技术生成

一、传统项目的漏洞分析

1.问题引出

假如有一个商城;买家用的A系统,卖家用的B系统;但是买家和卖家有很多业务是重合的,比如都需要查询每个订单消息;那么同样的代码需要写两份吗?如果更多子系统呢?

2.问题分析

我们分析一下 Maven 出现的一个重要原因,就是为了共用代码,共用jar包;那么同样的现象出现在了两套体系中:

jar 包 <===> jar 包中央仓库

拓展系统(子系统) <===> 公共系统(父系统)

3.茅塞顿开

那么,我们可以把 公共系统 当成 jar包中央仓库,把拓展系统当成 jar 包吗?当然可以,都是代码而已,都有唯一标识!

二、Maven 的解决办法

1.拆分

Maven 把一个完整的项目,分成不同的独立模块,这些模块都有各自独立的坐标,哪个地方需要其中某个模块,就直接引用该模块的坐标即可

2.聚合

Maven 在 “模块仓库” 中找到需要的模块,再将它们聚合为一个新的完整的项目

3.注意事项

(1)子模块必须使用 标签标记其父工程; 标签内父工程的三个坐标需完整

(2)子模块可以共用父工程的 和 标签,但是必须提供自己的

例如:

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">

父工程项目组织名

父工程项目名

版本

子模块项目名

(3)父工程必须使用 标签标记其所有子模块

例如:

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">

4.0.0

pom

父工程项目组织名

父工程项目名

父工程版本

子模块项目名

三、Maven 拆分与聚合实战

1.创建父工程

父工程只需要一个 pom.xml 配置文件即可;所以创建project 或 module 均可;因此一般直接选择创建 Maven 工程即可(可以不用骨架创建)

2.创建子模块

(1)创建 Dao 层子模块

013799f04027d556b15fa54806ccb91a.png

因为 dao 层不需要页面交互,所以只需要一个简单的 Maven Java 工程即可,因此也不可以不用骨架创建

021c3477321f4eb42a5256101d353ac0.png

28dc23768887b6bddc9c92c0a1b71329.png

(2)创建 Service 层子模块

业务层也不需要与页面进行交互,因此也可以只创建一个简单的 Maven Java 模块

f940ebe457ba596d76b3632ef741b102.png

(3)创建 Controller 层子模块

因为我们选择用 controller 层与页面进行交互,因此这里选择用骨架创建 Maven webapp 项目

c082a6f44c8e6c8e57359cd65a9eab88.png

e9149f8f4efa81018b1084f07260be14.png

3.修改父工程的 pom.xml 配置文件

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">

4.0.0

com.lanyue

mavens

pom

1.0-SNAPSHOT

maven_dao

maven_service

maven_controller

// 父工程的所有配置信息

......

......

// 所有需要锁定版本的 jar依赖包

......

......

// 父工程的所有 jar依赖包

......

......

// 父工程的所有 依赖插件

......

4.修改 dao层 子模块的 pom.xml 配置文件

因为 dao层子模块 不依赖其它的子模块,所以可以不添加其它子模块的依赖坐标

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">

mavens

com.lanyue

1.0-SNAPSHOT

4.0.0

maven_dao

5.修改 service层 子模块的 pom.xml 配置文件

因为 service层子模块 依赖与 dao层子模块,所以需要引入 dao层子模块 的依赖坐标

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">

mavens

com.lanyue

1.0-SNAPSHOT

4.0.0

maven_service

com.lanyue

maven_dao

1.0-SNAPSHOT

6.修改 controller 层 子模块 pom.xml 配置文件

因为 controller层子模块 依赖与 service层子模块,所以需要引入 service层子模块 的依赖坐标

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

mavens

com.lanyue

1.0-SNAPSHOT

4.0.0

maven_controller

war

com.lanyue

maven_service

1.0-SNAPSHOT

7.注意事项

各个子模块各自需要用到的配置文件需要每个模块自己提供

如果某个模块需要用到其它模块的配置文件,需要在自己的配置文件中用 标签导入其它模块的配置文件;如 controller 层的配置文件需要用到 dao 层和 service 层的配置文件(spring mvc 三层的整合是在 controller 层进行的),配置方法如下:<?xml version="1.0" encoding="UTF-8"?>

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:tx="http://www.springframework.org/schema/tx"

xmlns:mvc="http://www.springframework.org/schema/mvc"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx.xsd

http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc.xsd">

fca692fb93ca9a167442db190979c9ff.png

ad275367ace4733e295737370f2b70a2.png

四、工程和模块的区别

工程和模块都不一定是完整的项目;只要代码完整,这个项目就完整,与它是工程还是模块无关

工程只能使用自己内部的资源,天生是独立的,但后天可以与其它工程或模块建立关联关系

模块天生是属于父工程的,天生不是独立的,模块一旦创建,所有父工程的资源都可以使用

工程可以理解为自己一无所有奋斗的人,模块可以理解为富二代

五、子模块与父工程之间的关系

子模块天生继承父工程,可以使用父工程的所有资源

子模块之间天生是没有任何关系的,但是它们之间可以通过相关依赖标签建立关系

平级之间的引用叫依赖(子模块与子模块之间),依赖不是先天的,是需要后天建立的

父子工程之间不用建立关系,继承关系是先天的,不需要手动建立

六、依赖范围(由 scope 标签值指定)对项目各个阶段(编译、运行、测试)的支持情况

scope ↓

编译

运行

测试

举例

备注

compile

Y

Y

Y

spring-core

默认值

provided

N

Y

jdk、servlet-api

runtime

N

Y

jdbc驱动

test

N

junit

system

Y

Y

与compile一样不推荐

import

忽略compile ===> 默认范围,编译测试运行都有效

provided ===> 在编译和测试时有效

runtime ===> 在测试和运行时有效

test ===> 只在测试时有效

system ===> 在编译和测试时有效,与本机系统关联,可移植性差

七、依赖范围对传递依赖的影响

59d71420b51d68e657aca8fba78d9d2c.png

—— ===> 传递丢失,即不可使用;需要在子模块 重新引入 源 jar依赖包 坐标

表格详解

假如 A 直接依赖 B,B 直接依赖 C,则 A 传递依赖(间接依赖)C;

最左边一列为 A 直接依赖 B 的范围,最上边一行为 B直接依赖C 的范围(言外之意就是说 A 传递依赖 C 的范围);

行与列的交叉即为 A 传递依赖 C 的范围

f42f961369d5c26cbab679d464c9ea10.png

八、Maven 父子工程的三种启动方式

1.直接启动父工程

ec3c5310682b62c9aca36080caebfa51.png

2.将 dao层、service层 安装到本地仓库后启动 web 层子模块

(1)将 所有层 的依赖项目 安装到本地仓库

fe4292ab03c6ec99907d2f038a5d2754.png

(2)启动 web 子模块

c2b65f3775e9262b1134d60f37cac9a9.png

3.使用本地安装的 Tomcat 启动

751edd0912d7523998dedd8760529b93.png

f2ec0b453e54fbd218f5eabc2ad62295.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值