那个时候初入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!这样这个问题就解决了!!

构建一个maven聚合类型的横向可扩展项目的更多相关文章

  1. jenkins构建一个maven项目[五]

    标签(linux): jenkins 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 构建一个maven项目,即为构建java项目.模拟实验之前先把实验代码推送到 ...

  2. jenkins 构建一个maven项目

    1.首先在 全局工具配置 里配置maven的路径信息 这里因为之前已经下载了maven并放在了E盘,因此只需要在 MAVEN_HOME 添加maven文件夹的路径 如若本地还没maven,勾选 “自动 ...

  3. 【Jenkins】构建一个maven项目

    一 .Ubuntu18.04安装Maven 官方安装文档:http://maven.apache.org/install.html ①去官网下载maven: ②解压到/opt/maven目录(我安装在 ...

  4. 使用jenkins构建一个maven项目

    1.登陆到jenkins首页,创建项目-->选择maven-->输入项目名称-->选择项目类型 2.进入项目配置:{先写一下项目描述和设置下保留的历史构建,然后向下拉} 找到源吗管理 ...

  5. 构建Maven聚合工程

    最近,准备构建一个Maven的项目,基于模块化的结构思想,决定使用Maven的聚合工程进行构建. 环境准备: (1)eclipse 这里推荐使用spring封装的eclipse(即STS) ,STS中 ...

  6. 学习一下 SpringCloud (一)-- 从单体架构到微服务架构、代码拆分(maven 聚合)

    一.架构演变 1.系统架构.集群.分布式系统 简单理解 (1)什么是系统架构? [什么是系统架构?] 系统架构 描述了 在应用程序内部,如何根据 业务.技术.灵活性.可扩展性.可维护性 等因素,将系统 ...

  7. Eclipse的maven构建一个web项目,以构建SpringMVC项目为例

    http://www.cnblogs.com/javaTest/archive/2012/04/28/2589574.html springmvc demo实例教程源代码下载:http://zuida ...

  8. Maven- 使用Maven构建一个可执行jar

    How to Create an Executable JAR with Maven 1.最重要的是使用jar类型,<packaging>jar</packaging>.当然不 ...

  9. MAVEN学习-第一个Maven项目的构建

    MAVEN安装成功之后就可以进行项目的构建和管理了: 为什么要用maven进行项目的构建和管理? 对于初学者来说一个最直接的也是最容易里的优点在于JAR包的管理,相对于以前开发一个项目的时候我们需要用 ...

随机推荐

  1. C#实现多级子目录Zip压缩解压实例

          参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩,类似winrar,可以选择 ...

  2. Ubuntu16.04下搭建mysql + uwsgi + nginx环境启动flask 项目

    1.安装mysql Sudo apt-get install mysql 配置mysql的数据存储路径,默认在 /var/lib/mysql sudo cp -R /var/lib/mysql/* / ...

  3. django logging

    LOG_LEVEL = 'DEBUG' LOGGING = { 'version' : 1, 'disable_existing_loggers' : True, 'formatters' : { ' ...

  4. Navicat for MySQL破解版安装

    https://pan.baidu.com/s/1OfFPvqrTqbUAC_Eqq2i0KA 提取码:jgep 点击第一个应用程序一路安装即可. 安装成功之后,再点击第二个应用程序PatchNavi ...

  5. 字符串转数字练习--String to Integer (atoi)

    Implement atoi which converts a string to an integer. The function first discards as many whitespace ...

  6. python-重载

    重载概念 重载是对继承的父类方法进行重新定义.重载可以重新定义方法还可以重新定义运算符.因为通过继承的类不一定能满足当前类的需求.在当前类中只需要修改部分内容而达到自己的需求. 重载特点 减少代码量和 ...

  7. SQL Server 事务日志文件已满,收缩日志文件(9002)

    错误如下图: 1.数据库 → 属性 → 选项 → 恢复模式 → 选择‘简单’:如下图: 2.任务 → 收缩 → 文件类型‘文件’ → 收缩模式‘在释放未使用的空间前重新组织页’,将文件收缩到K,大小填 ...

  8. centos7的主机名配置

    centos7的主机名配置 方法一:通过配置文件/etc/hostname (重启后生效) 方法二:通过命令hostnamectl  set-hostname    新主机名(会自动把主机名改为小写) ...

  9. sql 按年月日统计

    1.每年select year(ordertime) 年,sum(Total) 销售合计from 订单表group by year(ordertime) 2.每月select year(orderti ...

  10. ios copy和strong,浅拷贝和深拷贝

    copy@property (nonatomic, copy) NSString *name;self.name = mutableString;这时,name对mutableString一个深拷贝, ...