构建一个maven聚合类型的横向可扩展项目
那个时候初入java这个大家庭,学习的方向很乱。毕业后,在公司磨练了一年,总想着是该交一份答卷了,可能成绩不会很好,但求及格!那么考试题目呢,我计划搭建一个横向可扩展的项目,可以在平台自扩展各种子项目,包括 后台权限控制,日志分析,秒杀,微信小程序,爱代客(www.idaike.com)项目等等,所以首先需要一个高可扩展的管理系统!
一:说说我们最早搭建的项目
可能是一个ssm、也可能是一个springboot或者其他,这个是框架本身的问题,这是一个小问题,但是你的业务代码是如何的?
这应该是一个最简单的项目结构,也是我刚刚接触java的时候,最常见的项目,但是等你的业务量越来越大的时候,你发现代码也越来越臃肿,甚至在三天后,你都不知道这段代码你有什么用!也知道无法管理。在到后来,你开始去建立子项目,去隔离不同的业务!去在项目下面建立子项目
二:建立各种子项目
这种系统框架基本能够满足项目的需求,工具包、公用包、接口和后台互补干扰,但是这种框架最坑爹的问题就是你无法剥离或者很难剥离已经停用的业务,到最后一个非常可怕的问题是 你的系统可能有10w行代码,实际上只有不到1w行代码有效!那么我们该如何做呢?
三:纵向扩展的项目模块
如图所示,在model-pojo中加入mybatis-plus的jar包和spring-web的jar包,spring-web为上层model提供@controller和@service注解!这样在每个自模块中都有属于自己的controller和service,然后在model-web中扫码这些模块,并打包发布!如图所示,如果我不在需要model-log,那我在model-web.xml中不在依赖这个jar包即可,这样我就可以直接移除掉model-log这个文件下掉所有内容了,当然模块与模块之间也可以相互依赖,提供了一个扩展性和延展性都非常好的后台开发项目,至于interface项目,也可以通过这种方法来完成,只不过interface面临的流量要比后台大的多.所以这种系统架构后面在介绍
四:具体的搭建方式
具体的pom依赖结构图为:
父maven中的pom.xml 主要是用来做版本控制,例如springboot的版本控制,mysql,mybatis的版本控制等,此次项目用的是springboot + mybatia-plus + jedis
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.rubber.fruit</groupId>
<artifactId>rubber-fruit</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>rubber-util</module>
<module>rubber-pojo</module>
<module>rubber-sys</module>
<module>rubber-web</module>
<module>rubber-log</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<rubber.version>1.0-SNAPSHOT</rubber.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<springboot.version>2.0.3.RELEASE</springboot.version>
<spring.version>5.0.7.RELEASE</spring.version>
<mybatis-plus.version>3.0-RELEASE</mybatis-plus.version>
<mysql-connector.version>5.1.45</mysql-connector.version>
</properties>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
我们在来看,model-pojo中的pom.xml
<parent>
<artifactId>rubber-fruit</artifactId>
<groupId>com.rubber.fruit</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.rubber.fruit</groupId>
<artifactId>rubber-pojo</artifactId>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector.version}</version>
</dependency>
<!--目的为了依赖这个包的 可以用 @controller的注解-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>com.rubber.fruit</groupId>
<artifactId>rubber-util</artifactId>
<version>${rubber.version}</version>
</dependency>
</dependencies>
请问中间可横向扩展层 model - sys的pom.xml 备注如下:
<parent>
<artifactId>rubber-fruit</artifactId>
<groupId>com.rubber.fruit</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.rubber.fruit</groupId>
<artifactId>rubber-sys</artifactId>
<dependencies>
<dependency>
<groupId>com.rubber.fruit</groupId>
<artifactId>rubber-pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
model-log中的pom.xml 配置如下
<parent>
<artifactId>rubber-fruit</artifactId>
<groupId>com.rubber.fruit</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.rubber.fruit</groupId>
<artifactId>rubber-log</artifactId>
<dependencies>
<dependency>
<groupId>com.rubber.fruit</groupId>
<artifactId>rubber-pojo</artifactId>
<version>${rubber.version}</version>
</dependency>
</dependencies>
上面父pom控制版本,下面model-pojo 提供基础数据,然后在web.pom中 引入,就可以来使用了
<groupId>com.rubber.fruit.web</groupId>
<artifactId>rubber-web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>rubber-web</name>
<description>Demo project for Spring Boot</description>
<parent>
<artifactId>rubber-fruit</artifactId>
<groupId>com.rubber.fruit</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
<!-- SpringBoot 的jar包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--项目本身的jar包-->
<dependency>
<groupId>com.rubber.fruit</groupId>
<artifactId>rubber-sys</artifactId>
<version>${rubber.version}</version>
</dependency>
<dependency>
<groupId>com.rubber.fruit</groupId>
<artifactId>rubber-log</artifactId>
<version>${rubber.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
五:遇到的问题
当我想通过model-web子项目打包生成jar包的时候,总是出现我的某一个子项目,无法被依赖的问题,并提示
*******.jar was cached in the local repository, resolution will not be reattempted until the update interval of 的错误,后面通过查阅资料,例如博客:https://blog.csdn.net/HeatDeath/article/details/79702803,网上大部分都是这种提示,但是我照做了,并没有解决问题!
后来我仔细考虑后,发现提示是该jar包从网络上下载一般,没有下载!但是我这个jar包应该是我本地的,而且,这个错误的原因也是因为maven在本地只找到啦一个不完整的jar,然后就去远程仓库中下载,这样远程仓库是肯定没有的!那么这就说明我本地压根就没有打包成功!
经过多次尝试和打磨我发现,我准备打包的子项目(model-web) 和 里面依赖的(model-sys或者model-log)都是属于(rubber-fruit)的子项目,你只打包model-web,那它依赖的其他jar肯定是找不到的,本地找不到就会去远程仓库找,那更找不到,所以就报错了。解决版本是 就是直接 package跟项目,也就是这里的rubber-fruit!这样这个问题就解决了!!