构建一个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!这样这个问题就解决了!!

(0)

相关推荐

  • 一文搞懂 Maven 原理

    作者简介大数据研发工程师,主要研究 Hive,Presto,Spark 等计算引擎.有任何问题,欢迎大家随时联系:- 知乎: tkanng- GitHub: tkanng- Email: tkanng ...

  • 技术贴 | R语言:构建一个转录代谢互作调控网络:(二)热图的美化以及大样本分组信息的快速注释

    本文由可爱的乔巴根据实践经验而整理,希望对大家有帮助. 原创微文,欢迎转发转载. 导读 上期介绍了利用WGCNA包中的Cor函数和corPvalueStudent函数计算两组小样本的相关性并进行热图可 ...

  • 构建一个高胜率交易体系

    构建完善的交易体系:走出交易迷宫的必要条件 1. 我们做交易其实初期的时候都会感到迷茫,甚至你做了好多年之后,其实还会处于在一个迷茫期,在一个负和的市场中,到底交易怎么做?怎么才能走出交易的迷宫?在我 ...

  • 《投资要义》节选——如何快速构建一个跑赢指数的投资组合

    股票(Stock)是股份公司发行的所有权凭证,是股份公司为筹集资金而发行给各个股东作为持股凭证并借以取得股息和红利的一种有价证券.每股股票都代表股东对企业拥有一个基本单位的所有权.每只股票背后都有一家 ...

  • 构建一个充满凝聚力的班集体

    著名的教育家魏书生说:"班级就像一个大家庭,同学们如兄弟姐妹般互相关心着.帮助着,互相鼓舞着.照顾着,一起长大了.成熟了,便离开这个家庭,走向了社会."的确,一个良好的班集体始终激 ...

  • 全方位实例解析:如何构建一个有效的逆势交易策略系统

    在社交媒体或各种交易论坛上,"趋势交易策略"往往受到大肆吹捧.然而,专注"逆势交易或反趋势交易策略"的介绍却寥寥无几.本文我们将定义和讨论逆势交易的基本要素,并 ...

  • 如何构建一个好的盈利模式?

    投资体系系列文章之三:盈利模式 股票投资也有盈利模式 我之前认识了一个股友,他特别爱买那些受到行业负面事件冲击的优质企业.几年来,先后靠此抓住了茅台.中兴通讯.隆基股份等投资机会. 我想,很多人都有这 ...

  • 包政:构建一个真正的管理体系

    管理体系的目的,不仅要提高效率,而且要创造财富.按照德鲁克的说法,不仅是提高企业的绩效,还应该使现有的资源能够创造出更多的物质财富或价值.更重要的还有,培育功能型的团队,培养后期的经理人才. 文 70 ...

  • 如何为自己构建一个良好的知识体系?

    知识体系对一个人有多重要呢?举个例子,盖房子要有图纸,除非是垒个鸡窝,用眼睛看一下,再把砖一块一块摞起来就行.否则,只要是想盖个像模像样的房子,就一定要有图纸.而知识体系对于一个人来说,就好像图纸对于 ...

  • 威海玄同太极拳馆,玄同说太极:太极拳,手脚的螺旋,是在构建一个螺旋的气场

    太极拳讲不顶不丢,先得是心的不顶不丢,看一个人,如果说话办事不太极,那他的拳一定不高级.就好比手电筒里塞两土豆,还照什么亮. 天地是太极的,所以心的太极,才得到天地的能量:心念出问题了,一定身体出问题 ...