那個時候初入java這個大家庭,學習的方向很亂。畢業後,在公司磨練了一年,總想著是該交一份答卷了,可能成績不會很好,但求及格!那麼考試題目呢,我計劃搭建一個橫向可擴展的項目,可以在平臺自擴展各種子項目,包括 後臺許可權控制,日誌分析,秒殺,微信小程式,愛代客(www.idaike.com)項目等等,所 ...
那個時候初入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!這樣這個問題就解決了!!