Maven
来源:互联网 发布:小恶魔提利昂知乎 编辑:程序博客网 时间:2024/06/16 12:37
问题
在 Spring 项目中,我们可以看到 Spring 分为许多的模块,如:spring-core、spring-context、spring-jdbc等,为什么要这样做呢?
随着项目的进行,你可能会遇到如下问题:
- 这个应用可能需要有一个前台和一个后台管理端,你发现大部分 dao、service 和 util 是在两个应用中可用。
- pom.xml 中的依赖列表越来越长,如果有人修改了 dao 层,提交到仓库并且不小心导致 build 失败,你在修改 service 的代码,发现编译不过,只能等那人把 dao 层的 bug 修复了才能继续。
- build 整个项目的时间越来越长,尽管你只在 web 层工作,但你不得不 build 整个项目。
- 某个模块,比如 util,你只想让一些经验丰富的人来维护,可是,未分模块的情况下,每个开发者都能修改,这导致关键模块的代码质量不能达到你的要求。
我们会发现,其实这里实际上没有遵守一个设计模式原则:“高内聚,低耦合”。虽然我们通过包名划分了层次,并且你还会说,这些包的依赖都是单向的,没有包的环依赖。这很好,但还不够,因为就构建层次来说,所有东西都被耦合在一起了。因此我们需要使用Maven划分模块。
结构
一个简单的 Maven 模块结构是这样的:
--- app-parent |--- pom.xml(pom) | |--- app-util | |--- pom.xml(jar) | |--- app-dao | |--- pom.xml(jar) | |--- app.service | |--- pom.xml(jar) | |--- app.web |--- pom.xml(war)
上述简单示意图中,有一个父项目(app-parent)聚合很多子项目(app-util, app-dao, app-service, app-web)。每个项目,不管是父子,都含有一个pom.xml文件。而且要注意的是,小括号中标出了每个项目的打包类型。父项目是pom,也只能是pom。子项目有jar,或者war。根据它包含的内容具体考虑。
依赖关系
这些模块的依赖关系如下:
app-dao -> app-util
app-service -> app.dao
app-web -> app.service
注意依赖的传递性(大部分情况是传递的,除非你配置了特殊的依赖scope),app-dao依赖于app-util,app-service依赖于app-dao,于是app-service也依赖于app-util。同理,app-web依赖于app-dao,app-util。
用项目层次的划分替代包层次的划分能给我们带来如下好处:
- 方便重用,如果你有一个新的swing项目需要用到app-dao和app-service,添加对它们的依赖即可,你不再需要去依赖一个WAR。而有些模块,如app-util,完全可以渐渐进化成公司的一份基础工具类库,供所有项目使用。这是模块化最重要的一个目的。
- 由于你现在划分了模块,每个模块的配置都在各自的pom.xml里,不用再到一个混乱的纷繁复杂的总的POM中寻找自己的配置。
- 如果你只是在app-dao上工作,你不再需要build整个项目,只要在app-dao目录运行mvn命令进行build即可,这样可以节省时间,尤其是当项目越来越复杂,build越来越耗时后。
- 某些模块,如app-util被所有人依赖,但你不想给所有人修改,现在你完全可以从这个项目结构出来,做成另外一个项目,svn只给特定的人访问,但仍提供jar给别人使用。
- 多模块的Maven项目结构支持一些Maven的更有趣的特性(如DepencencyManagement),这留作以后讨论。
pom 配置
parent(某项目的父 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.github.xianzhan</groupId> <artifactId>leecode</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>spider</module> </modules> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <!-- Test --> <junit.version>4.12</junit.version> <!-- Net --> <okhttp.version>3.7.0</okhttp.version> </properties></project>
child(子项目)
<?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>leecode</artifactId> <groupId>com.github.xianzhan</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>spider</artifactId> <packaging>jar</packaging> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>${okhttp.version}</version> </dependency> </dependencies></project>
使用多模块的Maven配置,可以帮助项目划分模块,鼓励重用,防止POM变得过于庞大,方便某个模块的构建,而不用每次都构建整个项目,并且使得针对某个模块的特殊控制更为方便。本文同时给出了一个实际的配置样例,展示了如何使用Maven配置多模块项目。
- Maven
- Maven
- Maven
- maven
- Maven
- Maven
- maven
- maven
- maven
- maven
- Maven
- maven .
- Maven
- maven
- maven
- maven
- MAVEN
- Maven
- 【Get深一度】奈奎斯特最小抽样率和奈奎斯特最大无ISI传输速率
- MySQL中varchar最大长度是多少?
- ios之javascriptCore
- Python入门之requests库的安装与简单使用实例
- Linux下创建线程池
- Maven
- POJ 1079 Ratio 笔记
- JavaScript编程中的对象概念
- 5 个免费的受欢迎的 SQLite 管理工具【申明:来源于网络】
- Codeforces-798D. Mike and distribution
- [java]求数组中第2大的数
- Oracle面试题 表连接 高级排序函数
- 2、TFTP服务(宿主机环境搭建)
- C++程序设计(第三版)谭浩强 一章习题