大家好嘞,今天闲着没事干开写写博客,记录一下Maven+SpringBoot的多模块设计和遇到的坑。

多模块设计

简单说明一下截止目前的需求:

  • 需要RESTful API:对文章、标签、分类和评论等的CRUD
  • 要前台展示: 首页、归档、文章具体页等
  • 后台管理:添加文章、新增标签之类

简单分析可以简单设计一个模块来组织代码,比如就叫oyster-blog。

但显然有个问题,这么设计会让代码比较混乱,比如我不能在同一个类中处理所有的请求,也不能分成三个类分别实现这三个功能。
比较好的设计是分成三个包,然后各个包内细化各个功能。

这么做的话,不太方便团队开发。一堆人一起写一个模块,管理起来有些麻烦。
比如突然新增一个特性,牵扯一堆东西。大家一起写的话,最后合并代码说不定还会冲突。
所以我们来稿多模块吧。

但不方便的地方还是存在,比如突然有一天我的前台展示挂掉了。
这种情况下,老板或者我个人甚至想让api模块不受影响,继续运行。
这可咋整?

这种情况我们貌似可以做微服务了。(猜测这样多模块设计过渡到微服务是轻松的,还没想做这个呢)

那么就有一个多模块的设计:

  • oyster-common
    提供公共的访问数据库的接口,工具类(比如分析请求的工具,时间处理)
  • oyster-api
    提供RESTful API
  • oyster-front
    提供前台展示
  • oyster-back
    后台管理

Maven多模块构建的细节

最终模块长这样:

首先新建一个maven工程,然后删除文件,只剩pom.xml。具体pom配置下来再说。
新建api、common和front模块:
- 组织名就填组织名,例:org.tanglizi
- artifact填项目名,例:oyster
- 包名换成具体模块名,例:org.tanglizi.oyster.api

父模块oyster的pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>org.tanglizi</groupId>
  7. <artifactId>oyster</artifactId>
  8. <packaging>pom</packaging>
  9. <version>1.0-SNAPSHOT</version>
  10. <!-- 注意此处 -->
  11. <parent>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-parent</artifactId>
  14. <version>2.1.4.RELEASE</version>
  15. <relativePath/>
  16. </parent>
  17. <!-- 注意此处 -->
  18. <modules>
  19. <module>oyster-common</module>
  20. <module>oyster-api</module>
  21. <module>oyster-front</module>
  22. <module>oyster-runner</module>
  23. </modules>
  24. <properties>
  25. <java.version>1.8</java.version>
  26. </properties>
  27. <build>
  28. <!-- plugins>
  29. <plugin>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-maven-plugin</artifactId>
  32. </plugin>
  33. </plugins -->
  34. <!-- 注意此处 -->
  35. <plugins>
  36. <plugin>
  37. <groupId>org.apache.maven.plugins</groupId>
  38. <artifactId>maven-compiler-plugin</artifactId>
  39. <version>3.1</version>
  40. <configuration>
  41. <source>${java.version}</source>
  42. <target>${java.version}</target>
  43. </configuration>
  44. </plugin>
  45. <plugin>
  46. <groupId>org.apache.maven.plugins</groupId>
  47. <artifactId>maven-surefire-plugin</artifactId>
  48. <version>2.22.1</version>
  49. <configuration>
  50. <skipTests>true</skipTests> <!--默认关掉单元测试 -->
  51. </configuration>
  52. </plugin>
  53. </plugins>
  54. </build>
  55. </project>

子模块oyster-api

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <!-- 注意此处 -->
  6. <parent>
  7. <groupId>org.tanglizi</groupId>
  8. <artifactId>oyster</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <relativePath>../pom.xml</relativePath>
  11. </parent>
  12. <groupId>org.tanglizi</groupId>
  13. <artifactId>oyster-api</artifactId>
  14. <version>0.0.1-SNAPSHOT</version>
  15. <name>oyster-api</name>
  16. <description>Demo project for Spring Boot</description>
  17. <properties>
  18. <java.version>1.8</java.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.tanglizi</groupId>
  23. <artifactId>oyster-common</artifactId>
  24. <version>0.0.1-SNAPSHOT</version>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-data-jpa</artifactId>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-starter-jdbc</artifactId>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.springframework.boot</groupId>
  36. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  37. </dependency>
  38. <dependency>
  39. <groupId>org.springframework.boot</groupId>
  40. <artifactId>spring-boot-starter-web</artifactId>
  41. </dependency>
  42. <dependency>
  43. <groupId>org.mybatis.spring.boot</groupId>
  44. <artifactId>mybatis-spring-boot-starter</artifactId>
  45. <version>2.0.1</version>
  46. </dependency>
  47. <dependency>
  48. <groupId>mysql</groupId>
  49. <artifactId>mysql-connector-java</artifactId>
  50. <scope>runtime</scope>
  51. </dependency>
  52. <dependency>
  53. <groupId>org.springframework.boot</groupId>
  54. <artifactId>spring-boot-starter-test</artifactId>
  55. <scope>test</scope>
  56. </dependency>
  57. </dependencies>
  58. <build>
  59. <!-- plugins>
  60. <plugin>
  61. <groupId>org.springframework.boot</groupId>
  62. <artifactId>spring-boot-maven-plugin</artifactId>
  63. </plugin>
  64. </plugins -->
  65. </build>
  66. </project>

子模块oyster-common

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <!-- 注意此处 -->
  6. <parent>
  7. <groupId>org.tanglizi</groupId>
  8. <artifactId>oyster</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <relativePath>../pom.xml</relativePath>
  11. </parent>
  12. <groupId>org.tanglizi</groupId>
  13. <artifactId>oyster-common</artifactId>
  14. <version>0.0.1-SNAPSHOT</version>
  15. <name>oyster-common</name>
  16. <description>Demo project for Spring Boot</description>
  17. <properties>
  18. <java.version>1.8</java.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-data-jpa</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-jdbc</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-starter-web</artifactId>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.mybatis.spring.boot</groupId>
  39. <artifactId>mybatis-spring-boot-starter</artifactId>
  40. <version>2.0.1</version>
  41. </dependency>
  42. <dependency>
  43. <groupId>mysql</groupId>
  44. <artifactId>mysql-connector-java</artifactId>
  45. <scope>runtime</scope>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.springframework.boot</groupId>
  49. <artifactId>spring-boot-starter-test</artifactId>
  50. <scope>test</scope>
  51. </dependency>
  52. </dependencies>
  53. <build>
  54. <!-- plugins>
  55. <plugin>
  56. <groupId>org.springframework.boot</groupId>
  57. <artifactId>spring-boot-maven-plugin</artifactId>
  58. </plugin>
  59. </plugins -->
  60. </build>
  61. </project>

oyster-front

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <!-- 注意此处 -->
  6. <parent>
  7. <groupId>org.tanglizi</groupId>
  8. <artifactId>oyster</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <relativePath>../pom.xml</relativePath>
  11. </parent>
  12. <groupId>org.tanglizi</groupId>
  13. <artifactId>oyster-front</artifactId>
  14. <version>0.0.1-SNAPSHOT</version>
  15. <name>oyster-front</name>
  16. <description>Demo project for Spring Boot</description>
  17. <properties>
  18. <java.version>1.8</java.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.tanglizi</groupId>
  23. <artifactId>oyster-common</artifactId>
  24. <version>0.0.1-SNAPSHOT</version>
  25. <!-- scope>compile</scope -->
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-starter-data-jpa</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.springframework.boot</groupId>
  33. <artifactId>spring-boot-starter-jdbc</artifactId>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.springframework.boot</groupId>
  37. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.springframework.boot</groupId>
  41. <artifactId>spring-boot-starter-web</artifactId>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.mybatis.spring.boot</groupId>
  45. <artifactId>mybatis-spring-boot-starter</artifactId>
  46. <version>2.0.1</version>
  47. </dependency>
  48. <dependency>
  49. <groupId>org.springframework.boot</groupId>
  50. <artifactId>spring-boot-configuration-processor</artifactId>
  51. <optional>true</optional>
  52. </dependency>
  53. <dependency>
  54. <groupId>com.vladsch.flexmark</groupId>
  55. <artifactId>flexmark-all</artifactId>
  56. <version>0.42.6</version>
  57. </dependency>
  58. <dependency>
  59. <groupId>com.alibaba</groupId>
  60. <artifactId>druid</artifactId>
  61. <version>1.1.16</version>
  62. </dependency>
  63. <dependency>
  64. <groupId>mysql</groupId>
  65. <artifactId>mysql-connector-java</artifactId>
  66. <scope>runtime</scope>
  67. </dependency>
  68. <dependency>
  69. <groupId>org.springframework.boot</groupId>
  70. <artifactId>spring-boot-starter-test</artifactId>
  71. <scope>test</scope>
  72. </dependency>
  73. </dependencies>
  74. <build>
  75. <!-- plugins>
  76. <plugin>
  77. <groupId>org.springframework.boot</groupId>
  78. <artifactId>spring-boot-maven-plugin</artifactId>
  79. <executions>
  80. <execution>
  81. <goals>
  82. <goal>repackage</goal>
  83. </goals>
  84. </execution>
  85. </executions>
  86. </plugin>
  87. </plugins -->
  88. </build>
  89. </project>

oyster-runner

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <!-- 注意此处 -->
  6. <parent>
  7. <groupId>org.tanglizi</groupId>
  8. <artifactId>oyster</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <relativePath>../pom.xml</relativePath>
  11. </parent>
  12. <groupId>org.tanglizi</groupId>
  13. <artifactId>oyster-runner</artifactId>
  14. <version>0.0.1-SNAPSHOT</version>
  15. <name>oyster-runner</name>
  16. <description>Demo project for Spring Boot</description>
  17. <properties>
  18. <java.version>1.8</java.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.tanglizi</groupId>
  23. <artifactId>oyster-front</artifactId>
  24. <version>0.0.1-SNAPSHOT</version>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.tanglizi</groupId>
  28. <artifactId>oyster-api</artifactId>
  29. <version>0.0.1-SNAPSHOT</version>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.tanglizi</groupId>
  33. <artifactId>oyster-common</artifactId>
  34. <version>0.0.1-SNAPSHOT</version>
  35. <!--scope>compile</scope-->
  36. </dependency>
  37. </dependencies>
  38. <build>
  39. <plugins>
  40. <plugin>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-maven-plugin</artifactId>
  43. <!--
  44. 注意此处
  45. [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project oyster-front: Compilation failure: Compilation failure:
  46. [ERROR] /home/tanglizi/IdeaProjects/oyster/oyster-front/src/main/java/org/tanglizi/oyster/controllers/SearchController.java:[8,40] package org.tanglizi.oyster.dto.entities does not exist
  47. -->
  48. <executions>
  49. <execution>
  50. <goals>
  51. <goal>repackage</goal>
  52. </goals>
  53. </execution>
  54. </executions>
  55. </plugin>
  56. </plugins>
  57. </build>
  58. </project>

Maven+SpringBoot多模块的细节

待续

记Spring搭建功能完整的个人博客「Oyster」全过程[其二] Idea中Maven+SpringBoot多模块项目开发的设计和各种坑(模块间依赖和打包问题)的更多相关文章

  1. 记Spring搭建功能完整的个人博客「Oyster」全过程[其一] 整体思路:需求、架构及技术要求

    一两个星期前正在了解Linux内核,看得有点累,突然想趁着五一放假写个博客学学spring. 由于没有在一开始下定决心写这个博客系统,所以我又没记录一开始的分析过程.这都是写了一个星期之后的思路了. ...

  2. Java EE 学习(9):IDEA + maven + spring 搭建 web(5)- 博客文章管理

    转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) . 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) Jav ...

  3. python drf+xadmin+react+dva+react-native+sentry+nginx 搭建前后端分离的博客完整平台

    前言: 经过差不多半年的开发,搭建从前端到服务器,实现了前后端分离的一个集PC端.移动端的多端应用,实属不易,今天得空,好好写篇文章,记录这些天的成果.同时也做个分享. 演示网站地址: http:// ...

  4. LNMP环境搭建之php安装,wordpress博客搭建

    LNMP环境搭建之php安装,wordpress博客搭建 一.介绍: 1.什么是CGI CGI全称是"通用网关接口"(Common Gateway Interface),HTTP服 ...

  5. 搭建自己的 github.io 博客

    1.前言 github.io 是基于 Github 的 repo 管理,这意味着咱们对其是有绝对的控制,这个跟放在第三方的平台比,可控性要好太多. 使用 github pages 服务搭建博客的好处有 ...

  6. 搭建minima主题的github博客网站

    layout: post title: "搭建minima主题的github博客网站" date: 2019-04-20 19:20:20 +0800 --- 作者:吴甜甜 个人博 ...

  7. HHvm Apache 2.4 Nginx建站环境搭建方法安装运行WordPress博客

    HHvm Apache 2.4 Nginx建站环境搭建方法安装运行WordPress博客 VPS主机   2014年06月02日 17:20   评论»       文章目录 Debian上安装 Ce ...

  8. 初学者入门:使用WordPress搭建一个专属自己的博客

    体验简介 阿里云云起实验室提供相关实验资源,点击前往  场景将提供一台基础环境为CentOS 的ECS(云服务器)实例,这台服务器上已经内置LAMP环境.我们将会在这台服务器上安装 WordPress ...

  9. Mac 上搭建基于 Hexo + GitHub 个人博客

    环境配置 本人电脑系统:macOS Node.js 生成静态页面.安装Node.js Git 用于将本地 Hexo 内容提交到 Github.Xcode自带Git(前提:macOS已经安装了Xcode ...

随机推荐

  1. git 强制pull

    git fetch --all git reset --hard origin/master git pull

  2. ASP.NET--MVC--伪静态

    原文地址 以前伪静态很流行主要是为了SEO优化排名,现在搜索引擎对静态网站和动态网站的权重差不多了,就没有必要再伪静态了,个人意见,仅供参考. 有些客户要求设置静态的,为了完成需求,而且更简单的做法就 ...

  3. [bzoj1084][SCOI2005]最大子矩阵_动态规划_伪·轮廓线dp

    最大子矩阵 bzoj-1084 SCOI-2005 题目大意:给定一个n*m的矩阵,请你选出k个互不重叠的子矩阵使得它们的权值和最大. 注释:$1\le n \le 100$,$1\le m\le 2 ...

  4. winrar为啥有广告了?能去掉么?

    winrar为啥有广告了?能去掉么? 学习了:http://blog.csdn.net/chenchunlin526/article/details/54580686 学习了:https://jing ...

  5. 在Map对象中获取属性,注意判断为空

    在Map对象中获取属性,注意判断为空 public static void main(String[] args) { Map map = new HashMap(); Integer i = (In ...

  6. java基础开发—jstl标签库

    在DRP项目中.接触到了JSTL标签库. 在未使用Jstl之前,我们使用JSP脚本实现一些声明或是表达式任务,做一些业务相关操作时,须要在页面中嵌入大量的java代码.在DRP项目开发前期.使用jsp ...

  7. QT4.86写中文XML

    网上都语焉不详.举例XML使用的时候,全部都是英文内容,当然不会失败了.尤其我还以VS2008编译,编译器的Character Set就有三种设置,配上QTextCodec::setCodecForC ...

  8. POJ2576 Tug of War 二维背包

    题目大意 一群人拔河,给出每个人的重量,要求两队人数之差不超过1人,且每队总重量之差最小. 思路 选出严格总人数一半(或+1)的人为一队,在该队重量不超过所有人总重量一半的情况下,使其重量最大. 人数 ...

  9. Java 异步转同步 ListenableFuture in Guava

    ListenableFuture的说明 并发编程是一个难题,但是一个强大而简单的抽象可以显著的简化并发的编写.出于这样的考虑,Guava 定义了 ListenableFuture接口并继承了JDK c ...

  10. 寒武纪芯片——有自己的SDK,支持tf、caffe、MXNet

    寒武纪芯片 产品中心>智能处理器IP 智能处理器IP MLU智能芯片 软件开发环境 Cambricon-1A 高性能硬件架构及软件支持兼容Caffe.Tensorflow.MXnet等主流AI开 ...