IDEA 与 Maven 的那些事 0x03:IDEA 编辑器中 maven 构建多模块项目

12 篇文章 0 订阅
12 篇文章 0 订阅

参考: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 项目

  1. File --> New --> Project --> Maven
  2. 不选择任何模板(不勾选Create from archetype),直接点击 Next
  3. 设置项目名称(Name)及工作空间(Location)、GroupIdArtifactIdVersion。点击 Finish

至此,maven_parent 模块创建完毕。

创建 maven_dao 模块

  1. 在 IDEA 左侧文件目录树中,选择项目 maven_parent,右键选择 New,选择 Module–> Maven
  2. 勾选 Create from archetype,选择 org.apache.maven.archetypes:maven-archetype-quickstart (普通 java 项目)。点击 Next
  3. 填写模块名(Name)与 ArtifactId ,其他如 LocationGroupId等都会自动跟随父模块自动设置,只需要检查一下即可。点击 Next
  4. 检查 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_daomaven_servicemaven_controllerpom.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_servicemaven_controller

设置 maven_dao

  1. 新建包
    • 右击src/main/java/公司组织名目录 --> New --> Package --> 公司组织名.dao
  2. 在包中创建 UserDao
    • 右击该包 --> New --> Java Class --> UserDao
  3. 在类中添加静态方法
    • 定义静态方法是为了方便调用,也可以不用静态方法的。
    package org.kesimi.dao;
    
    public class UserDao {
    
        public static void testDao() {
            System.out.println("UserDao Test...");
        }
    }
    

设置 maven_service

  1. 添加 maven_dao 作为依赖。

    • 因为 maven_service 是需要依赖 maven_dao 的,所以需要将 maven_dao 作为 “依赖” 加入到 maven_servicepom.xml 中。
        <!-- 引入 maven_dao 模块依赖-->
        <dependency>
            <groupId>org.kesimi</groupId>
            <artifactId>maven_dao</artifactId>
            <version>1.0-SNAPSHOT</version>>
        </dependency>
    

    其实就是将 maven_daopom.xml 中的坐标内容拷贝到 maven_servicepom.xml<dependencies> 标签中。拷贝后,在 maven_servicepom.xml中,按住 ctrl再鼠标点击这个依赖,是会跳转到 maven_daopom.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 中删除相应操作即可。
  2. 在模块新建包(右击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

  1. 添加 maven_service 模块作为依赖。

    <!-- 引入 maven_service 模块依赖 -->
    <dependency>
      <groupId>org.kesimi</groupId>
      <artifactId>maven_service</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
    
  2. 添加 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>
    
  3. 右击 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 后台打印出因该要打印的东西了。

  4. 添加 Tomcat 插件

    • 上面的步骤已经将项目的依赖配置完毕,但要运行项目,还是需要服务器。所以需要添加 Tomcat 插件(当然用 jetty 也是可以的)。
    • maven_controllerpom.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
  5. (实际上不用分别对子模块执行mvn install,只需要对maven_parent执行一次 Lifecycleinstall就可以了[在主界面右侧的Maven标签中点击运行,等价于直接在下方 Terminal中在父模块(项目)根目录(maven_parentpom.xml所在目录)运行 mvn install])先对父模块(项目)(maven_parent)执行 mvn install,再对这几个子模块按依赖顺序(maven_dao–>maven_service–>maven_controller)单独执行 mvn install。(如果按照这个顺序报错,可以试试先执行子模块的mvn install,把父模块maven_parentmvn install放到最后来执行)

    • 可以使用 IDEA 右侧的 Maven 标签栏里的命令,注意,如果用 Plugins 中的命令报错,则可以尝试 Lifecycle 中的命令。(但“使用 Lifecycle 中的 install ,项目会自动去 Maven 仓库下载需要的包”的解释是错误的。正确原因是 Lifecycle 会把前面构建的遗漏步骤补回,一直执行到当前阶段)
    • 如果中途有操作错误,可以直接对 maven_parent 执行 mvn clean 即可删除包含的所有子模块之前的 install 产生的 target 目录。

mvn install 实际上是把项目编译并打包再扔到 Maven 的本地仓库里。之后的mvn clean也只是把target(编译后打包输出目录)目录删除而已,并不会删除 Maven 本地仓库中之前扔进去的内容(即mvn clean并不是mvn install的回滚操作),要删除只能自己进去 Maven 本地仓库根据项目 groupIdartifactId 找到这些包手动删除。

  1. 运行 tomcat7
  2. 在浏览器地址栏输入:
    http://localhost:8080/web/
    
    可以看到 Hello World!
    http://localhost:8080/web/user
    
    此时,在控制台可以看到如下输出(每访问一次就会增加一次这3行输出):
    UserServlet Test...
    UserService Test...
    UserDao Test...
    
    也说明了 UserServlet 调用 UserService ,UserService 再调用 UserDao。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值