参考:https://www.bilibili.com/video/BV1Fz4y167p5
文章目录
使用 Maven 提供的多模块构建的特性完成 Maven 环境下多个模块的项目的管理与构建。
以 4 个模块为例来搭建项目。
模块 maven_parent —— 基模块,parent pom (pom)
模块 maven_dao —— 数据库的访问层,如 jdbc 操作 (jar)
模块 maven_service —— 项目的业务逻辑 (jar)
模块 maven_controller —— 用来接收请求,响应数据 (war)
MVC :web 层
调用 service 层
,service 层
调用 dao 层
。
<!-- 模块结构 -->
maven_parent
|
|---- maven_dao
|
|---- maven_service
|
|---- maven_controller
maven_controller
会去引用 maven_service
中的类与方法,而 maven_service
会引用 maven_dao
中的类与方法。
创建多模块项目
创建 maven_parent 项目
File
-->New
-->Project
-->Maven
- 不选择任何模板(不勾选
Create from archetype
),直接点击Next
- 设置项目名称(
Name
)及工作空间(Location
)、GroupId
、ArtifactId
、Version
。点击Finish
至此,maven_parent 模块创建完毕。
创建 maven_dao 模块
- 在 IDEA 左侧文件目录树中,选择项目
maven_parent
,右键选择New
,选择Module
–>Maven
- 勾选
Create from archetype
,选择org.apache.maven.archetypes:maven-archetype-quickstart
(普通 java 项目)。点击Next
- 填写模块名(
Name
)与ArtifactId
,其他如Location
、GroupId
等都会自动跟随父模块自动设置,只需要检查一下即可。点击Next
- 检查 Maven 配置是否正确。点击
Finish
至此,maven_dao 模块创建完毕。
创建 maven_service 模块
创建 maven_service
模块的步骤与 maven_dao
一致。
创建 maven_controller 模块
创建 maven_controller
模块的步骤与 maven_dao
模块基本一致,只需要将 Maven 模板设置为 web 项目即可。(模板类型:org.apache.maven.archetype:maven-archetype-webapp
)
至此,全部模块创建完毕。
maven_parent 的 pom.xml
中会看到 3 个模块:
<modules>
<module>maven_dao</module>
<module>maven_service</module>
<module>maven_controller</module>
</modules>
按住 contrl
再鼠标左击这 3 个模块的任一模块,是可以跳转到该模块的 pom.xml
文件中的。
修改模块的配置
从 maven_dao
开始,将 maven_dao
、maven_service
、maven_controller
的 pom.xml
依次作如下修改。
- 修改 jdk 版本
- 将 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 版本
- 将 junit 版本改为 4.12
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
- 删除多余的配置
- 删除
<build>
标签中的<pluginManagement>
标签及其内容全部删除
<pluginManagement> ... </pluginManagement>
- 删除
设置模块之间的依赖
MVC :web 层
调用 service 层
,service 层
调用 dao 层
。
maven_controller
会去引用 maven_service
中的类与方法,而 maven_service
会引用 maven_dao
中的类与方法。
所以,先从 maven_dao
模块开始设置,再依次设置 maven_service
与 maven_controller
。
设置 maven_dao
- 新建包
- 右击
src/main/java/公司组织名
目录 --> New --> Package -->公司组织名.dao
- 右击
- 在包中创建
UserDao
类- 右击该包 --> New --> Java Class -->
UserDao
- 右击该包 --> New --> Java Class -->
- 在类中添加静态方法
- 定义静态方法是为了方便调用,也可以不用静态方法的。
package org.kesimi.dao; public class UserDao { public static void testDao() { System.out.println("UserDao Test..."); } }
设置 maven_service
-
添加
maven_dao
作为依赖。- 因为
maven_service
是需要依赖maven_dao
的,所以需要将maven_dao
作为 “依赖” 加入到maven_service
的pom.xml
中。
<!-- 引入 maven_dao 模块依赖--> <dependency> <groupId>org.kesimi</groupId> <artifactId>maven_dao</artifactId> <version>1.0-SNAPSHOT</version>> </dependency>
其实就是将
maven_dao
的pom.xml
中的坐标内容拷贝到maven_service
的pom.xml
的<dependencies>
标签中。拷贝后,在maven_service
的pom.xml
中,按住ctrl
再鼠标点击这个依赖,是会跳转到maven_dao
的pom.xml
的。- 或者在写java源码时通过IDEA的自带功能导入依赖(会自动修改
pom.xml
文件),比如说在UserService.java
中键入UserDao
,然后按下alt+enter
,选择导入maven_dao
模块即可。- 如果不小心后面又按了
Exclude from auto-import and Completion
,则需要File
-->Settings
-->Editor
-->General
-->Auto Import
,在Exclude from auto-import and Completion
中删除相应操作即可。
- 如果不小心后面又按了
- 因为
-
在模块新建包(右击
src/main/java/公司组织名
目录 --> New --> Package -->公司组织名.service
),包中添加UserService
类(右击该包 --> New --> Java Class -->UserService
),并添加方法(在该方法中调用maven_dao
模块(层)中的方法testDao()
)package org.kesimi.service; import org.kesimi.dao.UserDao; public class UserService { public static void testService() { System.out.println("UserService Test..."); // 调用 maven_dao 模块的方法 UserDao.testDao(); } }
设置 maven_controller
-
添加
maven_service
模块作为依赖。<!-- 引入 maven_service 模块依赖 --> <dependency> <groupId>org.kesimi</groupId> <artifactId>maven_service</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
-
添加
Servlet
的依赖maven_controller
是 servlet,所以需要引入Servlet
依赖。
<!-- 引入 servlet 依赖 --> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
-
右击
maven_controller/src/main
-->New
-->Directory
:java
--> 右击java
-->Mark Directory as
-->Sources Root
,再右击java
-->New
-->Package
:org.kesimi.controller
(发现如果先创建包org.kesimi
,再在其下创建包controller
,还是会自动合并成一个目录) --> 在这个包下新建 Java 类(UserServlet
),然后继承 HttpServlet 类,并重写 service 方法- 引入
Servlet
依赖后,需要创建 servlet,然后重写 service 方法。然后调用maven_service
模块(层)的方法testService()
。 - 重写 service 方法,在 IDEA 中,只需要
ctrl+o
,在弹出的Select methods to override/implements
菜单中选择javax.servlet.http.HttpServlet
-->service(req:HttpServletRequest,resp:HttpServletResponse):void
package org.kesimi.controller; import org.kesimi.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 { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("UserServlet Test..."); // 调用 maven_service 模块的方法 UserService.testService(); } }
之前曾经犯过错误:在
maven_controller
下直接创建java
目录,而非放到maven_controller/src/main
下,结果编译时没有发生问题,最后运行时 localhost:8080/web 是在网页打印出 “Hello World!” 了,但是 localhost:8080/web/user 网页端是报错,但是 IDEA 后台并看不到有任何输出,一直调试以为什么东西没有编译,clean 了又 install 反复多次,最后无意中发现原来是 源码文件放错了…结果重新调整了位置,都不用 clean 、 install,直接运行 tomcat , localhost:8080/web/user 就能在 IDEA 后台打印出因该要打印的东西了。 - 引入
-
添加 Tomcat 插件
- 上面的步骤已经将项目的依赖配置完毕,但要运行项目,还是需要服务器。所以需要添加 Tomcat 插件(当然用 jetty 也是可以的)。
- 在
maven_controller
的pom.xml
的<build>
标签中写入 tomcat 插件配置信息。
<plugins> <!-- tomcat7插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <!-- <port>8080</port> --> <path>/web</path> <uriEncoding>UTF-8</uriEncoding> <server>tomcat7</server> </configuration> </plugin> </plugins>
注意,如果
<dependency>
里也有 tomcat,需要删除,否则之后运行tomcat的时候会报错。(应该是 tomcat 不能同时在<plugin>
和<dependency>
中出现,否则冲突)。当然如果是因为忘记删了,在全部子模块、项目都mvn install
了,运行 tomcat 时报错,只需要删除这个<dependency>
并load maven changes
即可,然后重新运行 tomcat,并不需要mvn clean
后重新对各模块进行mvn install
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>7.0.37</version> </dependency>
- 之后,因为
pom.xml
变更了,主界面代码靠右上方有个图标(load maven changes
)点击一下 - 之后,主界面右上方
Add Configuration
-->Maven
-->Name
填入tomcat7
(自定义) -->Parameters
-->Working Directory:
处选择maven_controller
的工作空间 -->Command line:
处填入tomcat7:run
-->Apply
-->OK
-
(实际上不用分别对子模块执行
mvn install
,只需要对maven_parent
执行一次Lifecycle
的install
就可以了[在主界面右侧的Maven
标签中点击运行,等价于直接在下方Terminal
中在父模块(项目)根目录(maven_parent
的pom.xml
所在目录)运行mvn install
])先对父模块(项目)(maven_parent
)执行mvn install
,再对这几个子模块按依赖顺序(maven_dao
–>maven_service
–>maven_controller
)单独执行mvn install
。(如果按照这个顺序报错,可以试试先执行子模块的mvn install
,把父模块maven_parent
的mvn install
放到最后来执行)- 可以使用 IDEA 右侧的 Maven 标签栏里的命令,注意,如果用
Plugins
中的命令报错,则可以尝试Lifecycle
中的命令。(但“使用 Lifecycle 中的 install ,项目会自动去 Maven 仓库下载需要的包”的解释是错误的。正确原因是 Lifecycle 会把前面构建的遗漏步骤补回,一直执行到当前阶段) -
如果中途有操作错误,可以直接对
maven_parent
执行mvn clean
即可删除包含的所有子模块之前的install
产生的target
目录。
- 可以使用 IDEA 右侧的 Maven 标签栏里的命令,注意,如果用
mvn install
实际上是把项目编译并打包再扔到 Maven 的本地仓库里。之后的mvn clean
也只是把target
(编译后打包输出目录)目录删除而已,并不会删除 Maven 本地仓库中之前扔进去的内容(即mvn clean
并不是mvn install
的回滚操作),要删除只能自己进去 Maven 本地仓库根据项目groupId
与artifactId
找到这些包手动删除。
- 运行 tomcat7
- 在浏览器地址栏输入:
可以看到http://localhost:8080/web/
Hello World!
此时,在控制台可以看到如下输出(每访问一次就会增加一次这3行输出):http://localhost:8080/web/user
也说明了 UserServlet 调用 UserService ,UserService 再调用 UserDao。UserServlet Test... UserService Test... UserDao Test...