Maven完整技术汇总
额外知识点
- IDE
- IDE是集成开发环境的缩写,它是一种软件应用程序,提供了编码、调试和部署软件的一站式解决方案。这些功能集成在一起,使开发人员能够在一个环境中完成整个软件开发过程,从编写代码到调试和测试,直到最终部署。常见的IDE包括Visual Studio、Eclipse、IntelliJ IDEA、MyEclipse等。
Maven基础
-
定义
- Apache Maven是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档,官网:http://maven.apache.org/
- Maven是专门用于管理和构建Java项目的工具
-
功能
-
提供了一套标准化的项目结构—所有IDE使用Maven构建的项目结构完全一样,此时所有IDE创建的Maven项目可以通用
- 解释:你在myeclipse中写的项目在idea中就无法正常成功运行,原因是由于项目结构不一样(即目录不一样),而Maven解决了该问题
-
提供了一套标准化的构建流程(编译、测试、打包、发布、…)
- 标准化构建流程如图所示,Maven提供了一套简单的命令来完成项目的构建
-
提供了一套依赖管理机制
- 依赖管理机制就是管理项目所依赖的第三方资源,比如:jar包、插件等等
- 以往我们导入jar包的操作很繁琐(要先创建一个lib目录,然后将下载的jar包放入该目录下,最后将jar包
Add as Library
加入工作环境),而利用Maven即可不用这么繁琐 - Maven使用标准的坐标配置来管理各种依赖,它只需要简单的配置就可以完成依赖管理
-
-
Maven模型
- 项目对象模型(Project Object Moudle)
- 依赖管理模型(Dependency)
- 插件(Plugin)
-
Maven仓库定义
-
仓库(Repository)是用来存储项目依赖项(如库、框架、插件等)的地方。仓库是一个包含了各种Java类库和插件的中央集合,Maven通过仓库来查找、下载和管理项目所需的依赖项。
-
解释:假设现在有个项目1,该项目需要一个jar包,首先Maven会先去本地仓库中寻找,若本地仓库中没有,则会去中央仓库中寻找,若中央仓库中有想要的jar包,则Maven会自动将jar包下载到本地仓库中,此时项目即可利用该jar包进行工作。此时假设有个项目2,也需要项目1所需的jar包,由于项目1所需的jar包已经放到本地仓库中了,所以项目2可直接使用该jar包
-
-
Maven仓库分类
- 本地仓库:自己计算机上的一个目录
- 中央仓库:由Maven团队维护的一个全球唯一的一个仓库(地址:https://repo1.maven.org/maven2/),放的基本上都是免费的开源的jar包
- 远程仓库(私服):一般由公司团队搭建的私有仓库。(搭建的私有仓库除了会将中央仓库中的jar中均下载到私有仓库中,还会放一些自己写的jar包或有版权信息的jar包等)
注意:
1.当项目中使用坐标引入对应依赖的jar包后,首先会查找本地仓库中是否有对应的jar包,若有则在项目中直接引用;反之则会去中央仓库中下载对应的jar包到本地仓库
2.若搭建远程仓库,则将来jar包的查找顺序变为:本地仓库>远程仓库>中央仓库
-
Maven坐标
- Maven中的坐标是资源的唯一标识
- 使用坐标来定义项目或引入项目中需要的依赖
-
Maven坐标的主要组成
组成 解释 groupId
为当前Maven项目隶属的 组织名称 (通常是域名反写,如:com.itheima) artifactId
为当前Maven的项目名称 (通常是模块名称,如:order-service、goods-service) version
定义当前的版本号 scope
定义依赖的作用范围
Maven安装配置
-
Maven安装配置步骤
-
下载apache-maven-3.9.5.rar然后解压到自己想要安装的位置即可安装完整
-
配置环境变量MAVEN_HOME为安装路径的bin目录
-
打开系统变量中的Path,将Maven加入,如图所示,然后一直单击确定即可
- 判断Maven是否配置成功:打开cmd输入命令
mvn -version
,若看到Maven的信息则代表配置成功,如图所示
- 判断Maven是否配置成功:打开cmd输入命令
-
配置本地仓库:修改
conf/settings.xml
中的<localRepository>
为一个指定的目录- 我为两个版本配置的本地仓库如下:
<localRepository>F:\app\apache-maven-3.8.8\maven-repository</localRepository>
<localRepository>F:\app\apache-maven-3.9.5\maven-repository</localRepository>
-
配置阿里云私服:修改
conf/settings.xml
中的<mirrors>
标签,为其添加如下子标签:<mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf> </mirror>
-
Maven基本使用
Maven常用命令
命令 | 解释 |
---|---|
compile | 编译 |
clean | 清理 |
test | 测试 |
package | 打包 |
install | 安装 |
注意:使用命令前需要加上
mvn
,比如:mvn compile
-
准备工作
-
在项目MavenOne中的pom.xml中写入配置信息,如下所示
<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.itheima</groupId><artifactId>maven-project</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><!-- 导入mysql驱动jar包--><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.32</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope></dependency></dependencies> </project>
-
该项目的src中有两个目录,分别为main(源代码目录)和test(测试代码目录)
-
main中的代码如下
-
test中的代码如下
-
-
在iml文件所在处打开Powershell窗口
-
-
编译
-
在打开的Powershell窗口输入命令
mvn compile
注意:在刚配置完本地仓库时,由于仓库中无任何内容,所以在输入该命令后,会先下载所需的库(下载完成界面如图所示)以及插件,下载完成后再次输入该命令即可
-
输入
mvn compile
,若出现BUILD SUCCESS代表编译完成 -
编译完成后,在含有xml文件的文件夹目录内出现target目录,则进一步代表编译完成
-
-
-
清理
-
在Powershell窗口输入命令
mvn clean
,即可将target目录删除
注意:第一次执行mvn clean命令时会先去下载对应的jar包和插件
-
-
打包 —将java代码编译成的的字节码文件打包成一个jar包
-
在Powershell窗口输入命令
mvn package
,执行成功后会重新生成一个target目录且该目录下有个jar包(注意第一次使用该命令时会先下载对应的插件和jar包)
-
-
测试 —自动测试test(测试代码目录)下的代码
-
在Powershell窗口输入命令
mvn test
(第一次使用时会先下载对应的插件和jar包)
-
-
安装 —将当前的项目打包成一个jar包装到本地仓库中
-
在Powershell窗口输入命令
mvn install
(第一次使用时会先下载对应的插件和jar包)
-
Maven项目生命周期
-
定义
- Maven构建项目生命周期描述的是一次构建过程经历了多少个事件
-
Maven对项目构建的生命周期划分为三套
-
clean生命周期:清理工作
pre-clean
:执行一些需要在clean之前完成的工作clean
:移除所有上一次构建生成的文件post-clean
:执行一些需要在clean之后立刻完成的工作
-
default生命周期:核心工作,比如:编译、测试、打包、安装等等,如图所示
-
site生命周期:产生报告,发布站点等,如图所示
pre-site
:执行一些需要在生成站点文档之前完成的工作site
:生成项目的站点文档post-site
:执行一些需要在生成站点文档之后完成的工作,并为部署做准备site-deploy
:将生成的站点文档部署到特定的服务器上
注意:在上图中有三套生命周期,执行某一套生命周期后面的命令时,该套生命周期前的所有命令会自动执行,而不是其他套前面的命令自动执行
-
Maven插件
- 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
- 注意
- 默认maven在各个生命周期上绑定有预设的功能
- 通过插件可以自定义添加其它功能,可详见maven官网
IDEA中使用Maven
IDEA配置Maven步骤
-
File→Settings→搜索maven
-
设置IDEA使用本地安装的Maven并修改配置文件路径
-
Maven安装目录下的conf目录下的settings.xml属于全局配置,而用户目录的.m2目录下的settings.xml是属于当前用户配置(.m2目录下的settings.xml文件可能显示不出来但不代表在该目录下没有该文件),所以为了让idea中的maven配置并使用自己的全局配置需要以下几步:
-
第一步:打开C盘→用户→用户名→.m2→将文件settings.xml改名为settingsdrop.xml(若无settings.xml文件则创建一个空的settingsdrop.xml文件即可),如图所示
-
第二步:File→Settings→按图示设置maven
-
第三步:File→New Projects Setup →Settings for New Projects →然后按照第二步图示进行设置即可完成IDEA的Maven配置
注意 :IDEA在使用Maven时会以.m2目录下settings.xml文件为准,若在.m2目录下没找到该文件才会去使用自己在IDEA中配置的自己安装的Maven目录下的conf目录下的settings.xml文件。所以第一步的作用就是迷惑IDEA,让它去.m2目录下找不到settings.xml文件,从而不得不使用自己安装的maven下的settings.xml文件
-
-
示例:创建Maven Web项目成功后IDEA警告提示
IDEA创建或导入Maven项目
创建Maven项目
-
创建Maven方式一
-
File→New→Project或Moudle,输入模块名,选择Maven,单击Create,如图二所示即创建成功
-
-
创建Maven方式二
-
File→Project Structure→选择Modules→单击
+
→New Module,然后按照图示操作即可创建成功
-
-
注意事项
-
在以上两种创建方式中test测试用例目录下均没有配置文件resources,若需要配置文件则按图示操作即可创建配置文件目录
-
导入Maven项目
-
步骤
- 单击IDEA右侧Maven面板→单击
+
号→选中对应项目的xml文件然后双击即可,如图所示
- 单击IDEA右侧Maven面板→单击
-
若IDEA右侧没有Maven的标志,则按如图所示方式设置即可
pom.xml文件解析
-
初始pom.xml文件代码及相关标签说明 如下:
<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/maven-v4_0_0.xsd"><!--指定pom文件的模型版本--><modelVersion>4.0.0</modelVersion><!--组织id--><groupId>org.example</groupId><!--项目id--><artifactId>Abc</artifactId><!--打包方式:web工程打包为war,java工程打包为jar--><packaging>war</packaging><!--版本号--><!--英文若为RELEASE则为完成版;若为SANPSHOT则为开发版--><version>1.0-SNAPSHOT</version><name>Abc Maven Webapp</name><url>http://maven.apache.org</url><!--添加当前工程用到的所有依赖--><dependencies><!--设置具体的依赖--><dependency><groupId></groupId><artifactId></artifactId></dependency></dependencies><build><finalName>Abc</finalName><!--添加当前工程用到的插件--><plugins><!--添加具体插件--><plugin></plugin></plugins></build> </project>
IDEA中使用Maven命令
-
步骤
-
单击IDEA右侧Maven面板→选中要执行Mavne命令的Maven项目→Lifecycle→双击要执行的命令即可,如图所示
-
IDEA配置Maven-Helper插件
-
步骤
-
File→Settings→Plugins→搜索Maven,选择Maven Helper安装,然后重启IDEA即可,如图所示
-
-
配置该插件的原因
- 若Maven项目过多时,此时你使用IDEA右侧的Maven面板来执行Maven命令就很繁琐,所以配置该插件
-
该插件使用方式
-
右键要使用Maven命令的Maven项目→Run Maven→选择要使用的命令
注意:从截图中可看出该插件可进行断点调试工作,比较方便
-
Maven坐标依赖
Maven坐标依赖管理
-
依赖指当前项目运行所需的jar,一个项目可以设置多个依赖,格式如下
<!--添加当前项目用到的所有依赖--> <dependencies><!--设置具体的依赖--><dependency><!--依赖所属群组id--><groupId>junit</groupId><!--依赖所属项目id--><artifactId>junit</artifactId><!--依赖版本号--><version>3.8.1</version><!--是否是可选依赖,默认为false--><optional>false</optional><!--设置要排除的依赖--><exclusions><exclusion><groupId></groupId><artifactId></artifactId></exclusion><exclusion><groupId></groupId><artifactId></artifactId></exclusion>...</exclusions><!--依赖范围--><scope>test</scope></dependency> </dependencies>
-
依赖管理导入jar包步骤
- 在pom.xml中编写
<dependencies>
标签 - 在
<dependencies>
标签中使用<dependency>
引入坐标 - 定义坐标的groupID、artifactId、version
- 单击刷新按钮,使坐标生效
- 在pom.xml中编写
-
以引入MySQL驱动jar包为例
-
百度输入mysql maven进入进入mysql依赖官网(https://mvnrepository.com/artifact/mysql/mysql-connector-java)(注意:若使用其他jar包则也在百度输入
名称 maven
进入对应的依赖官网即可 ) -
找到合适的mysql依赖单击进入,并复制Maven依赖到pom.xml文件中
-
第一次复制到pom.xml文件中时,mysql版本号会报红(原因是当前本地仓库中没有该版本的mysqljar包或插件),单击刷新按钮即可从中央仓库下载到本地仓库中,当不报红时说明已经下载到本地仓库
-
查看是否导入成功
-
单击IDEA右侧Maven面板→查看Dependencies目录中是否有mysql-connector-java:8.0.28,若存在则说明导入成功,如图所示
-
-
-
删除依赖管理jar包步骤
-
删除xml文件中想要删除的依赖对应的
<dependency>
标签及该标签的标签体,然后刷新即可,如图所示 -
查看是否删除成功
-
单击IDEA右侧Maven面板→查看Dependencies目录中是否有mysql-connector-java:8.0.28,若无则说明删除成功,如图所示
-
-
-
注意:有时候会忘记点击刷新,所以有更好的办法—即自动生效,步骤如下:
导入本地仓库jar包
-
注意
- 从中央仓库下载的jar包会自动保存到本地仓库中,下次使用时就属于从本地仓库中导入jar包
-
导入本地仓库中的jar包步骤
-
摁住
Alt + Insert
→Dependency→输入需要的jar包然后单击Add即可,如图所示
-
Maven依赖范围
-
定义
-
通过设置坐标的依赖范围(scope)来设置对应jar包的作用范围(比如:编译环境、测试环境、运行环境),若不设置则默认在任意地方均可用
- 若设置坐标的依赖范围为 编译环境 :代表jar包在编译环境有效(即在main目录的java目录下的所有类均可用jat包)------主程序范围有效(即main文件夹范围内)
- 若设置坐标的依赖范围为 测试环境 :代表jar包在测试环境有效(即在test目录的java目录下的所有类均可用jat包)------测试程序范围(即test文件夹范围内)
- 若设置坐标的依赖范围为 运行环境 :代表导入的jar包只在你将来运行项目时可用------是否参与打包(即package指定范围内)
-
-
使用的标签体为
<scope>作用范围</scope>
-
依赖范围关键字对应可用的作用范围
依赖范围 编译classpath 测试classpath 运行classpath 例子 备注 compile
Y Y Y logback、log4j <scope>
标签的 默认标签体test
- Y - Junit provided
Y Y - servlet-api 在编译环境和测试环境有效,但在真正运行时就不会在使用该jar包 runtime
- - Y jdbc system
Y Y - 存储在本地的jar包 基本用不到 system
import
- 注意
- 以test举例说明(其他几个同理):假设设置的作用范围为test,此时在编译环境中的类就无法导入作用范围为test的jar包,也就意味着无法使用该jar包中的方法等内容
- 配置
<scope>作用范围</scope>
的关键字为test、provided、system的jar包在运行环境下无效,也就意味着若将此时的项目package(打包)成一个war包后,war包中不会包含有以上三个关键字的jar包(以MavenWeb项目为例) import
需引入DependencyManagement
,详见Maven高级部分
- 注意
Maven依赖传递
-
依赖种类
- 直接依赖: 在当前项目中通过依赖配置建立的依赖关系。举例:
- 示例1:在
MavenTwo
项目中引入的mysql坐标依赖,此时mysql坐标与MavenTwo
项目就是直接依赖 - 示例2:a的直接依赖为b1、b2
- 示例1:在
- 间接依赖: 被资源的资源若依赖其它资源,则当前项目间接依赖其它资源
- a与c、d、e、f则为间接依赖
- 可选依赖: 指是否对外隐藏当前所依赖的资源,即在其它项目中看不到你使用的依赖有哪些是什么
- 通过
<optional>false</optional>
标签来设置,默认为false
- 通过
- 排除依赖: 指主动断开依赖的资源,被排除的资源无需指定版本
- 若a只想使用1度资源,而不使用1度资源后的那些资源。此时需要使用
<exclusions>
标签来设置要排除的1度资源下的资源
- 若a只想使用1度资源,而不使用1度资源后的那些资源。此时需要使用
- 直接依赖: 在当前项目中通过依赖配置建立的依赖关系。举例:
-
依赖传递冲突问题
- 路径优先:当依赖中出现相同的资源时,层级越深优先级越低,层级越线,优先级越高。举例:
- 假设c3与e2为相同资源,此时a实际使用的依赖为c3
- 声明优先:当资源在相同层级被依赖时,配置顺序靠前的依赖会自动覆盖配置顺序靠后的
- 假设2度资源中c1与c3为相同资源,但由于a先配置了1度资源中的b1,所以c1会自动覆盖c3
- 特殊优先:当同级配置了相同资源的不同版本时,配置顺序靠后的依赖会自动覆盖配置顺序靠前的
- 假设c3与d为同一个pom.xml文件中的相同资源的不同版本,由于引入依赖d的顺序靠后,所以d会自动覆盖c3
- 路径优先:当依赖中出现相同的资源时,层级越深优先级越低,层级越线,优先级越高。举例:
-
在idea中可通过单击如图所示按钮即可查看依赖图,如下所示
带有依赖范围的依赖传递
-
带有依赖范围的坐标依赖在进行传递时,依赖的作用范围将受到影响,如图所示
-
解释
- 当
MavenOne
项目中的MavenTwo
依赖的作用范围为test
,而MavenTwo
下的mysql坐标依赖的作用范围runtime
时,此时MavenOne项目中的间接依赖mysql的依赖作用范围为test
,因为如表所示直接依赖test+间接依赖runtime=test
- 当
MavenOne
项目中的MavenTwo
依赖的作用范围为test
,而MavenTwo
下的mysql坐标依赖的作用范围provided
时,此时MavenOne项目中的间接依赖mysql就会消失,因为如表所示直接依赖test+间接依赖provided为空
- 详细示例可见Maven依赖配置示例
- 当
Maven依赖配置示例
假设我现在有两个maven项目即
MavenOne
与MavenTwo
,其中MavenOne
要用到MavenTwo
,则就需要让这两个项目建立连接,步骤如下
直接依赖与间接依赖
-
Step1: 打开
MavenTwo
项目的pom.xml文件,将MavenTwo
项目的坐标复制到MavenOne
的pom.xml文件中,如图所示 -
Step2: 刷新
MavenOne
项目的pom.xml,即可看到坐标依赖导入成功,如图所示 -
Step3: 我现在在
MavenTwo
项目的pom.xml文件中传入一个mysql的坐标,刷新pom.xml文件后,截图如下从截图中可以看出虽然博主只在
MavenTwo
项目中引入了mysql坐标,但是在MavenOne
项目中也出现了mysql坐标,并且该坐标是在MavenOne
坐标下,这就说明当其它项目引入MavenTwo
的坐标后,其它项目可以使用在MavenTwo
项目的pom.xml中已经引入的坐标依赖。
排除依赖
假设在
MavenOne
项目中只想使用MavenTwo
的坐标依赖,而不想要MavenTwo
坐标依赖下的mysql依赖,则步骤如下
-
Step1: 为
MavenOne
项目的pom.xml文件中MavenTwo
坐标依赖添加<exclusions>
标签,并在该标签体内添加<exclusion>
标签 -
Step2: 在
<exclusion>
标签体内添加要排除的MavenTwo
中的依赖坐标,然后刷新pom.xml文件即可,截图如下
可选依赖
假设在
MavenTwo
不想让MavenOne
看到它用了mysql依赖,则步骤如下
-
Step1: 为
MavenTwo
项目的pom.xml文件中mysql坐标依赖添加<optional>
标签,并将值设为true,截图如下
带有依赖范围的依赖传递
示例1:当
MavenOne
项目中的MavenTwo
依赖的作用范围为test
,而MavenTwo
下的mysql坐标依赖的作用范围runtime
时,此时MavenOne项目中的间接依赖mysql的依赖作用范围为test
,因为如表所示直接依赖test+间接依赖runtime=test
-
Step1: 首先,在MaveOne项目的pom.xml文件中将
MavenTwo
依赖的作用范围设置为test
,由截图可看出此时MavenTwo
依赖下的mysql依赖的作用范围也变为test
-
Step2: 然后,在MaveTwo项目的pom.xml文件中将mysql依赖的作用范围设置为
runtime
,由截图可看出此时MavenOne项目中的MavenOne
依赖下的mysql依赖的作用范围就仍为test
,因为如表所示直接依赖test+间接依赖runtime=test
示例2:当
MavenOne
项目中的MavenTwo
依赖的作用范围为test
,而MavenTwo
下的mysql坐标依赖的作用范围provided
时,此时MavenOne项目中的间接依赖mysql就会消失,因为如表所示直接依赖test+间接依赖provided为空
-
Step1: 首先在MaveOne项目的pom.xml文件中将
MavenTwo
依赖的作用范围设置为test
,由截图可看出此时MavenTwo
依赖下的mysql依赖的作用范围也变为test
-
Step2: 然后在MaveTwo项目的pom.xml文件中将mysql依赖的作用范围设置为
provided
,由截图可看出此时MavenOne项目中的MavenOne
依赖下的mysql依赖消失不可用,因为直接依赖test+间接依赖provided为空
以下部分为Maven高级部分 相关项目已上传至Gitee,可自行下载
分模块开发与设计
-
定义:将原始模块按照功能拆分成若干个子模块,方便模块间的相互调用,接口共享。如下图所示
快速入门
本快速入门将会以Restful风格的ssm整合项目
RestfulDemo
为例进行演示(省略部分可详见ssm整合),并且由于本项目属于快速入门级别,所以会阉割掉接口测试、异常处理以及前端资源联入部分内容
-
完整项目图如下所示
pojo模块拆分
-
Step1: 创建一个与
RestFulDemo
项目同级的模块ssm_pojo
,然后将pojo包剪切过来,如图所示RestFulDemo
项目中的pojo包已被删除并出现在ssm_pojo
项目中 -
Step2: 将pojo包用到的坐标以及配置类均从
RestFulDemo
项目中移动到ssm_dao
中-
Step2-1: pojo类中用到了
@Alias
注解,该注解依靠mybatis坐标,所以要将RestFulDemo
项目的pom.xml文件中的mybatis坐标移动到ssm_pojo
项目的pom.xml文件中,如图所示
-
-
Step3: 通过maven指令
compile
运行ssm_pojo
看是否能够编译通过,若能则代表可以正常使用该ssm_pojo
项目,如图所示 -
Step4: 在
ssm_pojo
模块的pom.xml文件中找到自身对应的坐标依赖并将其写入到RestFulDemo
项目的pom.xml文件中 ,如图所示 -
Step5 : 通过maven指令
install
将ssm_pojo
模块安装到本地仓库中,操作如图所示-
打包到本地仓库时若报错:
Cannot access defaults field of Properties
,则在ssm_pojo
项目的pom.xml文件中添加maven-war
插件,代码如下<plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.2</version></plugin> </plugins>
-
-
注意:由于ssm_pojo模块下,不需要resources目录下的内容,所以可删除掉,只留一个java包即可。如图所示
dao模块拆分
-
Step1: 创建一个与
RestFulDemo
项目同级的模块ssm_dao
,然后将dao包剪切过来,如图所示RestFulDemo
项目中的dao包已被删除并出现在ssm_dao
项目中 -
Step2: 将dao层用到的坐标移动到
ssm_dao
的pom.xml文件中-
导入ssm_pojo坐标
在pojo模块拆分中,将
ssm_pojo
坐标写入到了RestFulDemo项目的pom.xml文件中是为了让dao层使用,而如今也将dao模块拆分出来了,所以就需要将ssm_pojo
坐标移动到ssm_dao
的pom.xml文件中 -
导入Spring注解相关坐标:Annotation
-
导入数据库相关坐标:mysql、数据源坐标(druid、cp30)
-
导入Spring集成MyBatis相关坐标:mybatis、spring-jdbc、mybatis-spring
注意:由于ssm_pojo中已经导入了mybatis的坐标,所以此处不在导入
<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>ssm_dao</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>ssm_dao Maven Webapp</name><url>http://maven.apache.org</url><dependencies><!--ssm_pojo坐标--><dependency><groupId>org.example</groupId><artifactId>ssm_pojo</artifactId><version>1.0-SNAPSHOT</version></dependency><!--===================Spring注解相关坐标=======================--><!--Annotation坐标--><dependency><groupId>javax.annotation</groupId><artifactId>javax.annotation-api</artifactId><version>1.3.2</version></dependency><!--=====================数据库相关坐标=========================--><!--mysql坐标--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency><!--druid坐标--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.18</version></dependency><!--c3p0坐标--><dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.5</version></dependency><!--=====================Spring集成MyBatis相关坐标=========================--><!--MyBatis坐标<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.16</version></dependency>--><!--mybatis-spring--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>3.0.3</version></dependency><!--spring-jdbc--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>6.1.10</version></dependency></dependencies><build><finalName>ssm_dao</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.2</version></plugin></plugins></build> </project>
-
-
Step3: 在RestFulDemo项目的pom.xml文件中导入ssm_dao的坐标,并删除已存在的ssm_pojo坐标(因为ssm_dao模块中已导入ssm_pojo坐标)
-
Step4: 通过maven指令
compile
运行ssm_dao
看是否能够编译通过,如图所示编译成功 -
Step5: 通过maven指令
install
将ssm_dao
打包到本地maven仓库,然后即可。 -
Tomcat运行RestFulDemo项目后成功运行,截图如下
可能出现的问题
-
在分模块开发中有些模块是不需要打包成jar包的,比如pojo模块,若未更改pom.dml文件中的打包方式为jar则会如图所示错误,因为pom.xml文件默认是打成war包到本地maven仓库
- 解决方式:只需要将ssm_pojo项目中的pom.xml文件中的
<packaging>war</packaging>
改为<packaging>jar</packaging>
即可
- 解决方式:只需要将ssm_pojo项目中的pom.xml文件中的
-
在分模块开发中,有些模块是不需要web项目核心目录(即
webapp
)下的web.xml文件的(比如pojo模块),但是若将webapp
下的web.xml文件删除则打包或运行时则会报错,所以有两种配置maven打war包时,忽略对web.xml检查的解决办法:-
方式一:就创建个web.xml空间文件来迷惑系统
-
方式二:在不需要web.xml的项目的pom.xml中使用
maven-war
插件来忽略系统对web.xml的检查,代码如下<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.2</version><!--配置maven打war包时,忽略web.xml检查--><configuration><failOnMissingWebXml>false</failOnMissingWebXml></configuration>--> </plugin>
-
聚合与继承
聚合
-
定义:将多个模块组织成一个整体,同时进行项目构建的过程称为聚合
-
聚合工程
- 通常是一个不具有业务功能的“空”工程(有且仅有一个pom.xml文件)
-
作用
- 使用聚合工程可以将多个工程编组,通过对聚合工程进行构建,实现对所包含的模块进行同步构建
-
使用场景
- 当工程中某个模块发生更新\变更时,必须保障工程中与已个更新模块关联的模块同步更新,此时可以使用聚合工程来解决批量模块同步构建的问题
-
pom.xml文件中用到的标签
<!--设置聚合工程(即父模块)的打包方式为pom--> <packaging>pom</packaging> <!--设置子模块--> <modules><module>../RestFulDemo</module><module>../ssm_pojo</module><module>../ssm_dao</module> </modules>
- 注意:
- 聚合工程中所包含的模块在进行构建时会根据模块间的依赖关系自动设置构建顺序,与聚合工程中模块的配置书写位置无关
- 参与聚合的工程无法向上感知是否参与聚合,只能向下配置哪些模块参与本工程的聚合
- 注意:
快速入门
-
Step1: 创建一个与RestFulDemo项目同级的新module父模块
ParentDemo
,如图所示 -
Step2: 更改ParentDemo的pom.xml文件中的代码
- Step2-1: 将打包方式设置为pom
- Step2-2: 利用
<modules>
标签设置该父模块的子模块
<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>ParentDemo</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><name>ParentDemo Maven Webapp</name><url>http://maven.apache.org</url><!--设置子模块--><modules><module>../RestFulDemo</module><module>../ssm_pojo</module><module>../ssm_dao</module></modules><dependencies></dependencies><build><finalName>ParentDemo</finalName></build> </project>
-
通过maven指令
compile
运行ParentDemo
看是否能够编译通过,如图所示编译成功
继承
-
定义:继承描述的是两个工程间的关系,与java中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承。它可以简化配置并减少版本冲突
-
pom.xml文件中用到的标签
-
聚合工程(即父工程)的pom.xml文件中用到的标签
<!--配置公共坐标依赖--> <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.10.RELEASE</version></dependency>…… </dependencies> <!--配置可选依赖--> <dependencyManagement><dependencies><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.16</version></dependency>……</dependencies> </dependencyManagement>
-
子工程的pom.xml文件中用到的标签
<!--定义该工程的聚合工程(即父工程)--> <parent><groupId>org.example</groupId><artifactId>ParentDemo</artifactId><version>1.0-SNAPSHOT</version><!--聚合工程(即父工程)对应的pom.xml文件路径--><relativePath>../ParentDemo/pom.xml</relativePath> </parent> <!--在子工程中配置使用父工程中可选依赖的坐标或定义聚合工程(即父工程)中没有的依赖--> <dependencies><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId></dependency> </dependencies>
-
-
注意
- 子工程不仅可继承聚合工程(即父工程)中的依赖,还可以定义聚合工程(即父工程)中没有的依赖
- 子工程中使用父工程中的可选依赖时,仅需要提供群组id和项目id,无需提供版本,版本由父工程统一提供,避免版本冲突
快速入门
-
Step1: 将RestFulDemo、ssm_pojo、ssm_dao的pom.xml文件中的公共依赖及插件全部移动到聚合工程(即父工程)中,此时聚合工程ParentDemo的pom.xml文件代码如下
-
公共依赖:
-
导入Spring基础坐标:spring-context
-
导入Spring提供的监听器
ContextLoaderListener
的相关坐标:spring-web -
导入Spring集成Web环境相关坐标:servlet、jsp
-
导入Spring注解相关坐标:Annotation
-
导入与AOP相关的坐标:aop、aspectj
-
AOP坐标会在导入spring-context坐标后系统自动导入,如图所示
-
-
导入事务相关坐标:spring-tx
-
导入数据库相关坐标:mysql、数据源坐标(druid、cp30)
-
导入Spring集成JUnit相关坐标:junit、spring-test
-
导入Spring集成MyBatis相关坐标:mybatis、spring-jdbc、mybatis-spring
-
SpringMVC的基础坐标:spring-webmvc (注意:必须为必须为5.2.x.RELEASE版本)
-
导入获取指定格式(比如JSON)字符串的坐标:jackson-core、jackson-databind、jackson-annotations
-
-
可选依赖:
- ssm_pojo、ssm_dao
- 导入文件上传相关坐标:fileupload、io
-
注意:实际项目中可根据实际情况来设置可选依赖(即可由子模块自行决定是否使用的依赖)以及公共依赖(即子模块)
<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>ParentDemo</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><name>ParentDemo Maven Webapp</name><url>http://maven.apache.org</url><!--设置子模块--><modules><module>../RestFulDemo</module><module>../ssm_pojo</module><module>../ssm_dao</module></modules><!--配置公共坐标依赖--><dependencies><!--===================Spring基础坐标=======================--><!--spring坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.1.6</version></dependency><!--===================Spring提供的监听器ContextLoaderListener相关的坐标=======================--><!--spring-web --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.2.25.RELEASE</version></dependency><!--===================Spring集成web环境相关坐标=======================--><!-- servlet--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><!--jsp--><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.3</version><scope>provided</scope></dependency><!--===================Spring注解相关坐标=======================--><!--Annotation坐标--><dependency><groupId>javax.annotation</groupId><artifactId>javax.annotation-api</artifactId><version>1.3.2</version></dependency><!--=====================Spring集成AOP相关坐标=========================--><!--aspectj坐标--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.22.1</version></dependency><!--=====================Spring集成事务相关坐标=========================--><!--spring-tx坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>6.1.15</version></dependency><!--=====================数据库相关坐标=========================--><!--mysql坐标--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency><!--druid坐标--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.18</version></dependency><!--c3p0坐标--><dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.5</version></dependency><!--===================Spring集成JUnit相关的坐标=======================--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><!--spring-test坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>6.1.6</version><scope>test</scope></dependency><!--=====================Spring集成MyBatis相关坐标=========================--><!--MyBatis坐标--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.16</version></dependency><!--mybatis-spring--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>3.0.3</version></dependency><!--spring-jdbc--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>6.1.10</version></dependency><!--===================SpringMVC基础坐标=======================--><!--spring-webmvc--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.25.RELEASE</version></dependency><!--===================获取指定格式(比如JSON)数据相关坐标=======================--><!--jackson-core--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.17.1</version></dependency><!--jackson-databind--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.17.1</version></dependency><!--jackson-annotations--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.17.1</version></dependency></dependencies><!--配置可选依赖--><dependencyManagement><dependencies><!--ssm_pojo坐标--><dependency><groupId>org.example</groupId><artifactId>ssm_pojo</artifactId><version>1.0-SNAPSHOT</version></dependency><!--ssm_dao坐标--><dependency><groupId>org.example</groupId><artifactId>ssm_dao</artifactId><version>1.0-SNAPSHOT</version></dependency><!--===================文件上传相关坐标=======================--><!--fileupload坐标--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.5</version></dependency><!--io坐标--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.17.0</version></dependency></dependencies></dependencyManagement><build><finalName>ParentDemo</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.2</version></plugin><!-- Tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version></plugin><!--<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><!– maven插件版本 –><version>3.13.0</version><configuration><!– Java版本 –><source>21</source><compilerArgs><arg>-parameters</arg></compilerArgs></configuration></plugin>--></plugins></build> </project>
-
-
Step2: 分别在RestFulDemo、ssm_pojo、ssm_dao三个子模块的pom.xml文件中配置当前工程继承自聚合工程(即父工程),如图所示
-
Step3: 由于RestFulDemo项目中需要ssm_pojo、ssm_dao依赖以及文件上传相关依赖,所以其pom.xml文件代码如下
<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>RestFulDemo</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>RestFulDemo Maven Webapp</name><url>http://maven.apache.org</url><!--定义该工程的聚合工程(即父工程)--><parent><groupId>org.example</groupId><artifactId>ParentDemo</artifactId><version>1.0-SNAPSHOT</version><!--聚合工程(即父工程)对应的pom.xml文件路径--><relativePath>../ParentDemo/pom.xml</relativePath></parent><!--在子工程中配置使用父工程中可选依赖的坐标或定义聚合工程(即父工程)中没有的依赖--><dependencies><!--ssm_pojo坐标--><dependency><groupId>org.example</groupId><artifactId>ssm_pojo</artifactId></dependency><!--ssm_dao坐标--><dependency><groupId>org.example</groupId><artifactId>ssm_dao</artifactId></dependency><!--===================文件上传相关坐标=======================--><!--fileupload坐标--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId></dependency><!--io坐标--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId></dependency></dependencies><build><finalName>RestFulDemo</finalName></build> </project>
-
Step4: 由于ssm_dao项目中需要ssm_pojo依赖,所以其pom.xml文件代码如下
<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>ssm_dao</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>ssm_dao Maven Webapp</name><url>http://maven.apache.org</url><!--定义该工程的聚合工程(即父工程)--><parent><groupId>org.example</groupId><artifactId>ParentDemo</artifactId><version>1.0-SNAPSHOT</version><!--聚合工程(即父工程)对应的pom.xml文件路径--><relativePath>../ParentDemo/pom.xml</relativePath></parent><!--在子工程中配置使用父工程中可选依赖的坐标或定义聚合工程(即父工程)中没有的依赖--><dependencies><!--ssm_pojo坐标--><dependency><groupId>org.example</groupId><artifactId>ssm_pojo</artifactId></dependency></dependencies><build><finalName>ssm_dao</finalName></build> </project>
-
配置成功后,如图所示
聚合与继承的区别
-
作用方面
-
聚合用于快速构建项目
-
继承用于快速配置
-
-
相同点:
- 聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个pom文件中
- 聚合与继承均属于设计型模块,并无实际的模块内容
-
不同点:
- 聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些
- 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己
属性
可用来统一更改pom.xml文件中的版本号等内容
-
Maven属性分类
注意:主要学习自定义属性及内置属性,其余属性了解即可
-
pom.xml文件中用到的标签
<!--定义自定义属性--> <properties><spring.version>5.2.10.RELEASE</spring.version><junit.version>4.12</junit.version>... </properties><!--坐标中引用自定义属性--> <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version> </dependency>
快速入门
-
如图所示,此时ParentDemo项目的pom.xml文件中获取指定格式数据的相关坐标的版本均为2.17.1,若想要改它们的版本则需要一个一个的修改,比较麻烦而且也可能因为不注意改错,所以就有了属性
-
Step1: 在pom.xml文件中利用
<properties>
标签自定义定义属性,然后在对应的依赖中引用属性,代码如下注意::此处只为了示例,所以其余部分坐标均省略
<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>ParentDemo</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><name>ParentDemo Maven Webapp</name><url>http://maven.apache.org</url><!--设置子模块--><modules><module>../RestFulDemo</module><module>../ssm_pojo</module><module>../ssm_dao</module></modules><!--配置公共坐标依赖--><dependencies><!--===================获取指定格式(比如JSON)数据相关坐标=======================--><!--jackson-core--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${spring.version}</version></dependency><!--jackson-databind--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${spring.version}</version></dependency><!--jackson-annotations--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>${spring.version}</version></dependency></dependencies><properties><!--自定义标签及标签名并写入版本号--><spring.version>2.17.1</spring.version></properties><build><finalName>ParentDemo</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.2</version><!--指定可以无web.xml文件--><configuration><failOnMissingWebXml>false</failOnMissingWebXml></configuration></plugin><!-- Tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version></plugin><!--<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><!– maven插件版本 –><version>3.13.0</version><configuration><!– Java版本 –><source>21</source><compilerArgs><arg>-parameters</arg></compilerArgs></configuration></plugin>--></plugins></build> </project>
配置/资源文件引用属性
-
比如在我们的项目中jdbc.properties文件中是直接定义的属性值(如图所示),现在将其也在聚合工程(即父工程)的pom.xml文件中定义属性,然后在jdbc.properties中引用属性
-
聚合工程(即父工程)pom.xml文件中用到的标签
<!--定义自定义属性--> <properties><spring.version>5.2.10.RELEASE</spring.version><junit.version>4.12</junit.version>... </properties><!--开启资源文件目录加载属性的过滤器--> <build><resources><resource><directory>${project.basedir}/src/main/resources</directory><filtering>true</filtering></resource></resources> </build>
- 注意:开启资源文件目录加载属性的过滤器时,
${project.basedir}/src/main/resources
表示当前项目(即聚合工程)下的src目录下的main目录下的resources目录。因为子工程都继承了该聚合工程,所以子工程也都能加载到
- 注意:开启资源文件目录加载属性的过滤器时,
-
子工程的pom.xml文件中可能用到的插件
<!--配置maven打war包时,忽略web.xml检查--> <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.2.3</version><configuration><failOnMissingWebXml>false</failOnMissingWebXml></configuration> </plugin>
-
Step1: 在聚合工程(即父工程)
ParentDemo
的pom.xml文件中利用<properties>
来自定义属性,然后在<build>
标签体内利用<resources>
标签开启资源文件目录加载属性的过滤器,代码如下所示注意::此处只为了示例,所以其余部分坐标均省略
<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>ParentDemo</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><name>ParentDemo Maven Webapp</name><url>http://maven.apache.org</url><!--设置子模块--><modules><module>../RestFulDemo</module><module>../ssm_pojo</module><module>../ssm_dao</module></modules><!--配置公共坐标依赖--><dependencies><!--===================获取指定格式(比如JSON)数据相关坐标=======================--><!--jackson-core--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${spring.version}</version></dependency><!--jackson-databind--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${spring.version}</version></dependency><!--jackson-annotations--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>${spring.version}</version></dependency></dependencies><!--定义属性--><properties><!--自定义标签及标签名并写入版本号--><spring.version>2.17.1</spring.version><!--自定义jdbc.properties属性标签及属性值--><jdbc.driverClassName>com.mysql.cj.jdbc.Driver</jdbc.driverClassName><jdbc.url>jdbc:mysql://localhost:3306/ssm_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai</jdbc.url><jdbc.username>root</jdbc.username><jdbc.password>123456</jdbc.password></properties><build><finalName>ParentDemo</finalName><!--开启资源文件目录加载属性的过滤器--><resources><resource><directory>${project.basedir}/src/main/resources</directory><filtering>true</filtering></resource></resources><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.2</version><!--配置maven打war包时,忽略web.xml检查<configuration><failOnMissingWebXml>false</failOnMissingWebXml></configuration>--></plugin><!-- Tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version></plugin><!--<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><!– maven插件版本 –><version>3.13.0</version><configuration><!– Java版本 –><source>21</source><compilerArgs><arg>-parameters</arg></compilerArgs></configuration></plugin>--></plugins></build> </project>
-
Step2: 更改子工程
RestFulDemo
下的jdbc.properties文件代码,如下所示jdbc.driverClassName=${jdbc.driverClassName} jdbc.url=${jdbc.url} jdbc.username=${jdbc.username} jdbc.password=${jdbc.password}
-
Tomcat运行RestFulDemo后即可成功运行,运行截图如下
版本管理
工程版本
- SNAPSHOT(快照版本)
- 项目开发过程中临时输出的版本,称为快照版本
- 快照版本会随着开发的进展不断更新
- RELEASE(发布版本)
- 项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的
- 即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本
发布版本
- alpha版
- beta版
- 纯数字版
多环境配置与应用
-
Maven提供多种环境设定(即:生产环境、开发环境、测试环境)如图所示,可帮助开发者快速切换环境
-
pom.xml文件中用到的标签
<!--定义多环境--> <profiles><!--定义具体的环境:生产环境--><profile><!--定义环境对应的唯一名称--><id>env_dep</id><!--定义环境中专用的属性值--><properties><jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db</jdbc.url></properties><!--设置默认启动:即设置该环境为默认启动环境--><activation><activeByDefault>true</activeByDefault></activation></profile><!--定义具体的环境:开发环境--><profile><id>env_pro</id>...</profile>... </profiles>
-
pom.xml文件中用到的插件
<plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.1</version><!--设置跳过测试--><configuration><!--是否跳过测试--><skipTests>true</skipTests><!--包含参与测试的测试内容--><includes><!--任意目录下的UserTest.java不参与测试--><include>**/UserTest.java</include></includes><!--排除掉不参与测试的内容--><excludes><!--任意目录下的UserTest.java不参与测试--><exclude>**/UserTest.java</exclude></excludes></configuration> </plugin>
快速入门
-
Step1:在聚合工程(即父工程)
ParentDemo
的pom.xml文件中配置多环境,代码如下注意::此处只为了示例,所以其余部分坐标均省略
<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>ParentDemo</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><name>ParentDemo Maven Webapp</name><url>http://maven.apache.org</url><!--设置子模块--><modules><module>../RestFulDemo</module><module>../ssm_pojo</module><module>../ssm_dao</module></modules><!--配置公共坐标依赖--><dependencies><!--===================获取指定格式(比如JSON)数据相关坐标=======================--><!--jackson-core--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${spring.version}</version></dependency><!--jackson-databind--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${spring.version}</version></dependency><!--jackson-annotations--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>${spring.version}</version></dependency></dependencies><!--定义属性--><properties><!--自定义标签及标签名并写入版本号--><spring.version>2.17.1</spring.version><!--自定义jdbc.properties属性标签及属性值--><jdbc.driverClassName>com.mysql.cj.jdbc.Driver</jdbc.driverClassName><jdbc.url>jdbc:mysql://localhost:3306/ssm_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai</jdbc.url><jdbc.username>root</jdbc.username><jdbc.password>123456</jdbc.password></properties><!--定义多环境--><profiles><!--定义具体的环境一:生产环境--><profile><id>env_pro</id><!--定义环境中专用的属性值--><properties><jdbc.url>jdbc:mysql://localhost:3306/ssm_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai</jdbc.url></properties><!--设置默认启动:即设置该环境为默认启动环境--><activation><activeByDefault>true</activeByDefault></activation></profile><!--定义具体的环境二:开发环境--><profile><id>env_dep</id><!--定义环境中专用的属性值--><properties><jdbc.url>jdbc:mysql://localhost:3307/ssm_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai</jdbc.url></properties></profile><!--定义具体的环境三:测试环境--><profile><id>env_test</id><!--定义环境中专用的属性值--><properties><jdbc.url>jdbc:mysql://localhost:3308/ssm_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai</jdbc.url></properties></profile></profiles><build><finalName>ParentDemo</finalName><!--开启资源文件目录加载属性的过滤器--><resources><resource><directory>${project.basedir}/src/main/resources</directory><filtering>true</filtering></resource></resources><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.2</version><!--配置maven打war包时,忽略web.xml检查<configuration><failOnMissingWebXml>false</failOnMissingWebXml></configuration>--></plugin><!-- Tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version></plugin><!--<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><!– maven插件版本 –><version>3.13.0</version><configuration><!– Java版本 –><source>21</source><compilerArgs><arg>-parameters</arg></compilerArgs></configuration></plugin>--></plugins></build> </project>
-
在以上快速入门中,若想要将指定环境设置为默认启动均需要
<activation>
标签来设置,这样就有些麻烦,所以简便方法如图所示,对应命令格式如下:mvn 指令 –P 环境定义id【范例】: mvn install –P env_test
跳过测试
-
应用场景
- 项目某一部分功能没开发完毕正在更新中,所以就会测试不通过,所以就跳过测试进行打包安装
- 已确认项目不存在问题,但是打包因为有测试,所以打包时间就会很久,所以就跳过测试打包
-
跳过测试方式一: 跳过所有项目的测试
注意:该方式会跳过所有工程的测试(如图所示),无法单独指定跳过哪个工程的测试,所以更好的方式详见方式二
- 方法一:
-
方法二: 使用指令
mvn package -D skipTests
跳过测试,如图所示 -
方法三:
-
Step1: 通过maven指令
package
打包项目成功后,查找maven-surefire-plugin
插件的版本,如图所示 -
Step2: 在聚合工程(即父工程)的pom.xml文件中配置
maven-surefire-plugin
插件并允许跳过测试,代码如下注意:此处只写对应的插件代码,其余代码均省略
<plugin><artifactId>maven-surefire-plugin</artifactId><version>2.12.4</version><configuration><skipTests>true</skipTests></configuration> </plugin>
-
-
跳过测试方式二: 指定要跳过测试的项目
-
在聚合工程(即父工程)的pom.xml文件中配置
maven-surefire-plugin
插件并设置不允许跳过测试,然后指定排除部分,代码如下注意:此处只写对应的插件代码,其余代码均省略
<plugins><plugin><artifactId>maven-surefire-plugin</artifactId><version>2.12.4</version><!--设置跳过测试--><configuration><!--是否跳过测试--><skipTests>false</skipTests><!--排除掉不参与测试的内容--><excludes><!--任意目录下的UserTest.java不参与测试--><exclude>**/UserTest.java</exclude></excludes></configuration></plugin> </plugins>
-
私服
-
私服是一台独立的服务器,用于解决团队内部的资源共享与资源同步问题
-
用到的软件工具Nexus,可自行去官网下载
初次使用步骤
-
Step1: 在
nexus-3.75.1-01
目录的bin
目录下利用cmd指令进入到命令窗口,然后输入命令nexus.exe /run nexus
启动服务器(该服务器名为jetty) -
Step2: 启动成功后通过浏览器访问默认端口号8081,即
http://localhost:8081
,初始页面如下 -
Step3: 单击右上角的Sign in,然后输入指定的用户名以及对应文件中的密码登录
-
Step4: 更改密码
-
Step4: 最终页面如下
注意
-
nexus-3.75.1-01\bin
目录下的nexus.vmoptions
文件- 修改服务器运行配置信息
- 可用来配置Nexus服务器启动时的一些参数,比如默认占用内存空间
-
sonatype-work\nexus3\etc
目录下的nexus.properties
文件- 修改基础配置信息
- 可用来配置Nexus服务器的基础信息,比如默认访问端口,如图所示
私服仓库分类
仓库类型 | 英文名称 | 功能 | 关联操作 |
---|---|---|---|
宿主仓库 | hosted | 保存自主研发的东西和中央仓库没有的第三方资源 | 上传 |
代理仓库 | proxy | 代理连接中央仓库,所有人都可以用 | 下载 |
仓库组 | group | 为仓库编组来简化下载操作 | 下载 |
资源的上传与下载
-
Step1: 在Nexus服务器中创建两个仓库,步骤如下
-
Step1-1 :创建一个SNAPSHOT(快照版本)的仓库
test-snapshot
-
Step1-2 :创建一个RELEASE(发布版本)的仓库
test-release
,步骤与Step1-1一致,此处不在演示 -
最终服务器仓库如下
-
-
Step2: 选择Nexus服务器中的仓库组,然后将新添加的两个仓库加入到这个仓库组中,步骤如图所示
注意:Nexus服务器中有两个仓库组
maven-public
和nuget-group
,博主选择的为maven-public
-
Step3: 打开maven目录下的conf目录下的settings.xml文件,配置本地maven仓库对私服的访问权限,代码如下
-
Step4: 配置本地Maven仓库与私服的映射关系,代码如下
-
Step5: 在中央仓库
maven-central
中配置阿里镜像源 -
Step6: 在聚合工程(即父工程)
ParentDemo
的pom.xml文件中配置当前工程保存在私服中的具体位置然后使用maven指令deploy
将项目工程打包上传到私服,代码截图如下
可能出现的问题及疑问
-
问题:初次使用时可能会报如下错误
Plugin org.apache.maven.plugins:maven-install-plugin:2.4 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-install-plugin:jar:2.4: Could not transfer artifact org.apache.maven.plugins:maven-install-plugin:pom:2.4 from/to maven-public (http://localhost:8081/repository/maven-public/): authentication failed for http://localhost:8081/repository/maven-public/org/apache/maven/plugins/maven-install-plugin/2.4/maven-install-plugin-2.4.pom, status: 401 Unauthorized -> [Help 1]
-
原因是在Nexus中不允许匿名下载,如果不允许将不会从私服中下载依赖,这就会导致失败报错,所以需要在Nexus中设置允许匿名下载即可解决,方式如图所示
-
-
疑问:此时可从私服仓库的test-snapshot中看到项目,如图一所示;但是test-release仓库中却没有,如图二所示
-
原因是: 聚合工程(即父工程)及其子工程的版本均为
<version>1.0-SNAPSHOT</version>
,所以需要将其版本均改为<version>1.0-RELEASE</version>
,方法如下:-
Step1: 在聚合工程(即父工程)的pom.xml文件中将聚合工程及其子工程坐标的版本均改为
1.0-RELEASE
,如图所示 -
Step2: 将其子工程的pom.xml文件中对应的子工程和聚合工程的坐标均改为
1.0-RELEASE
,如图所示此时再次执行
mvn deploy
指令后,私服仓库test-release中也存在该项目,如图所示
-
-
-
注意:上传到私服的内容均不会自动删除,需手动删除,比如在将聚合工程(即父工程)及其子工程的坐标均改为
RELEASE
后,再次执行mvn deploy
指令后,私服仓库test-release中也存在该项目,此时私服test-snapshot中也存在该项目并不会自动删除,若想删除,则按图示操作即可
最终完整pom.xml文件
聚合工程ParentDemo
<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>ParentDemo</artifactId><packaging>pom</packaging><version>1.0-RELEASE</version><name>ParentDemo Maven Webapp</name><url>http://maven.apache.org</url><!--设置子模块--><modules><module>../RestFulDemo</module><module>../ssm_pojo</module><module>../ssm_dao</module></modules><!--配置公共坐标依赖--><dependencies><!--===================Spring基础坐标=======================--><!--spring坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.1.6</version></dependency><!--===================Spring提供的监听器ContextLoaderListener相关的坐标=======================--><!--spring-web --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.2.25.RELEASE</version></dependency><!--===================Spring集成web环境相关坐标=======================--><!-- servlet--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><!--jsp--><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.3</version><scope>provided</scope></dependency><!--===================Spring注解相关坐标=======================--><!--Annotation坐标--><dependency><groupId>javax.annotation</groupId><artifactId>javax.annotation-api</artifactId><version>1.3.2</version></dependency><!--=====================Spring集成AOP相关坐标=========================--><!--aspectj坐标--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.22.1</version></dependency><!--=====================Spring集成事务相关坐标=========================--><!--spring-tx坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>6.1.15</version></dependency><!--=====================数据库相关坐标=========================--><!--mysql坐标--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency><!--druid坐标--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.18</version></dependency><!--c3p0坐标--><dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.5</version></dependency><!--===================Spring集成JUnit相关的坐标=======================--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><!--spring-test坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>6.1.6</version><scope>test</scope></dependency><!--=====================Spring集成MyBatis相关坐标=========================--><!--MyBatis坐标--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.16</version></dependency><!--mybatis-spring--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>3.0.3</version></dependency><!--spring-jdbc--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>6.1.10</version></dependency><!--===================SpringMVC基础坐标=======================--><!--spring-webmvc--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.25.RELEASE</version></dependency><!--===================获取指定格式(比如JSON)数据相关坐标=======================--><!--jackson-core--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${spring.version}</version></dependency><!--jackson-databind--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${spring.version}</version></dependency><!--jackson-annotations--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>${spring.version}</version></dependency></dependencies><!--配置可选依赖--><dependencyManagement><dependencies><!--ssm_pojo坐标--><dependency><groupId>org.example</groupId><artifactId>ssm_pojo</artifactId><version>1.0-RELEASE</version></dependency><!--ssm_dao坐标--><dependency><groupId>org.example</groupId><artifactId>ssm_dao</artifactId><version>1.0-RELEASE</version></dependency><!--===================文件上传相关坐标=======================--><!--fileupload坐标--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.5</version></dependency><!--io坐标--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.17.0</version></dependency></dependencies></dependencyManagement><properties><!--自定义标签及标签名并写入版本号--><spring.version>2.17.1</spring.version><!--自定义jdbc.properties属性标签及属性值--><jdbc.driverClassName>com.mysql.cj.jdbc.Driver</jdbc.driverClassName><jdbc.url>jdbc:mysql://localhost:3306/ssm_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai</jdbc.url><jdbc.username>root</jdbc.username><jdbc.password>123456</jdbc.password></properties><!--定义多环境--><profiles><!--定义具体的环境一:生产环境--><profile><id>env_pro</id><!--定义环境中专用的属性值--><properties><jdbc.url>jdbc:mysql://localhost:3306/ssm_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai</jdbc.url></properties><!--设置默认启动:即设置该环境为默认启动环境--><activation><activeByDefault>true</activeByDefault></activation></profile><!--定义具体的环境二:开发环境--><profile><id>env_dep</id><!--定义环境中专用的属性值--><properties><jdbc.url>jdbc:mysql://localhost:3307/ssm_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai</jdbc.url></properties></profile><!--定义具体的环境三:测试环境--><profile><id>env_test</id><!--定义环境中专用的属性值--><properties><jdbc.url>jdbc:mysql://localhost:3308/ssm_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai</jdbc.url></properties></profile></profiles><build><finalName>ParentDemo</finalName><!--开启资源文件目录加载属性的过滤器--><resources><resource><directory>${project.basedir}/src/main/resources</directory><filtering>true</filtering></resource></resources><plugins><!--<plugin><artifactId>maven-surefire-plugin</artifactId><version>2.12.4</version><!–设置跳过测试–><configuration><!–是否跳过测试–><skipTests>false</skipTests><!–排除掉不参与测试的内容–><excludes><!–任意目录下的UserTest.java不参与测试–><exclude>**/UserTest.java</exclude></excludes></configuration></plugin>--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.2</version><!--配置maven打war包时,忽略web.xml检查<configuration><failOnMissingWebXml>false</failOnMissingWebXml></configuration>--></plugin><!-- Tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version></plugin><!--<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><!– maven插件版本 –><version>3.13.0</version><configuration><!– Java版本 –><source>21</source><compilerArgs><arg>-parameters</arg></compilerArgs></configuration></plugin>--></plugins></build><!--配置当前工程保存在私服中的具体位置--><distributionManagement><!--配置RELEASE(发布版本)的仓库`test-release`--><repository><id>test-release</id><url>http://localhost:8081/repository/test-release/</url></repository><!--配置SNAPSHOT(快照版本)的仓库`test-snapshot`--><snapshotRepository><id>test-snapshot</id><url>http://localhost:8081/repository/test-snapshot/</url></snapshotRepository></distributionManagement></project>
子工程RestFulDemo
<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>RestFulDemo</artifactId><packaging>war</packaging><version>1.0-RELEASE</version><name>RestFulDemo Maven Webapp</name><url>http://maven.apache.org</url><!--定义该工程的聚合工程(即父工程)--><parent><groupId>org.example</groupId><artifactId>ParentDemo</artifactId><version>1.0-RELEASE</version><!--聚合工程(即父工程)对应的pom.xml文件路径--><relativePath>../ParentDemo/pom.xml</relativePath></parent><!--在子工程中配置使用父工程中可选依赖的坐标或定义聚合工程(即父工程)中没有的依赖--><dependencies><!--ssm_pojo坐标--><dependency><groupId>org.example</groupId><artifactId>ssm_pojo</artifactId></dependency><!--ssm_dao坐标--><dependency><groupId>org.example</groupId><artifactId>ssm_dao</artifactId></dependency><!--===================文件上传相关坐标=======================--><!--fileupload坐标--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId></dependency><!--io坐标--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId></dependency></dependencies><build><finalName>RestFulDemo</finalName></build>
</project>
子工程ssm_dao
<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>ssm_dao</artifactId><packaging>jar</packaging><version>1.0-RELEASE</version><name>ssm_dao Maven Webapp</name><url>http://maven.apache.org</url><!--定义该工程的聚合工程(即父工程)--><parent><groupId>org.example</groupId><artifactId>ParentDemo</artifactId><version>1.0-RELEASE</version><!--聚合工程(即父工程)对应的pom.xml文件路径--><relativePath>../ParentDemo/pom.xml</relativePath></parent><!--在子工程中配置使用父工程中可选依赖的坐标或定义聚合工程(即父工程)中没有的依赖--><dependencies><!--ssm_pojo坐标--><dependency><groupId>org.example</groupId><artifactId>ssm_pojo</artifactId></dependency></dependencies><build><finalName>ssm_dao</finalName></build>
</project>
子工程ssm_pojo
<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>ssm_pojo</artifactId><packaging>jar</packaging><version>1.0-RELEASE</version><name>ssm_pojo Maven Webapp</name><url>http://maven.apache.org</url><!--定义该工程的聚合工程(即父工程)--><parent><groupId>org.example</groupId><artifactId>ParentDemo</artifactId><version>1.0-RELEASE</version><!--聚合工程(即父工程)对应的pom.xml文件路径--><relativePath>../ParentDemo/pom.xml</relativePath></parent><dependencies></dependencies><build><finalName>ssm_pojo</finalName></build>
</project>
相关文章:
Maven完整技术汇总
额外知识点 IDE IDE是集成开发环境的缩写,它是一种软件应用程序,提供了编码、调试和部署软件的一站式解决方案。这些功能集成在一起,使开发人员能够在一个环境中完成整个软件开发过程,从编写代码到调试和测试,直到最终…...
NOI系列赛事LaTeX模板
NOI系列赛事 L a T e X LaTeX LaTeX 模板 照搬照抄: s y k s y k C C C syksykCCC syksykCCC 大佬写的,但是看得人不多。真的很好,比其他的板子优秀多了。现在我当一个校友搬运工,搬过来。 \documentclass[UTF8,a4paper]{ctex…...
JustTrustMe是什么
JustTrustMe是什么 JustTrustMe 是一个用于 Android 的 Xposed 模块,主要用于绕过应用程序的 SSL pinning(SSL 证书锁定)机制。SSL pinning 是一种安全措施,应用程序通过它来验证服务器返回的 SSL 证书是否与应用程序内置的证书匹…...
题解 - 工作分配
题目描述 在工厂里,如果每道工序让不同的工人来做,所要花费的时间往往不一样。精明的老板为了提高效率,总是把生产某一产品所需要的N道工序进行最佳搭配,使生产某一产品所花费的总时间最少。现在就给出N个工人分别做N道工序所要花…...
GLM-4-Plus初体验
引言:为什么高效的内容创作如此重要? 在当前竞争激烈的市场环境中,内容创作已成为品牌成功的重要支柱。无论是撰写营销文案、博客文章、社交媒体帖子,还是制作广告,优质的内容不仅能够帮助品牌吸引目标受众的注意力&a…...
【Python基础】Python知识库更新中。。。。
1、Python知识库简介 现阶段主要源于个人对 Python 编程世界的强烈兴趣探索,在深入钻研 Python 核心语法、丰富库函数应用以及多样化编程范式的基础上,逐步向外拓展延伸,深度挖掘其在数据分析、人工智能、网络开发等多个前沿领域的应用潜力&…...
【arm】程序跑飞,SWD端口不可用修复(N32G435CBL7)
项目场景: 国民N32G43X系列,烧录了一个测试程序,在DEBUG中不知什么原因挂掉,然后就无法连接SWD或JLINK。 问题描述 在SWD配置中不可见芯片型号,无法connect,无法烧录。但基本判断是芯片没有损坏。怀疑是程…...
C++如何读取包含空格在内的整行字符串s? ← getline(cin,s);
【问题描述】 问:请分析下面代码,在利用 cin 输入带空格的整行字符串时,会输出什么? #include <bits/stdc.h> using namespace std;int main() {string s;cin>>s;for(int i0; i<s.size(); i) {cout<<s[i];}…...
活动预告 | Microsoft 365 在线技术公开课:让组织针对 Microsoft Copilot 做好准备
课程介绍 通过Microsoft Learn免费参加Microsoft 365在线技术公开课,建立您需要的技能,以创造新的机会并加速您对Microsoft云技术的理解。参加我们举办的“让组织针对 Microsoft Copilot for Microsoft 365 做好准备” 在线技术公开课活动,学…...
tomcat被检测到目标URL存在htp host头攻击漏洞
AI越来越火了,我们想要不被淘汰就得主动拥抱。推荐一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站 Tomcat被检测到目标URL存在http host头攻击漏洞,这个漏洞复现一下就是黑客访问你的网站,之后中修改请求头中的host属…...
【使用webrtc-streamer解析rtsp视频流】
webrtc-streamer WebRTC (Web Real-Time Communications) 是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或&a…...
【数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:编写一个程序实现单链表的基本运算。 相关知识 为了完成本关任务,你需要掌握:初始化线性表、销毁线性表、判定是否为空表、求线性…...
华为FreeBuds Pro 4丢了如何找回?(附查找功能使用方法)
华为FreeBuds Pro 4查找到底怎么用?华为FreeBuds Pro 4有星闪精确查找和离线查找,离线查找功能涵盖播放铃声、导航定位、星闪精确查找、上线通知、丢失模式、遗落提醒等。星闪精确查找是离线查找的子功能,当前仅华为FreeBuds Pro 4充电盒支持…...
直流开关电源技术及应用
文章目录 1. 开关电源概论1.1 开关电源稳压原理1.1.1 开关电源稳压原理 1. 开关电源概论 1.1 开关电源稳压原理 为了提高效率,必须使功率调整器件处于开关工作状态。 作为开关而言,导通时压降很小,几乎不消耗能量,关断时漏电流很…...
langchain 结构化输出
主要流程 1. 使用 Pydantic 定义结构化输出: 定义 AnswerWithJustification 类,用于描述输出的结构,包含以下字段: answer:答案内容(字符串类型)。justification:答案的理由或解释…...
开源Java快速自测工具,可以调用系统内任意一个方法
java快速测试框架,可以调到系统内任意一个方法,告别写单测和controller的困扰。 开源地址:https://gitee.com/missyouch/Easy-JTest 我们在开发时很多时候想要测试下自己的代码,特别是service层或者是更底层的代码,就…...
挺详细的记录electron【V 33.2.0】打包vue3项目为可执行程序
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、直接看效果 二、具体步骤 1.安装配置electron 1.将 electron 包安装到应用的开发依赖中。 2.安装electron-packager依赖(打包可执行文件&#…...
相比普通LED显示屏,强力巨彩软模组有哪些优势?
在科技技术的加持下,LED显示屏市场各类创新产品层出不穷,为市场带来了无限可能。其中,强力巨彩R系列H版(软模组)凭借其独特的技术优势,在行业内脱颖而出。那么,相比常规LED显示屏,强…...
操作系统(7)处理机调度
前言 操作系统中的处理机调度是一个核心概念,它涉及如何从就绪队列中选择进程并将处理机分配给它以运行,从而实现进程的并发执行。 一、调度的层次 高级调度(作业调度): 调度对象:作业(包含程序…...
【Spark】Spark的两种核心Shuffle工作原理详解
如果觉得这篇文章对您有帮助,别忘了点赞、分享或关注哦!您的一点小小支持,不仅能帮助更多人找到有价值的内容,还能鼓励我持续分享更多精彩的技术文章。感谢您的支持,让我们一起在技术的世界中不断进步! Sp…...
10.qml使用 shadereffect 实现高斯模糊
目录 高斯模糊sigma获取加权均值获取 高斯二维公式实现高斯一维公式实现使用总结 高斯模糊 高斯模糊应用领域我就不过多讲解,想了解自己去了解 高斯模糊有 一维公式 二维公式 当然我们图像是二维的 但是实际上二维公式用于计算那是消耗大量的算力的,…...
2024年12月GESPC++一级真题解析
一、单选题(每题2分,共30分) 题目123456789101112131415答案 C C D B B D B C C C D C D B D 1.2024 年 10 月 8 日,诺贝尔物理学奖 “ 意外地 ” 颁给了两位计算机科学家约翰 霍普菲尔德( John J. H…...
Nmap脚本参数详解
免责声明:使用本教程或工具,用户必须遵守所有适用的法律和法规,并且用户应自行承担所有风险和责任。 文章目录 一、 按脚本分类1. 检查身份验证机制2. 探测广播行为3. 登录爆破4. 默认脚本运行5. 网络资产发现6. Dos漏洞检测7. 漏洞利用8. 检…...
Rstudio-server的安装、配置、维护
一、安装Rstudio-server (1)安装R语言: sudo apt install r-base # 如果没有管理员权限无法操作 # 这样装上R默认在/usr/bin/R其实基本上的流程都可以参考posit的官网(也就是Rstudio的官网): https://posit.co/download/rstudio…...
2024ECCV|DiffBIR: 基于生成扩散先验进行盲图像恢复
文章标题:《DiffBIR: Towards Blind Image Restoration with Generative Diffusion Prior》 DiffBIR收录于2024ECCV,是中科院深圳先进技术研究院(董超等人)、上海AI Lab和香港中文大学联合发布的一项研究。 原文链接:h…...
前端报错npm ERR cb() never called问题
环境使用node版本v14.21.3,npm版本6.14.18 1.问题描述 1.1使用npm install后报错 npm ERR! cb() never called!npm ERR! This is an error with npm itself. Please report this error at: npm ERR! ? ? <https://npm.community>npm ERR! A complete log…...
SLM510A系列——24V,15到150mA单通道可调电流线性恒流LED驱动芯片
SLM510A 系列产品是单通道、高精度、可调电流线性恒流源的 LED 驱动芯片,在各种 LED 照明产品中非常简单易用。其在宽电压输入范围内,能保证极高的输出电流精度,从而在大面积的光源照明中,都能让 LED 照明亮度保持均匀一致。 由于…...
VBA API 概述 / 声明 / 宏编程
注:本文为 “VBA API 概述 | 宏编程 | 执行速度慢” 相关文章合辑。 未整理去重。 VBA API 详解 Office 二次开发于 2020-12-17 22:27:10 发布 Office 版本变动 在 Office 2010 之前,微软仅提供 32-bit 版本的 Office。而自 Office 2010 起࿰…...
Python 开源项目精彩荟萃
一、Web 开发框架 Django 高效路由系统: 支持基于正则表达式的复杂 URL 模式匹配,精准定位视图函数,例如可通过r^articles/(?P<year>\d{4})/$这样的正则表达式来匹配特定年份的文章列表页面 URL,并将年份参数传递给视图函数…...
Debezium系列之:使用Debezium采集oceanbase数据库
Debezium系列之:使用Debezium采集oceanbase数据库 一、oceanbase数据库二、安装OceanBase三、安装oblogproxy四、基于Docker的简单采集案例五、生产实际应用案例Debezium 是一个开源的分布式平台,用于监控数据库变化和捕捉数据变动事件,并以事件流的形式导出到各种消费者。D…...
AI初创企业的未来趋势和潜在挑战
AI初创企业的未来趋势和潜在挑战 AI初创企业的未来趋势和潜在挑战可以从多个方面进行分析: 未来趋势 AI监管: 随着AI技术的快速发展,各国政府开始制定相关法规,以确保AI的安全和伦理使用。这将影响初创企业的运营模式和市场准入。 日常生活…...
Grafana配置告警规则推送企微机器人服务器资源告警
前提 已经部署Grafana,并且dashboard接入数据 大屏编号地址:Node Exporter Full | Grafana Labs 创建企微机器人 备注:群里若有第三方外部人员不能创建 机器人创建完成,记录下来Webhook地址 Grafana配置告警消息模板 {{ define &…...
RFDiffusion xyz_to_c6d函数解读
函数 xyz_to_c6d将给定的蛋白质主链坐标 (N,Cα,C)转换为 6D矩阵表示,即用以下几何特征描述两两残基之间的关系: 距离 dist:残基间 Cβ 原子的欧几里得距离。二面角 omega:两个残基的 Cα−Cβ 向量之间的二面角。二面角 theta:由 N−Cα−Cβ和 Cβ间向量定义的二面角。平…...
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍01
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
VSCode 报错:rust-analyzer requires glibc >= 2.28 in latest build
报错信息 /home/jake/.vscode-server-insiders/extensions/matklad.rust-analyzer-0.3.953/server/rust-analyzer: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.29 not found (required by /home/jake/.vscode-server-insiders/extensions/matklad.rust-analyzer-0.3.9…...
x2go远程控制
X2Go 优点:专为远程桌面和图形界面优化。性能优越,特别是在网络带宽较低的情况下,采用了高效的压缩和缓存技术。支持多用户、会话恢复功能,适合企业使用。使用 SSH 连接,具有较好的安全性。 安装与配置:需…...
SQL 单表查询练习题(一)
在 SQL 的学习过程中,单表查询是非常重要的基础部分,下面为大家分享一些单表查询的练习题以及对应的正确答案,希望能帮助大家更好地掌握相关知识。 一、题目及答案详情 1. 查询课程表中,没有前序课程的课程信息,查询…...
Ubuntu 安装texstudio sty与texlive
手动安装需要的包 访问CTAN网站(Comprehensive TeX Archive Network)并下载enumitem宏包: enumitem CTAN页面下载后,将宏包解压到/usr/share/texmf/tex/latex/下。 可打开texstudio/帮助/宏包帮助下载。 如果不想手动安装一个个…...
DevExpress WPF中文教程:Grid - 如何移动和调整列大小?(一)
DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...
【现代服务端架构】传统服务器 对比 Serverless
在现代开发中,选择合适的架构是至关重要的。两种非常常见的架构模式分别是 传统服务器架构 和 Serverless。它们各有优缺点,适合不同的应用场景。今天,我就带大家一起对比这两种架构,看看它们的差异,并且帮助你选择最适…...
SecureCRT/FX使用[无限试用SecureCRT][新版本SecureFX双击站点总是自动跳到SecureCRT]
无限试用SecureCRT 本文摘录于:https://blog.csdn.net/qq_52162404/article/details/139703993#:~:textSecureCRT只是做学习备份之用,绝无抄袭之意,有疑惑请联系本人! 我这里修改BAT如下,同时删除CRT和FX的license: echo off re…...
c++ CMakeLists.txt详解
基本结构 CMake 最低版本声明 用于指定需要的最低 CMake 版本,确保兼容性。 cmake_minimum_required(VERSION 3.10)指定 CMake 的最低版本。确保用户的 CMake 版本符合项目需求,否则报错。版本选择建议根据项目使用的功能决定。例如,3.10 引…...
树状数组详解
概述 树状数组(Binary Indexed Tree,简称BIT),是一种数据结构,用于处理区间查询和更新问题。它是一种可以高效地在对数级别时间复杂度内进行单点更新和区间查询的数据结构。树状数组通常用于解决以下两类问题…...
photoshop的2个形状-箭头
有时候用ps画一些教程类图文,需要用到箭头. 另外自己画了一个镂空的长方形和正方形 形状的路径一般在Custom Shapes文件夹内 例如 E:\photoshopCS4\Adobe Photoshop CS4\Presets\Custom Shapes...
docker 部署 redis
docker 部署 redis 1. 下载 redis 镜像 # docker images | grep redis bitnami/redis 7.2.4-debian-11-r5 45de196aef7e 10 months ago 95.2MB2. docker-compose 部署 version: "3" services:redis:image: bitnami/redis:7.2.4-debian-11-…...
如何持续优化呼叫中心大模型呼入机器人的性能?
如何持续优化呼叫中心大模型呼入机器人的性能? 原作者:开源呼叫中心FreeIPCC,其Github:https://github.com/lihaiya/freeipcc 持续优化呼叫中心大模型呼入机器人的性能是一个复杂而细致的过程,它涉及到数据、模型结构…...
【01】mysql安装后MySQL Configurator无法启动的问题
安装完Mysql之后打开MySql Configurator提示MySQL Configurator Internal error.(值不能为null.参数名:input) The Configurator will now close. mysql安装后MySQL Configurator无法启动的问题 文章目录 mysql安装后MySQL Configurator无法启动的问题1.MySQL Configurator无法…...
基于单片机的血氧心率检测与报警系统(论文+源码)
1系统的功能及方案设计 本次课题为基于单片机的血氧心率检测与报警系统研制,在此设计了如图2.1所示的系统结构框图,整个系统包括了MAX30102心率血氧检测模块,DS18B20体温检测模块,液晶显示模块,按键以及主控制器stm32…...
科技潮头浪接天,一桥飞架两界连。EthernetIP转Profinet互译连
本案例介绍的是西门子1200PLC通过稳联技术PROFINET转EtherNetIP网关(WL-ABC2006)连接HCS-6100系统配置案例。 打开稳联技术Ethernetip转profient网关(WL-ABC2006)配置软件,因为网关作为EtherNetIP从站,所以选择PN2EIP。设置网关Pr…...
day11 性能测试(4)——Jmeter使用(黑马的完结,课程不全)直连数据库+逻辑控制器+定时器
【没有所谓的运气🍬,只有绝对的努力✊】 目录 1、复习 1.1 断言(3种) 1.2 关联(3种) 1.3 录制脚本 2、Jmeter直连数据库 2.1 直连数据库——使用场景 2.2 直连数据库——操作步骤 2.2.1 案例1&…...