文章目录
- Maven模块管理
- 模块拆分方案
- 开始搭建
- 项目架构图
- 工程目录
- 各级项目描述
- 创建工程
- 1.创建一个空的项目作为存放整个项目的路径
- 2.创建taotao-parent父类工程,后面所有的工程全部继承该工程
- 3.创建通用工程taotao-common,继承父工程parent
- 4. 创建taotao-manager聚合工程,打包方式```pom```,继承parent
- 5.在taotao-manager下添加子模块,打包方式都为```jar```,taotao-manager-pojo,taotao-manager-dao,taotao-manager-service,创建方式一样
- 6.添加manager子模块taotao-manager-web表现层,打包方式为`war`
- 7.如何更新所有子模块的版本号(可加可不加)
- 8.运行
- 拓展知识
- dependencyManagement 统一管理子类依赖版本
- 通过Properties标签统一管理同一个pom.xml中的依赖版本
- 聚合
Maven模块管理
在软件开发中,把一个大项目分拆为多个模块是降低软件复杂度的有效方法:
对于Maven工程来说,原来是一个大项目:
现在可以分拆成3个模块:
Maven可以有效地管理多个模块,我们只需要把每个模块当作一个独立的Maven项目,它们有各自独立的pom.xml。
模块拆分方案
按照结构拆分
- project
- project-service
- project-controller
- project-dao
按照业务拆分
- project
- project-order
- project-account
- project-pay
开始搭建
项目架构图
工程目录
各级项目描述
taotao-parent(父工程管理所有jar包的版本)parent本身不含任何Java代码。编写parent的pom.xml只是为了在各个模块中减少重复的配置
taotao-common(把通用的工具类打包)
taotao-manager(继承父工程)taotao-manager-pojo (jar包)
taotao-manager-dao (jar包)
taotao-manager-service (jar包)
taotao-manager-web(war包)
-
taotao-parent
为项目的父工程,用来管理jar
包及版本 -
taotao-common
为通用工程,继承父工程,就是把通用的工具类打包 -
taotao-manager
为开发工程,同样继承父工程
taotao-manager-pojo,taotao-manager-dao, taotao-manager-service和taotao-manager-web均为开发工程的一个子模块,依赖于开发工程taotao-manager
!!!前3个子模块(pojo,dao,service)打成jar包,taotao-manager-web打成war包
创建工程
1.创建一个空的项目作为存放整个项目的路径
2.创建taotao-parent父类工程,后面所有的工程全部继承该工程
File → New → Project
Maven → Next
- 创建完后,删除生成的src目录,修改打包方式为
pom
,taotao-parent:pom.xml
maven中有3种工程:
- pom工程:用在父级或聚合工程中,用来做jar包的版本控制。
- war工程:会打包成war,发布在服务器上。如网站或服务。
- jar工程:打包成jar用作jar包使用。
该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>
<!--功能:父工程,打包方式为pom,管理jar包的版本号。项目中的所有工程都应该继承父工程-->
<!--包含项目中用到的所有jar包版本-->
<groupId>com.taotao</groupId>
<artifactId>taotao-parent</artifactId>
<!--1. pom工程:用在父级或聚合工程中,用来做jar包的版本控制。-->
<!--2. war工程:会打包成war,发布在服务器上。如网站或服务。-->
<!--3. jar工程:打包成jar用作jar包使用。-->
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<!-- modules即为父子关系 -->
<modules>
<module>../taotao-common</module>
<module>../taotao-manager</module>
</modules>
<!-- 集中定义依赖版本号 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<spring.version>4.1.3.RELEASE</spring.version>
<mybatis.version>3.2.8</mybatis.version>
<mybatis.spring.version>1.2.2</mybatis.spring.version>
<mysql.version>5.1.32</mysql.version>
<slf4j.version>1.6.6</slf4j.version>
<jackson.version>2.4.2</jackson.version>
<druid.version>1.0.9</druid.version>
<httpclient.version>4.3.5</httpclient.version>
<jstl.version>1.2</jstl.version>
<servlet-api.version>2.5</servlet-api.version>
<jsp-api.version>2.0</jsp-api.version>
<joda-time.version>2.5</joda-time.version>
<commons-lang3.version>3.3.2</commons-lang3.version>
<commons-io.version>1.3.2</commons-io.version>
<commons-net.version>3.3</commons-net.version>
<jsqlparser.version>0.9.1</jsqlparser.version>
<commons-fileupload.version>1.3.1</commons-fileupload.version>
<lombok.version>1.16.20</lombok.version>
</properties>
<!--此处 dependencyManagement 并不会直接引入依赖,是一种懒加载的方式-->
<!-- dependencyManagement非常重要,决定了子pom.xml是否可以直接引用父pom.xml的包 -->
<dependencyManagement>
<dependencies>
<!--Lombok。通过添加注解的方式,不需要为类编写getter或eques方法,同时可以自动化日志变量。-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<!-- 时间操作组件 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${joda-time.version}</version>
</dependency>
<!-- Apache工具组件 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>${commons-net.version}</version>
</dependency>
<!-- Jackson Json处理工具包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>${httpclient.version}</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- 日志处理 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</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-webmvc</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-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- JSP相关 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet-api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp-api.version}</version>
<scope>provided</scope>
</dependency>
<!-- 文件上传组件 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>${project.artifactId}</finalName>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<!-- 资源文件拷贝插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
</plugins>
</pluginManagement>
</build>
</project>
- 注意到
parent
的<packaging>
是pom
而不是jar,因为parent本身不含任何Java代码。编写parent的pom.xml只是为了在各个模块中减少重复的配置
3.创建通用工程taotao-common,继承父工程parent
- 该工程保存的是
通用的工具类及pojo
,打包方式jar
包
在taotao-parent
文件上右击创建新的model
,和创建maven类似不需要勾选信息,
taotao-parent→ New → Module
然后会出现如下如下界面: - 修改打包方式为
jar
,taotao-common:pom.xml
该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">
<!--功能:通用的工具类,通用的pojo 打包方式jar-->
<!--继承parent工程-->
<!--子模块需要继承父模块parent,才能由parent管理依赖版本-->
<parent>
<artifactId>taotao-parent</artifactId>
<groupId>com.taotao</groupId>
<version>1.0-SNAPSHOT</version>
<!--如果和parent为同级目录必须设置父模块 相对路径relativePath-->
<relativePath>../taotao-parent</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>taotao-common</artifactId>
<packaging>jar</packaging> <!-- 注意此处要配置为jar -->
<!--子pom.xml不必添加dependencyManagement-->
<dependencies>
<!--====================添加工具类包的依赖=======================-->
<!--这里可以看到因为父pom.xml已经引用了自身项目的包模块,所以这里可以不加version直接使用-->
<!-- 时间操作组件 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
<!-- Apache工具组件 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
</dependency>
<!-- Jackson Json处理工具包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!-- 日志处理 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
</dependencies>
</project>
4. 创建taotao-manager聚合工程,打包方式pom
,继承parent
- 该工程里面有多个模块。创建工程类似taotao-common的过程,在taotao-parent文件上右击创建新的model,和创建maven类似不需要勾选信息:
- taotao-parent→ New → Module → Next → taotao-manager
taotao-manager: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">
<!--打包方式pom,里面有一堆模块 pojo,dao,server,controller-->
<!--子模块需要继承父模块parent,才能由parent管理依赖版本-->
<!--parent使用的即为父pom.xml的信息-->
<parent>
<artifactId>taotao-parent</artifactId>
<groupId>com.taotao</groupId>
<version>1.0-SNAPSHOT</version>
<!--如果和parent为同级目录必须设置父模块 相对路径relativePath-->
<relativePath>../taotao-parent/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>taotao-manager</artifactId>
<packaging>pom</packaging>
<modules>
<module>taotao-manager-pojo</module>
<module>taotao-manager-dao</module>
<module>taotao-manager-service</module>
<module>taotao-manager-web</module>
</modules>
<!--子pom.xml不必添加dependencyManagement-->
<dependencies>
<!-- manager依赖于common-->
<dependency>
<groupId>com.taotao</groupId>
<artifactId>taotao-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
</plugins>
</pluginManagement>
</build>
</project>
5.在taotao-manager下添加子模块,打包方式都为jar
,taotao-manager-pojo,taotao-manager-dao,taotao-manager-service,创建方式一样
taotao-manager-pojo
- 在taotao-manager上右键New → Module → Next → taotao-manager-pojo,过程类似taotao-common的创建但是路径选择需要重写填写,使工程在同一目录,如下图:
- taotao-manager-pojo:
pom.xml
: pojo不需要依赖其它jar包
<?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">
<!--pojo不需要依赖其它jar包-->
<!--子模块需要继承父模块manager-->
<parent>
<artifactId>taotao-manager</artifactId>
<groupId>com.taotao</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging> <!-- 注意此处要配置为jar -->
<artifactId>taotao-manager-pojo</artifactId>
</project>
- taotao-manager-dao:
pom.xml
:
- dao的运行需要Mybatis等的支持,所以要添加依赖
<?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">
<!--持久层的允许需要mybatis相关包的支持-->
<!--子模块需要继承父模块manager-->
<parent>
<artifactId>taotao-manager</artifactId>
<groupId>com.taotao</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>taotao-manager-dao</artifactId>
<packaging>jar</packaging> <!-- 注意此处要配置为jar -->
<dependencies>
<!--dao的运行需要依赖pojo-->
<dependency>
<artifactId>taotao-manager-pojo</artifactId>
<groupId>com.taotao</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--====================添加mybatis等数据库相关依赖===========================-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
</dependencies>
</project>
taotao-manager-service: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>taotao-manager</artifactId>
<groupId>com.taotao</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>taotao-manager-service</artifactId>
<dependencies>
<!--依赖dao-->
<dependency>
<artifactId>taotao-manager-dao</artifactId>
<groupId>com.taotao</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--加载spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
</dependencies>
</project>
6.添加manager子模块taotao-manager-web表现层,打包方式为war
- 同样taotao-manager上右键New → Module → Next,如下图所示,
- 只不过这里选择webapp这项不同,点next下一步
- taotao-manager-web:
pom.xml
: web的运行需要jsp,上传等的支持,所以要添加依赖
<?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">
<!--表现层,打包方式为war-->
<!--子模块需要继承父模块manager-->
<parent>
<artifactId>taotao-manager</artifactId>
<groupId>com.taotao</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<artifactId>taotao-manager-web</artifactId>
<dependencies>
<!--表现层需要依赖service-->
<dependency>
<groupId>com.taotao</groupId>
<artifactId>taotao-manager-service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- JSP相关 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<scope>provided</scope>
</dependency>
<!-- 文件上传组件 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
</dependency>
</dependencies>
<build>
<!--最终打包名字-->
<finalName>taotao-manager-web</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!--[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project spring2: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode) -> [Help 1]-->
<!--原因分析: maven的web项目默认的webroot是在src\main\webapp。如果在此目录下找不到web.xml就抛出以上的异常。-->
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.2</version>
<configuration>
<warSourceDirectory>${basedir}/WebRoot</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
7.如何更新所有子模块的版本号(可加可不加)
- 使用maven插件
在父级的pom.xml中加个插件就OK了,plugins > release > update-versions
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<autoVersionSubmodules>true</autoVersionSubmodules>
</configuration>
</plugin>
</plugins>
</build>
8.运行
- 在根目录执行
taotao-parent
执行install
命令时,Maven根据根目录的pom.xml
找到包括parent在内的所有子<module>
,一次性全部编译
拓展知识
dependencyManagement 统一管理子类依赖版本
- 在父类maven中加入,不会继承给子类,只能规定子类的依赖版本,子类加入dependence后无需写入
<!--不会加入依赖,只会限定版本,还需要引入依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.12.2</version>
</dependency></dependencies>
</dependencyManagement>
通过Properties标签统一管理同一个pom.xml中的依赖版本
<properties>
<java.version>17</java.version>
<jwt-api.version>0.12.2</jwt-api.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>${jwt-api.version}</version> <!--属性由上面的Properties统一指出 -->
</dependency>
</dependencies>
</dependencyManagement>
聚合
- 在一个项目中存在多个模块时,可以通过
聚合一键打包、安装所有的模块
。只需要在父maven中加入modules标签
。
<!--父类 pom.xml:-->
<modules>
<module>Module1</module>
<module>Module2</module>
</modules>