拆分模块原因
使用Java技术开发的工程,随着时间的推移,代码增多,目录结构变复杂,这时候工程的进展就会遇到各种问题:
(1)不同业务的代码相互耦合。系统出现问题后难排查定位、修正。
(2)增加了新手介入开发的成本,需要有一个熟悉整个项目的开发者维护整个项目的结构。
(3)开发者对自己或者他人负责的代码边界很模糊,修改了他人负责的代码但对方不知道,责任追踪很麻烦。
因此,我们可以把项目拆成多个模块。
多模块的划分可以降低代码之间的耦合性(从类级别的耦合提升到jar包级别的耦合),模块还规范了代码边界的划分,开发者很容易通过模块确定自己所负责的内容。 对于maven管理的项目,每个模块都对应着一个pom.xml。
拆分案例
例如,一个项目被我们分为了会员,仓库,订单几个部分,我们会看到一些包名:
org.myorg.app.user
org.myorg.app.repository
org.myorg.app.order
对应的Maven模块结构是这样的:
app-parent
|-- pom.xml
|
|-- app-user
| |-- pom.xml
|
|-- app-repository
| |-- pom.xml
|
|-- app-order
| |-- pom.xml
子模块比较多的时候,经常会遇到jar包版本难统一,有冲突难排查的情况。为了使不同的子项目中的相同依赖的版本保持一致,一般在parent项目的pom文件中使用dependencyManagement维护相关依赖。
1.在Maven中dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器。
2.pom.xml文件中,jar的版本判断的两种途径
2.1 如果dependencies中的dependency声明了version,都以dependency里的version为准。
2.2 如果dependencies里的dependency自己没有声明version元素,那么maven就会dependencyManagement里面去找有没有对该artifactId和groupId进行过版本声明,如果有,就继承它,如果没有就会报错。
pom文件示例
父级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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.suncy</groupId>
<artifactId>course-reminder</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>course-reminder-app</module>
<module>course-reminder-common</module>
</modules>
<!--版本-->
<properties>
<commons-codec>1.9</commons-codec>
</properties>
<!--jar包版本管理-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>${commons-codec}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!--导入jar包-->
<dependencies>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
</dependencies>
</project>
子级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>course-reminder</artifactId>
<groupId>com.suncy</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>course-reminder-common</artifactId>
<dependencies>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
</dependencies>
</project>