分模块设计与开发:
- 都写在一个模块里面。使的各模块之间不便于维护,并且难以复用。
- 将项目按照功能拆分成若干个子模块,方便项目的管理维护、扩展,也方便模块间的相互调用,资源共享。
分析:
拆分后的格式:
步骤:
- 创建maven模块 tlias-pojo,存放实体类。
- 创建maven模块 tlias-utils,存放相关工具类。
注意:
1,我们创建新的module(模块的时候,要把我们新的模块的包名,改成和未拆分前一样的包名)
创建一个新的空工程 web-project4:
空工程jdk的配置:
配置jdk21版本:
把我们之前写好的 tlias-management。放在刚刚创建的web-project4。空工程中
打开ideal:
开始拆分:
把pojo包下的,类重新创建一个模块,拆分过去(创建新的module然后放到新模块的pojo包下)新建 tlias-pojo模块
tlias-pojo模块创建好,的样子。
然后定义 com.sde.pojo包,这个包和未拆分前项目的包路径保持一致。
把要拆分的项目,pojo包下的类赋值到刚刚创建的,新模块 tlias-pojo 的pojo包下
可以发现很多爆红的地方。
在 tlias-pojo模块下的 pom文件里面引入依赖。
XML
<!--引入依赖-->
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
</dependencies>
在此查看实体类,发现不报错了。
删除要拆分模块的pojo包
项目报错:
引入 tlias-pojo模块:
XML
<!--tlias-pojo-->
<dependency>
<groupId>com.sde</groupId>
<artifactId>tlias-pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
现在就不报错了
把要拆分工程的utils包,也拆分开。
创建新的tlias-utils新模块
重复上面的步骤,创建com.sde.utils包,把要拆分工程utis包下的类,复制到tlias-utils模块下的utils包。
引入依赖:
引入好依赖,就不报错了。
然后,把父工程中的com.sde.utils包删除,引用tilas-utils模块下的utils包
引入依赖。
现在就不报错了。
启动项目测试:
注意:
- 分模块开发需要先针对模块功能进行设计,再进行编码。不会先将工程开发完毕,然后进行拆分
- 因为这次我们是为了演示拆分,后面写项目肯定是先设计好,才写代码的。
继承与聚合:
继承:
概念:
继承描述的是两个工程间的关系,与java中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承。
作用:
简化依赖配置、统一管理依赖
实现:
<parent> ... </parent>
java中打包方式:
- jar:普通模块打包,springboot项目基本都是jar包(内嵌tomcat运行)
- war:普通web程序打包,需要部署在外部的tomcat服务器中运行
- pom:父工程或聚合工程,该模块不写代码,仅进行依赖管理
实现步骤:
①. 创建maven模块tlias-parent,该工程为父工程,设置打包方式pom(默认jar)。
②. 在子工程的pom.xml文件中,配置继承关系。
③. 在父工程中配置各个工程共有的依赖(子工程会自动继承父工程的依赖)。
1,新建tlias-parent模块作为父工程,把父工程的打包方式设置为pom:
父工程添加spring boot的父依赖。
其他三个子工程,tlias-utils和tlias-pojo和tlias-mangement继承父工程(tlias-parent)
在tlias-pojo引入父工程依赖。
引入后:
在tlias-utils模块中,引入父工程依赖。
在tlias-management子工程中,引入tilas-parent依赖。
把,子工程中共有的依赖,提取到父工程,然后删除,子工程中共有的依赖。
先删了 tlias-pojo里面的。
删除tlias-utils子工程里面的。
删除tlias-management子工程里面的依赖。
由于我们的三个子工程依赖了,父工程tlias-parent。所以我们在右侧的maven中,看看三个子工程中是否有,父工程中的依赖。
版本锁定:
在maven中,可以在父工程的pom文件中通过 <dependencyManagement> 来统一管理依赖版本。
注意:子工程引入依赖时,无需指定 <version> 版本号,父工程统一管理。变更依赖版本,只需在父工程中统一变更。
自定义属性/引用属性
- 1,在父工程引入dependcyManagement标签,进行版本管理,里面填写我要进行集中依赖。
- 2,父工程里面的properties标签中,定义需要进行版本管理的依赖。里面填写的是我定义此依赖的版本号。
- 在dependcyManagement标签中,替换掉版本号(用properties标签中定义的版本号)
- 在dependencis标签中,引入需要的依赖,版本号,引用定义在properties标签中的。
代码:
XML
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 自定义属性-->
<springboot.version>3.2.0</springboot.version>
<lombok.version>1.18.30</lombok.version>
<jwt.version>0.9.0</jwt.version>
<aliyun.sdk.oos.version>3.15.1</aliyun.sdk.oos.version>
<jaxb.api.version>2.3.1</jaxb.api.version>
<activation.version>1.1.1</activation.version>
<javaxb.runtime.version>2.3.3</javaxb.runtime.version>
</properties>
使用dependcyManagement:
代码:
XML
<!--依赖管理-->
<dependencyManagement>
<dependencies>
<!--jwt-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jwt.version}</version>
</dependency>
<!--阿里云oss-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>${aliyun.sdk.oos.version}</version>
</dependency>
<!-- jdk1.9版本以上需要额外加上面三个依赖-->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>${jaxb.api.version}</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>${activation.version}</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>${javaxb.runtime.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
在父工程 dependcies标签中,引入需要传递的依赖。
XML
<!-- 直接依赖 子工程直接引入-->
<dependencies>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!--spring的基础依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${springboot.version}</version>
</dependency>
</dependencies>
总体预览:
父工程pom的整体代码:
XML
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.sde</groupId>
<artifactId>tlias-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 自定义属性-->
<springboot.version>3.2.0</springboot.version>
<lombok.version>1.18.30</lombok.version>
<jwt.version>0.9.0</jwt.version>
<aliyun.sdk.oos.version>3.15.1</aliyun.sdk.oos.version>
<jaxb.api.version>2.3.1</jaxb.api.version>
<activation.version>1.1.1</activation.version>
<javaxb.runtime.version>2.3.3</javaxb.runtime.version>
</properties>
<!-- 直接依赖 子工程直接引入-->
<dependencies>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!--spring的基础依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${springboot.version}</version>
</dependency>
</dependencies>
<!--依赖管理-->
<dependencyManagement>
<dependencies>
<!--jwt-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jwt.version}</version>
</dependency>
<!--阿里云oss-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>${aliyun.sdk.oos.version}</version>
</dependency>
<!-- jdk1.9版本以上需要额外加上面三个依赖-->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>${jaxb.api.version}</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>${activation.version}</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>${javaxb.runtime.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
把子工程的依赖版本号去掉:
测试:
我就以jwt令牌为例,测试。改变版本号,子工程里面依赖的版本号是否会变化。
现在把jwt令牌改成0.9.1测试看效果:
可以发现所有的jwt令牌,版本全都变成0.9.1
我在把jwt令牌,的版本改成 0.9.0 看看其他子工程是否有变化。
启动测试:
dependcies和dependcyManagement的区别:
- <dependencies> 是直接依赖,在父工程配置了依赖,子工程会直接继承下来。
- <dependencyManagement> 是统一管理依赖版本,不会直接依赖,还需要在子工程中引入所需依赖(无需指定版本)
聚合:
创建tlias-parent父工程:
由于父工程,只存在pom文件即可。把其他的src目录删掉即可。
加入我们要打包,tlias-management此模块, 但是我们发现每次打包packing都会报错,原因是我们在此pom文件中,引用了tlias-pojo模块,tlias-utils模块,这些文件。在我们的本地仓库都没有,所有就报错了。解决办法还需要先把引用到的模块先install,安装到本地仓库。
测试非聚合打包:
1,禁用单元测试:
2,在tlias-management工程中点击打包(packing)。
可以发现,无法正常打包,我们需要把tlias-pojo和tlias-utils先install安装到本地才可以。
先安装tlias-pojo模块。
看看我们本地的maven仓库有没有,多的tlias-pojo包。
我们在测试tlias-management的打包。
可以看到还是打包失败了。
tlias-utils模块进行install安装。
把我们的父工程tlias-parent也安装到本地:
在我本地的maven仓库查看:
点击测试打包tlias-management工程:
打包成功了
聚合:
将多个模块组织成一个整体,同时进行项目的构建。
聚合工程:
不具有业务功能的"空"工程(有且仅有一个pom文件)
就是父工程里面之后一个pom.xml配置文件
作用:
快速构建项目(无需根据依赖关系手动构建,直接在聚合工程上构建即可)
可以发现,我们使用这种继承各个模块 ,要是想打包显得很麻烦,所以我们需要使用聚合工程。
maven中可以通过 <module> 设置当前聚合工程所包含的子模块名称。
这是在父工程里面添加的。
代码:
XML
<!-- 聚合工程-->
<modules>
<module>../tilas-management</module>
<module>../tlias-pojo</module>
<module>../tlias-utils</module>
</modules>
效果:
我们在继承的时候,交父工程,在聚合的时候交聚合工程。
注意:
聚合工程中所包含的模块,在构建时,会自动根据模块间的依赖关系设置构建顺序,与聚合工程中模块的配置书写位置无关。
现在我们把我们本地的maven仓库,刚刚安装(install)好的,那三个文件删除。在对tlias-management进行打包。
删除后:
前面已经看到,聚合之后,其他三个子工程已经归属到,tlias-paretn工程下了,所以我们点击此模块的package:
点击打包:
在idea查看效果:
私服:
介绍:
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的中央仓库,用于解决团队内部的资源共享与资源同步问题
依赖查找顺序:
- 本地仓库
- 私服
- 中央仓库
资源上传与下载:
项目版本:
- RELEASE(发行版本):功能趋于稳定、当前更新停止,可以用于发行的版本,存储在私服中的RELEASE仓库中。
- SNAPSHOT(快照版本):功能不稳定、尚处于开发中的版本,即快照版本,存储在私服的SNAPSHOT仓库中
资源上传和下载的步骤:
- 1,设置私服的访问用户名/密码。maven中conf文件夹下的(settings.xml中的servers中配置)。
- 2,在 mirrors 中只配置我们自己私服的连接地址(如果之前配置过阿里云,需要直接替换掉)。
- 3,需要在 profiles 中,增加如下配置,来指定snapshot快照版本的依赖,依然允许使用。
- 4,如果要把项目上传到自己的私服,需要在pom.xml文件中增加如下配置,来配置项目发布的地址(也就是私服的地址)
1,在setting.xml配置文件中配置:
XML
<servers>
<!-- server
| Specifies the authentication information to use when connecting to a particular server, identified by
| a unique name within the system (referred to by the 'id' attribute below).
|
| NOTE: You should either specify username/password OR privateKey/passphrase, since these pairings are
| used together.
|
<server>
<id>deploymentRepo</id>
<username>repouser</username>
<password>repopwd</password>
</server>
-->
<server>
<id>maven-releases</id>
<username>admin</username>
<password>admin</password>
</server>
<server>
<id>maven-snapshots</id>
<username>admin</username>
<password>admin</password>
</server>
<!-- Another sample, using keys to authenticate.
<server>
<id>siteServer</id>
<privateKey>/path/to/private/key</privateKey>
<passphrase>optional; leave empty if not used.</passphrase>
</server>
-->
</servers>
2,在maven的settings.xml文件中的,mirrors标签中配置。
XML
<mirrors>
<!-- 阿里云仓库 -->
<!-- <mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror> -->
<mirror>
<id>maven-public</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
3,在maven的settings.cml配置文件中的profiles标签里面,指定快照版本依赖。
XML
<profiles>
<profile>
<id>allow-snapshots</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>maven-public</id>
<url>http://localhost:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
回到idea重新加载一下:
在父工程的pom.xml文件中配置:
XML
<distributionManagement>
<!-- release版本的发布地址 -->
<repository>
<id>maven-releases</id>
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>
<!-- snapshot版本的发布地址 -->
<snapshotRepository>
<id>maven-snapshots</id>
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
在我们的maven中,通过deploy生命周期(发布即可),跳过单元测试。
点击:tlias-parent父工程的deploy,进行上传:
上传成功后,在我们自己的私服查看。
进入到快照版本后,就能看到了。
本地maven仓库也能看到:
我们在本地maven仓库删掉,这三个tilas-开头的文件,看看私服会变化吗?
在浏览器刷新一下:maven-snapshots快照版本
查看:maven-public:
更改快照版本,上传到发行版本:
刚刚我们上传的,为啥上传到了 maven-snapshots(快照版了呢)
查看tlias-parent的pom文件可知
- 我们默认的版本就是,SNAPSHOT(快照版)
- 我们要想上传到发行版,把这些版本后缀改成 RELEASE(发行版)
改成发行版,在测试一次。
要把父子工程里面的所有,版本从snapshot(快照版),改成release(发行版)
修改tlias-parent模块的版本:
修改tlias-mangement的发行版本:
我们发现,tlias-management工程下,引用了,tlias-pojo和tlias-utils两个模块。
修改:tlias-pojo模块
修改tlias-utils模块:
在回过头来看tlias-management工程引入的tlias-pojo和tlias-utils是否报错:
在父工程下,点解 deploy开始上传。这次是上传到maven-release(发行版)
上传成功后,刷新浏览器地址栏查看。
查看我们maven的本地仓库:
nexus私服的使用:
Nexus是一个用于管理和分发软件包的开源仓库管理器。它提供了一个集中化的存储库,可以用来存储和共享各种类型的软件包,包括Java库、Docker镜像、Maven构建等。
1,先解压,nexus压缩包:
2,点击 bin目录里面的start.bat启动:
3,启动时间可以会很长,
4,在浏览器地址栏,输入 nexus的访问地址:http://localhost:8081
登录测试:
我先输入 用户:admin 密码:111111 (进行错误测试)
在输入正确的账号和密码进行测试:
查看登录之后的效果:
查看控制台:
上传完成后,记得要把我们maven的settings.xml配置文件里面的东西删掉或者注释掉
1,添加在 servers标签里的 配置私服的个人凭证
2,配置在mirrors里面我们私服的连接地址(记得把阿里云私服打开)
3,配置在profiles里面的指定快照版本的依赖
4,还有我刚刚演示的tlias-parent里面的pom文件(上传到我们自己私服的)
1,注释servers标签里面的:
2,注释mirrors标签里的:
注释掉,profiles:
然后开idea,重新加载。
在tlias-parent的pom文件里面,注释。
刷新maven,重启项目。