美文网首页
最详细的 Spring Boot 多模块开发与排坑指南

最详细的 Spring Boot 多模块开发与排坑指南

作者: 怪瘦Java | 来源:发表于2020-03-26 19:58 被阅读0次

    创建项目

    创建一个 SpringBoot 项目非常的简单,简单到这里根本不用再提。你可以在使用 IDEA 新建项目时直接选择 Spring Initlalize 创建一个 Spring Boot 项目,也可以使用 Spring 官方提供的 Spring Boot 项目生成页面得到一个项目。

    下面介绍一下使用 Spring 官方生成的方式,如果你已经有了一个 Spring Boot 项目,这部分可以直接跳过

    打开 https://start.spring.io/ 

    填写 group 和 Artifact 信息,选择依赖(我选择了 Spring Web 和 Lombok )。

    spring 官网创建初始项目

    点击 Generate 按钮下载项目。

    打开下载的项目,删除无用的 .mvn 文件夹,mvnw 、 mvnw.cmd 、HELP.md 文件。

    到这里已经得到了一个 Spring Boot 初始项目了,我们直接导入到 IDEA 中,看一眼 pom.xml 的内容。

    <?xml version="1.0" encoding="UTF-8"?>

    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    4.0.0

    org.springframework.boot

    spring-boot-starter-parent

    2.2.5.RELEASE

    <!-- lookup parent from repository -->

    com.wdbyte

    springboot-module-demo

    0.0.1-SNAPSHOT

    springboot-module-demo

    Demo project for Spring Boot

    1.8

    org.springframework.boot

    spring-boot-starter-web

    org.projectlombok

    lombok

    true

    org.springframework.boot

    spring-boot-starter-test

    test

    org.junit.vintage

    junit-vintage-engine

    org.springframework.boot

    spring-boot-maven-plugin

    把目录结构调整成自己想要的结构,然后添加 controller 和 entity 用于测试。

    项目目录结构

    ProductController 类源代码。

    @RestController

    @RequestMapping("/product")

    publicclassProductController{

    /**

    * 获取商品列表

    *

    *@return

    */

    @GetMapping("/list")

    publicMaplist(){

    // 模拟查询商品逻辑

    Product product =newProduct();

    product.setProductName("小米粥");

    product.setProductPrice(newBigDecimal(2.0));

    product.setProductStock(100);

    Map resultMap =newHashMap<>();

    resultMap.put("code",000);

    resultMap.put("message","成功");

    resultMap.put("data", Arrays.asList(product));

    returnresultMap;

    }

    }

    Product 类源代码。

    @Data

    publicclassProduct{

    /** 商品名称. */

    privateString productName;

    /** 商品价格. */

    privateBigDecimal productPrice;

    /** 商品库存。*/

    privateintproductStock;

    }

    模块化

    借助 IDEA 工具可以快速的把项目改造成 maven 多模块,这里我们把准备测试 demo 拆分为 common 和 web 两个模块,common 模块存放实体类。web 模块存放 controller 层(这里项目虽小,拆分只是为了演示)。话不多说,直接开始。

    配置主 pom.xml 打包方式 为 pom

    <?xml version="1.0" encoding="UTF-8"?>

    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    4.0.0

    <!-- 配置主 pom 打包方式为 pom -->

    pom

    ....

    ....

    创建 common 模块

    项目直接 new -> module。

    创建模块

    选择 maven -> next,填写模块名称。

    填写模块名称

    继续 next 完成模块创建。

    创建 web 模块

    web 模块的创建和 common 模块如出一辙,不再赘述。完成两个模块的创建之后,你会发现你的主 pom.xml 文件里自动添加了 module 部分。

    product-common

    product-web

    移动代码到指定模块

    移动 Product.java 到 product-common 模块,其他部分代码和 resource 部分直接移动到 product-web 模块,移动完后你的代码结构是这个样子。

    多模块目录结构

    到这里,多模块已经拆分完成了, 但是 ProductController 代码里的红色警告让你发现事情还没有结束。

    依赖管理

    处理依赖问题

    你发现了代码里的红色警告,不过你也瞬间想到了是因为把 Product 类移动到了 product-common 模块,导致这里引用不到了。

    红色警告

    然后你查看了下 product-common 模块的 pom.xml 里的内容。

    <?xml version="1.0" encoding="UTF-8"?>

    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">

    springboot-module-demo

    com.wdbyte

    0.0.1-SNAPSHOT

    4.0.0

    product-common

    机智的在 Product-web 模块的 pom.xml 里引入 product-common,手起键落,轻松搞定。

    <?xml version="1.0" encoding="UTF-8"?>

    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">

    springboot-module-demo

    com.wdbyte

    0.0.1-SNAPSHOT

    4.0.0

    product-web

    com.wdbyte

    product-common

    满心欢喜的你快速的点击 Build->  Build Project,得到的 Error 警告刺痛了顶着黑眼圈的你。

    不过你还是迅速定位了问题,查看 maven 依赖,你发现是因为没有指定 product-common 依赖的版本号。

    报错信息

    原来如此,因为没有指定版本号,我们指定上不就完事了嘛。在最外层的主 pom.xml 中添加 <dependencyManagement> 添加上指定依赖和要指定的版本号。

    com.wdbyte

    product-common

    0.0.1-SNAPSHOT<!-- maven 打包默认 0.0.1-SNAPSHOT 版本 -->

    刷新 maven ,发现项目已经不报错了,编译成功,运行启动类,熟悉的 Spring logo 又出现在眼前。

    优化依赖

    是的,Spring Boot 应用在改造成多模块后成功运行了起来,但是你貌似发现一个问题,模块 common 和模块 web 都继承了主 pom ,主 pom 中有 Lombok 、Spring Boot Web 和  Spring Boot Test 依赖,而 common 模块里只用到了 Lombok 啊,却一样继承了 Spring Boot 其他依赖,看来还是要改造一把。

    1只有 common 模块用到的依赖移动到 common 模块。

    2.只有 web 模块用到的依赖移动到 web 模块。

    3.抽取用到的版本号到 <properties>,这里抽取 common 模块的依赖版本。

    到这里最外层主 pom 的内容是这样的。

    看似完美,重新  Build->  Build Project ,发现一切正常,运行发现一切正常,访问正常。

    访问接口

    打包编译

    好了,终于到了最后一步了,你感觉到胜利的曙光已经照到了头顶,反射出耀眼的光芒。接着就是 mvn package。

    ERROR 让你伤心了,但是你还是从报错中寻找到了一些蛛丝马迹,你看到是  spring-boot-maven-plugin 报出的错误。重新审视你的主 pom 发现 <build> 编译插件用到了 spring-boot-maven-plugin。

    略加思索后将这段移动到 web 模块的 pom,因为这是 Spring Boot 的打包方式,现在放在主 pom 中所有的模块都会继承到,那么对于 common 模块来说是肯定不需要的。

    移动后重新打包,不管你是运行命令 mvn package 还是双击 IDEA 中的 maven 管理中的 package ,想必这时候你都已经打包成功了

    IDEA 打包

    在 web 模块下的目录 target 里也可以看到打包后的 jar 文件 product-web-0.0.1-SNAPSHOT.jar。可以使用 java 命令直接运行。

    想必少了点什么,多模块不仅为了结构清晰,更是为了其他项目可以复用模块(如 common 模块),现在这个时候如果你新打开了一个项目,依赖 common 发现是引用不到的,因为你需要把模块安装到本地仓库。可以点击 IDEA -> Maven -> install,也可以通过 maven 命令。

    重新引入发现没有问题了。

    文中代码已经上传到 Github:niumoo/springboot

    v:BNing99

    相关文章

      网友评论

          本文标题:最详细的 Spring Boot 多模块开发与排坑指南

          本文链接:https://www.haomeiwen.com/subject/ozhhuhtx.html