Maven
多模块项目,适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理。尤其是一些开源框架,也是采用多模块的方式,提供插件集成,用户可以根据需要配置指定的模块。
下面以四个模块为例,创建项目,项目结构如下:
maven_parent (1、基础模块,父级 pom )
|----pom.xml
|----maven_dao (2、数据库的访问层,例如 JDBC 操作 jar)
|----pom.xml
|----maven_service (3、项目的业务逻辑层 jar)
|----pom.xml
|----maven_controller (4、用来接收请求,响应数据 war)
|----pom.xml

一、 创建项目
- 创建
maven_parent
项目




- 项目创建成功

- 创建
maven_dao
子模块
- 在
maven_parent
模块中,创建子模块




-
maven_dao
子模块创建成功

- 创建
maven_service
子模块
- 参照
maven_dao
模块的创建方式,在父模块maven_parent
中创建子模块maven_service

- 创建
maven_controller
子模块
- 参照
maven_dao
模块的创建方式,在父模块maven_parent
中创建子模块maven_controller
,选择的模板为webapp


二、修改所有模块的配置文件 pom.xml
- 修改
JDK
版本,默认为 1.7,改为 1.8
// JDK 版本改为 1.8
<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>
</properties>
- 设置单元测试的版本
// junit 版本改为 4.12
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
- 删除多余的配置
// 删除 pluginManagement 标签及里面的所有内容
<pluginManagement>
....
</pluginManagement>
三、 设置各模块之间的依赖
-
maven_dao
模块
- 在
maven_dao
模块下创建dao
包



- 在
dao
包中创建UserDao
类



- 在
UserDao
类中,创建方法testDao
package org.example.dao;
public class UserDao {
public static void testDao() {
System.out.println("UserDao Test...");
}
}
-
maven_service
模块
- 参照
maven_dao
模块中创建包和类的方法,创建service
包和UserService
类,并在UserService
类中调用maven_dao
模块的方法

- 在
UserService
类中,创建方法testService
,并在此方法中调用maven_dao
模块中的方法 - 先将
maven_service
模块的配置文件(pom.xml
),引入maven_dao
模块的依赖
<!-- 设置在 dependencies 标签中 -->
<!-- 引入 maven_dao 模块的依赖 -->
<dependency>
<groupId>org.example</groupId>
<artifactId>maven_dao</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
-
UserService
类文件的内容如下:
package org.example.service;
import org.example.dao.UserDao;
public class UserService {
public static void testService() {
System.out.println("UserService Test...");
// 调用 maven_dao 模块中的方法,需要在配置文件中引入 maven_dao 模块的依赖
UserDao.testDao();
}
}
-
maven_controller
模块
-
创建
controller
包和UserServlet
类,并调用maven_service
模块中的方法 -
先将
maven_controller
模块的配置文件(pom.xml
),引入maven_service
模块的依赖
<!-- 设置在 dependencies 标签中 -->
<!-- 引入 maven_service 模块的依赖 -->
<dependency>
<groupId>org.example</groupId>
<artifactId>maven_service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
- 添加
servlet
的依赖, Maven 仓库
<!-- 引入 servlet 的依赖 -->
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
- 由于此模块中,没有
java
文件夹,所以需要手动创建

- 按系统提示,选择即可(或者通过自定义文件夹,然后把该目录标记为源文件夹)

- 在
java
目录下创建包org.example.controller

- 创建
UserServlet
类

- 在类中重写
service
方法 (idea
快捷键ctrl+o
),并调用maven_service
模块的方法
import org.example.service.UserService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/user")
public class UserServlet extends HttpServlet {
// 重写 service 方法 idea 快捷键 ctrl+o
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("UserServlet Test...");
// 调用 maven_service 模块中的方法
UserService.testService();
}
}
四、配置 Tomcat
插件
- 在
maven
的Web
项目模块中(maven_controller
模块的pom.xml
),添加Tomcat
插件
<!-- 设置在 plugins 标签中 -->
<!-- Tomcat 插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<!-- 此处为项目的上下文路径 -->
<path>/web</path>
<!--此处配置了访问的端口号 默认:8080 -->
<port>8081</port>
<!--字符集编码 -->
<uriEncoding>UTF-8</uriEncoding>
<!--服务器名称 -->
<server>tomcat7</server>
</configuration>
</plugin>
五、启动项目
- 配置启动命令

- 些时直接运行可能会出现错误

- 可以先通过
install
命令,把每个模块单独打包,再运行
- 为每个模块创建打包命令


- 单独运行每个模块的打包命令:先从最小子的模块开始,然后再运行父模块


- 所有模块打包成功

- 启动
tomcat
测试

- 启动成功

- 访问测试

- 成功打印出每个模块中的输出内容

总结:
- 先创建父模块,然后在父模块中建立各子模块
- 如果各子模块间需要调用方法,需要在当前子模块的配置文件中,引入需要调用方法的子模块中依赖。
- 如果直接运行不成功,可以将每个模块单独打包,再运行。打包时,需要从最小的子模块开始,最后执行父模块。
网友评论