構建一個maven聚合類型的橫向可擴展項目

来源:https://www.cnblogs.com/luffyu/archive/2019/03/27/10609514.html
-Advertisement-
Play Games

那個時候初入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!這樣這個問題就解決了!!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 該文章用於督促自己學習TypeScript,作為學筆記進行保存,如果有錯誤的地方歡迎指正 2019-03-27 16:50:03 一、什麼是TypeScript? TypeScript是javascript的超集,在ts中可以使用所有的js代碼,並對js進行了擴展,包括類型效驗,數據類型,介面等 如 ...
  • 轉發:https://www.jianshu.com/p/f581cf9360a2 背景介紹 什麼是npm? npm(node package manager)是nodejs的包管理器,用於node插件管理(包括安裝、卸載、管理依賴等), NPM是隨同NodeJS一起安裝的包管理工具,能解決Node ...
  • 微服務這幾年不可謂不火,很多技術團隊都開始在自己的項目上引入了微服務。一方面這些團隊確實很好的推動了微服務的應用和發展,另一方面也可以看到一些盲目追技術熱點的行為所帶來的危害,比如很多中小團隊對微服務的基礎知識只是做了很淺顯的瞭解就開始盲目的推動微服務的實施,最後導致了項目的失敗。 微服務要想做好是 ...
  • 學習一樣東西,我們首先要知道為什麼要學這個,或者說這個東西能起到什麼作用。這樣才能更加有目的、有效率地進行學習。 然後再問為什麼這個東西能實現這樣的效果,從而瞭解其內部的機制。 最後,再弄清楚怎麼使用,這樣才算真正學會了。 換而言之,把要學習的技能比喻成實現某一功能的函數,那麼瞭解函數的功能、函數的 ...
  • 一.自我代碼分析 1.度量: 第一次作業: 第二三次作業(改動很小,給出第三次作業結果): 2.總體自我評價: 第一次作業代碼實現糟糕,可以從代碼統計結果看到這一點,第二三次感覺比較滿意,思路順暢方法簡單可擴展性強但面向對象思想還不夠(甚至沒有繼承和介面),倒算是比較精緻的面向過程,不過類的高內聚低 ...
  • 一、作業結構分析 第一次作業: 類圖(真·一類到底) 方法複雜度、類複雜度、類間依賴 第二次作業: 類圖 方法複雜度、類複雜度、類間依賴 第三次作業: 類圖 方法複雜度、類複雜度、類間依賴 結果一目瞭然:方法複雜度、類複雜度逐漸減少;類間依賴程度增加、類的層級化更加明顯。 應用工具度量得到的結果和我 ...
  • 深層理解-棧平衡原理-底層是如何實現棧平衡的? 在iOS、android操作系統中,經常會遇到入棧出棧的操作。 那麼現在操作系統已經不需要我們去關心堆棧的操作。 比如:iOS中的ARC模式,android中的JVM都會幫我們自動釋放記憶體,自動保持堆棧平衡。但是對於開發者來說,還是很有必要掌握堆棧平衡 ...
  • 對於一個的坐擁1.4億多用戶,平均日活躍用戶量超過 3400 萬,人均日訪問時長 1 小時,月累計頁面訪問量達到 230 億的大廠來說(數據截止2018年 3 月),知乎的AI都到底應用在了哪些領域,這中間應用到了哪些技術和模型,又產生了哪些作用?今日第1期數智方法論將從內容生產、內容消費與分發、內... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...