构建一个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!这样这个问题就解决了!!
构建一个maven聚合类型的横向可扩展项目的更多相关文章
- jenkins构建一个maven项目[五]
标签(linux): jenkins 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 构建一个maven项目,即为构建java项目.模拟实验之前先把实验代码推送到 ...
- jenkins 构建一个maven项目
1.首先在 全局工具配置 里配置maven的路径信息 这里因为之前已经下载了maven并放在了E盘,因此只需要在 MAVEN_HOME 添加maven文件夹的路径 如若本地还没maven,勾选 “自动 ...
- 【Jenkins】构建一个maven项目
一 .Ubuntu18.04安装Maven 官方安装文档:http://maven.apache.org/install.html ①去官网下载maven: ②解压到/opt/maven目录(我安装在 ...
- 使用jenkins构建一个maven项目
1.登陆到jenkins首页,创建项目-->选择maven-->输入项目名称-->选择项目类型 2.进入项目配置:{先写一下项目描述和设置下保留的历史构建,然后向下拉} 找到源吗管理 ...
- 构建Maven聚合工程
最近,准备构建一个Maven的项目,基于模块化的结构思想,决定使用Maven的聚合工程进行构建. 环境准备: (1)eclipse 这里推荐使用spring封装的eclipse(即STS) ,STS中 ...
- 学习一下 SpringCloud (一)-- 从单体架构到微服务架构、代码拆分(maven 聚合)
一.架构演变 1.系统架构.集群.分布式系统 简单理解 (1)什么是系统架构? [什么是系统架构?] 系统架构 描述了 在应用程序内部,如何根据 业务.技术.灵活性.可扩展性.可维护性 等因素,将系统 ...
- Eclipse的maven构建一个web项目,以构建SpringMVC项目为例
http://www.cnblogs.com/javaTest/archive/2012/04/28/2589574.html springmvc demo实例教程源代码下载:http://zuida ...
- Maven- 使用Maven构建一个可执行jar
How to Create an Executable JAR with Maven 1.最重要的是使用jar类型,<packaging>jar</packaging>.当然不 ...
- MAVEN学习-第一个Maven项目的构建
MAVEN安装成功之后就可以进行项目的构建和管理了: 为什么要用maven进行项目的构建和管理? 对于初学者来说一个最直接的也是最容易里的优点在于JAR包的管理,相对于以前开发一个项目的时候我们需要用 ...
随机推荐
- Spring Boot 入门(五):集成 AOP 进行日志管理
本篇文章是接着 Spring boot 入门(四):集成 Shiro 实现登陆认证和权限管理写的,按照前面几篇博客的教程,可以搭建一个简单的项目,主要包含了 Pagehelper+MyBatis 分页 ...
- Basic Linux Privilege Escalation
(Linux) privilege escalation is all about: Collect - Enumeration, more enumeration and some more enu ...
- SAP MM A工厂下的PR可以转成B工厂下的PO?
SAP MM A工厂下的PR可以转成B工厂下的PO? 答案是可能的,这也是SAP标准行为之一. 如下图采购申请单据, PR中的Plant是GENL.该PR 已经转成了PO,如上图. 看这个PO,工厂代 ...
- git 提交项目代码到码云步骤 以及出现错误解决办法
git initgit remote add origin 项目地址git add .git commit -m "注释"git push origin master 出现错误 $ ...
- simulink创建简单模型
创建简单模型 您可以使用 Simulink® 对系统建模,然后仿真该系统的动态行为.Simulink 允许您创建模块图,图中的各个连接模块代表系统的各个部分,信号代表这些模块之间的输入/输出关系.Si ...
- 初步了解PE分析
尝试编写代码获取PE文件的信息. 首先使用 CreateFile打开一个PE文件并返回一个用于访问该对象的handle. HANDLE CreateFile( LPCTSTR lpFileName, ...
- Thermostat:双层存储结构的透明巨页内存管理机制
这是一篇由密歇根大学的Neha Agarwal 和 Thomas F. Wenisch,发表在计算机系统顶会ASLOS的论文,Thermostat: Application-transparent P ...
- Why Ambari is setting the security protocol of the kafka to PLAINTEXTSASL instead of SASL_PLAINTEXT?
首页 / Data Ingestion & Streaming / Why Ambari is setting the security protocol of the kafka to PL ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
- numpy科学计算库的基础用法,完美抽象多维数组(原创)
#起别名避免重名 import numpy as np #小技巧:print从外往内看==shape从左往右看 if __name__ == "__main__": print(' ...