前言
在经过前面的阶段学习之后,我们已经对项目与项目之间传递依赖已经有所认知啦,可能不少朋友会有疑惑,我之前做项目的时候需要什么jar包就把需要的jar包复制粘贴就好,哪用这么麻烦,为导个jar包,还多费周折去学习一个新的知识点,还要做那么多的配置,吃力不讨好吧?
其实大多数初学者都会这么去想,但是实际开发我中我们还是会使用Maven这么去做,肯定是有它的道理,因为我们现在市面上开发的项目不仅仅是一个人在做,而是一个团队在做,再大一点的项目,可能有很多个功能模块,每个功能模块呢又包含很多小分支,分布式项目下,一个功能模块可能会由多个数据库来支持。
试想一下,如果我们还是使用以往的开发模式,把所有的东西全部都堆在一个项目中,那么这个项目会显得十分臃肿,而且每次扩展一个项目,我们都需要重新打包,重新发布。但是使用了Maven分层之后,我们可以创建一个父项目,一但有子项目上线,我们就挂在父项目下,可能一个人或者一个小团队负责一个版块,每个板块的人员专门去钻研这个功能所涉及到的某个项目(好比说我们电商项目中点击一个按钮就可以抢购某件商品,那么完成这个功能的开发人员就可以去钻研怎么去提高并发)。
那这样开发起来,不仅提高了项目完成的效率,变相的还提升了项目的质量。
项目与项目模块之间分配方式
那么讲了这么多,无非就是想阐述一个道理,很多我们初次看起很复杂的东西,其实是为更好的完成我们的开发,最简单的栗子就是我们的Java的分层开发,项目与项目之间的分层也是一样的道理。
那接下来我们来了解下Maven的项目与项目之间的分配方式吧~
分配方式
|-- 按功能
|-- 按MVC三层结构分
按功能分配[分布式项目大型电商]
|-- https://www.jd.com/ 主域名
|-- https://jiadian.jd.com/ 家电
|-- https://toy.jd.com/ 玩具
|-- https://help.jd.com/index.html 帮助中心
|-- https://vip.jd.com/ VIP
|-- https://order.jd.com 订单
|-- https://cart.jd.com 购物车系统
|-- https://miaosha.jd.com/ 秒杀
|--https://passport.jd.com/ 单点登陆系统
就拿一个我们比较熟悉的JD来说吧,虽然某东最近天天上头条,但不防我们用它的JD举例子对吧
我们不难看出JD的每一个功能都可以单独的使用没某一个地址访问到,https://www.jd.com
是主域名,https://jiadian.jd.com
则是它的附域名,每一个功能都是由一个小型团队来维护的,像帮助中心这种访问量并不大的功能,安排的人手就不会那么多,那么按照功能分配项目有什么好处呢?
大家试想,当我们一个项目,也就是功能down机了,比方说家电项目服务器挂了,那么客户还可以访问其他的模块,或者说我们的图片数据库挂了,那么客户依然可以正常的访问到JD网站,只是说图片可能显示不出来,这样做变相的提高了容错率,大型的电商项目也都是这么去分层的。
按MVC三层结构分配
对于一些不是特别大的项目,或者说没有像电商项目那么对一个个功能模块划分的很清楚的项目来说,使用MVC三层结构分配就够了,那具体怎么分配呢?我们来模拟MVC三层结构看看,在此之前我们先了解下,通常情况下我们项目该分为哪几层。
主项目
|--commons 公共包
|--domain 实体层
|--mapper 数据访问层
|--依赖domain
|--service 服务提供者
|--依赖mapper
|--依赖commons
|--web 接口提供者
|--依赖service
通常情况,除了commons,我们其他的几个项目都会有一个共同的父项目,这里我们暂且命名为marco_parent
第一步:创建marco_commons项目
我们先随便放一个util在commons中,commons一般都是放一些项目之间通用的类,比如说我们的工具类
第二步:创建marco_parent项目
之前有教大家创建过parent项目,这里我就不重复再讲啦,如果还有太清除操作流程的朋友,请参考我们的
Marco’s Java【Maven入门(二) 之 Eclipse下Maven项目聚合和继承】
接着我们修改parent中的pom.xml
<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.marco</groupId>
<artifactId>marco_parent</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<!-- 添加对commons的依赖 -->
<dependencies>
<dependency>
<groupId>com.marco</groupId>
<artifactId>marco_commons</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<modules>
<!-- 添加父子项目关联之后,会自动生成模块之间的关联-->
<module>marco_domain</module>
<module>marco_mapper</module>
<module>marco_service</module>
<module>marco_web</module>
</modules>
</project>
第三步:创建marco_mapper项目
这里为了模拟项目分层,我就不做数据库的操作啦
UserDao的代码略…
package com.marco.dao.impl;
import com.marco.dao.UserDao;
import com.marco.domain.User;
public class UserDaoImpl implements UserDao{
@Override
public User queryUserById(Integer id) {
return new User(1, "marco", "123456");
}
}
marco_mapper需要建立对marco_domain的依赖
<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>com.marco</groupId>
<artifactId>marco_parent</artifactId>
<version>1.0</version>
</parent>
<artifactId>marco_mapper</artifactId>
<!-- 建立marco_domain的依赖 -->
<dependencies>
<dependency>
<groupId>com.marco</groupId>
<artifactId>marco_domain</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>
第四步:创建marco_service项目
同理marco_service和marco_mapper的操作是一样的,只不过依赖关系是marco_service依赖marco_mapper
<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>com.marco</groupId>
<artifactId>marco_parent</artifactId>
<version>1.0</version>
</parent>
<artifactId>marco_service</artifactId>
<!-- 建立marco_mapper的依赖 -->
<dependencies>
<dependency>
<groupId>com.marco</groupId>
<artifactId>marco_mapper</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>
第五步:创建marco_web项目
这里创建web项目的方式请参考下面的博文,为了测试(偷个懒….)我还是使用的普通项目创建方式,需要注意的是我们的web项目的打包方式可不再是jar了,而是war
Marco’s Java【Maven入门(三) 之 Eclipse下创建Maven的WEB项目及创建后常见问题的解决方案】
<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>com.marco</groupId>
<artifactId>marco_parent</artifactId>
<version>1.0</version>
</parent>
<artifactId>marco_web</artifactId>
<!-- 建立marco_service的依赖,实际应该使用web的创建方式,打包方式为war-->
<dependencies>
<dependency>
<groupId>com.marco</groupId>
<artifactId>marco_service</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>
第六步:测试
接着我们在web中创建一个Test类测试看看,这个几个项目之间的依赖关系建好没有
package marco_web;
import com.marco.domain.User;
public class Test {
public static void main(String[] args) {
UserController userController = new UserController();
User user = userController.queryUserById();
System.out.println(user.getUserName());
String date = DateUtil.getDateString(new Date(), DateUtil.yyyyMMdd);
System.out.println(date);
}
}
运行结果如下,证明我们按MVC三层结构分配Maven项目是完全可行的
后语
大家有没有疑惑就是为什么要单独的创建一个parent项目呢?
大家想想看我们之前讲解项目之间继承的特性,是不是子类可以自动的去继承父类中已经拥有的包?
因此我们的parent项目主要就是存放我们项目中所需要的包的地方,大家可以参考我上面画的这张图,你可以把它理解成一个jar包仓库,其他的项目如果需要jar包,只要继承自parent,就可以自动的继承到parent下的包,比方说我们下面的这个项目,我们在mapper的pom.xml中并没有配置需要的包的GAV坐标,但是却有这些jar包?原因就是我们的这个项目是parent下的子项目,这么说大家应该就明白了吧?
至于commons为什么不用继承parent,大家应该能够猜出原因了,因为commons工具类中一般不会涉及到对其他的jar包的依赖,因此我们通常使用parent依赖commons的方式,传递依赖关系,这样的话parent下面的子项目也都可以使用common了,奉上parent的配置,给大家参考一下。
<?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>组名</groupId>
<artifactId>项目名</artifactId>
<version>版本号</version>
<packaging>pom</packaging>
<!-- 声明版本号 -->
<properties>
<servlet.version>3.1.0</servlet.version>
<jsp.version>2.3.1</jsp.version>
<spring.version>4.3.24.RELEASE</spring.version>
<mybatis.version>3.5.1</mybatis.version>
<mybatis-spring.version>2.0.1</mybatis-spring.version>
<mysql.version>5.1.47</mysql.version>
<pagehelper.version>5.1.10</pagehelper.version>
<poi.version>4.1.0</poi.version>
<druid.version>1.1.19</druid.version>
<quartz.version>2.3.0</quartz.version>
<slf4j.version>1.7.26</slf4j.version>
<log4j.version>1.2.17</log4j.version>
<commons-fileupload.version>1.3.3</commons-fileupload.version>
<commons-io.version>2.6</commons-io.version>
<jackson.version>2.9.9</jackson.version>
<hutool.version>4.6.1</hutool.version>
<zxing.version>3.4.0</zxing.version>
<jstl.version>1.1.2</jstl.version>
<fastjson.version>1.1.22</fastjson.version>
</properties>
<dependencies>
<!-- servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<!-- jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>${jsp.version}</version>
<scope>provided</scope>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<!-- mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>${pagehelper.version}</version>
</dependency>
<!-- poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>${quartz.version}</version>
</dependency>
<!-- slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log4j-api -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<!-- commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}</version>
</dependency>
<!-- jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<!--taglibs/standard -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>${jstl.version}</version>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<!-- com.google.zxing/core -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>${zxing.version}</version>
</dependency>
</dependencies>
<build>
<finalName>项目名_parent</finalName>
<plugins>
<!-- 加入tomcat运行插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<uriEncoding>UTF-8</uriEncoding> <!--解决页面提交数据乱码问题 -->
<port>8080</port><!-- tomcat插件的请求端口 -->
<path>/请求路径</path><!-- 项目的请求路径 -->
</configuration>
</plugin>
<!-- 指定当前项目的jdk版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<!-- 指定source和target的版本 -->
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<modules>
<module>项目名_domain</module>
<module>项目名_mapper</module>
<module>项目名_service</module>
<module>项目名_web</module>
</modules>
</project>