学习内容
- 分模块开发(重点)
- 聚合(重点)
- 继承(重点)
- 属性(重点)
- 版本管理
- 资源配置
- 多环境开发配置
- 跳过测试
- 私服(重点)
学习产出
摘自黑马 Maven 教学,然后整理的笔记。有自己的理解,还有PPT的原话。
1、 分模块开发与设计
工程模块与模块划分
将我们的工程进行了模块划分,一个工程就负责一个模块的运行,当这几个模块合并在一起就是一个完整的项目。
模块之间的通信就是通过接口。
将资料中的 springmvc_ssm 项目导入到 IDEA中,这里是根据黑马视频来进行学习的,所有使用的是黑马的资料,查看 springmvc_ssm 项目的结构,然后将各种模块进行拆分。
导入工程是在新建工程的时候不是新建模块,而是导入模块。
先大概知道这种思想,等学完 SSM 以后就可以进行实操。
拆分 pojo模块
新建一个工程命名为 ssm_pojo ,并且 groupId 和原来的项目是相同的。这个项目的Maven结构的 test 没有什么太大的用处,所以可以直接删除,在 main 的 java 中可以创建出跟原 springmvc_ssm 项目相同目录结构,最后将原来的 User 文件复制到新建的工程目录中去。
拆分 dao模块
拆分 service模块
拆分 control模块
分模块开发:
- 模块中仅包含当前模块对应的功能类与配置文件
- spring核心配置根据模块功能不同进行独立制作
- 当前模块所依赖的模块通过导入坐标的形式加入当前模块后才可以使用
- web.xml需要加载所有的spring核心配置文件
2、 聚合
多模块构建维护
当其中一个模块更新后,其他模块可能会出现不能使用的情况。所以最好是一起更新,所以有一个总的管理模块。
当编译这个管理模块时,里面的四个模块同时进行编译。
这种的工作机制就被称为聚合
聚合:聚合用于快速构建maven工程,一次性构建多个项目/模块。
创建一个空模块,pom.xml文件里添加打包类型为pom
<!--定义该工程用于管理构建-->
<packaging>pom</packaging>
用 modules 标签来定义当前模块进行构建操作时关联的其他模块名称。
<!--管理的工程列表-->
<modules>
<!--具体的工程名称-->
<module>../ssm_pojo</module>
<module>../ssm_dao</module>
<module>../ssm_service</module>
<module>../ssm_controller</module>
</modules>
在右边的Maven控制台,对工程进行编译时,会将每一个构建都会编译,当执行这个管理模块时,在里面的其他构建会在执行相同的生命周期。
打包的方式默认的是 jar ,聚合工程的管理模块打包方式是 pom,web工程打包的方式是 war 。
注意:参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关。
3、 继承
模块依赖关系维护
不同的模块不同人开发的时候,可能使用的资源版本不同,当整合到一起的时候可能会出现兼容上的问题。
所以需要有个总的管理模块,在总的模块中去规定使用资源的版本
其他的模块去调用管理模块的资源,当需要的版本不是管理模块,提供的版本的时候,在管理模块中修改资源和对应的版本。
在管理模块中写所有的依赖,在其他的模块中,可以用管理模块中导入的所有依赖资源。
需要注意的是,添加依赖的时候 ,需要在声明依赖管理,声明的方法是需要在dependencies 标签外添加 dependencyManagement 标签。
<dependencyManagement>
<dependencies>
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
</build>
将其他模块需要用到的依赖资源全部在管理模块中导入。
- 继承的作用:
通过继承可以实现在子工程中沿用父工程中的配置
maven中的继承与java中的继承相似,在子工程中配置继承关系。
- 制作方式:
在子模块中定义该工程的父工程坐标与对应的位置。
<!--定义该工程的父工程-->
<parent>
<!--父工程的依赖-->
<groupId>com.itheima</groupId>
<artifactId>ssm</artifactId>
<version>1.0-SNAPSHOT</version>
<!--填写父工程的pom.xml文件-->
<relativePath>../ssm/pom.xml</relativePath>
</parent>
其他模块中自带依赖中的 groupId 和 version 标签可以省略。
将所以子模块的 pom 文件中所有依赖的 version 标签全部删除。当修改依赖资源版本的时候可以直接修改管理模块中依赖资源的版本。
相同思路,在管理模块中的 build 标签里导入的插件资源,在 plugins 标签两端添加 pluginsManagement 标签,这时子模块中的版本可以删除,想修改插件版本时,需要修改管理模块的版本号;
<build>
<pluginManagement>
<plugins>
</plugins>
</pluginManagement>
</build>
将所有的子模块的依赖写入;
- 继承的资源
当父管理模块中写好的时候,这些在子模块中都可以沿用,不用写。
继承与聚合
- 作用
聚合用于快速构建项目
继承用于快速配置 - 相同点
聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个pom文件中。
聚合与继承均属于设计型模块,并无实际的模块内容。 - 不同点
聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些。
继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己。
4、 属性
属性类别:自定义属性
- 作用
等同于定义变量,方便统一维护 - 定义格式 (在)
<!--定义自定义属性-->
<properties>
<spring.version>5.1.9.RELEASE</spring.version>
<junit.version>4.12</junit.version>
</properties>
- 调用格式
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
spring.version 标签相当于变量,里面的值是标签的内容。可以替换所有 spring 版本是 5.1.9.RELEASE 的依赖。
属性类别:内置属性
- 作用
使用maven,内置属性,快速匹配。 - 调用格式
${basedir}
${version}
在父管理模块中,对导入的子模块依赖的版本号也可以进行修改,可以改为 ${version} ,但是自身依赖版本号的不能修改成这个。
属性类别:Setting属性
- 作用
使用Maven配置文件setting.xml 中的标签属性,用于动态配置 - 调用格式
${settings.localRepository}
属性类别:Java系统属性
- 作用
读取Java系统属性 - 调用格式
${user.home}
- 系统属性查询方式
mvn help:system
属性类别:环境变量属性
- 作用
使用Maven配置文件setting.xml 中的标签属性,用于动态配置 - 调用格式
${env.JAVA_HOME}
- 环境变量属性查询方式
mvn help:system
5、 版本属性
工程版本区分
-
SNAPSHOP (快照版本)
- 项目开发过程中,为方便团队成员合作,解决模块间相互依赖和时时更新的问题,开发者对每个模块进行构建的时候,输出的临时性版本叫快照版本(测试阶段版本)
- 快照版本会随着开发的进展不断更新
-
RELEASE (发布版本)
- 项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的,即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本
当本身的工程使用不同的版本,进行打包的时候不同的版本会单独打包。
比如使用 1.0-SNAPSHOT,打包成一个单独的文件夹,使用 2.0-SNAPSHOT,打包成一个单独的文件夹,使用 2.1.3-SNAPSHOT,打包成一个单独的文件夹。
工程版本号约定
-
预定规范
- <主版本>.<次版本>.<增量版本>.<里程碑版本>
- 主版本:表示项目重大架构的变更,如: spring5 相较于 spring4 的迭代
- 次版本:表示有较大的功能增加和变化,或者全面系统地修复漏洞
- 增量版本:表示有重大漏洞的修复
- 里程碑版本:表明一个版本的里程碑(版本内部)。这样的版本同下一个正式版本相比,相对来说不是很稳定,有待更多的测试
-
范例:
- 5.1.9.RELEASE
6、 资源配置
资源配置多文件维护
但是还有其他的文件需要管理,jdbc 的url,用户名和密码。
- 在定义自定义属性中,添加需要代替的内容,标签命名为内容的标签例如:
<jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db</jdbc.url>
<jdbc.password>root</jdbc.password>
- 则在 jdbc.properties 文件中
jdbc.url=${jdbc.url}
- 在 build 标签中添加 resources 标签,里面是 resource 标签
<build>
<!--配置资源文件对应的信息-->
<resources>
<resource>
<!--对应资源文件的目录,支持使用属性动态设定吧路径-->
<directory>../ssm_dao/src/main/resources</directory>
<!---开启对配置文件的资源加载过滤-->
<filtering>true</filtering>
</resource>
</resources>
</build>
但是这样写有局限性, 只能 ssm_dao 工程里面的使用,所以进行优化。
<directory>${project.basedir}/src/main/resources</directory>
这样写的话,每个子模块都可以使用。
但是只能是main中使用, ssm_service 模块中的 test 无法使用,所以需要继续添加。
与添加 resources 标签相同的方法,在 build 中添加 testResources 标签。
<testResources>
<testResource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
这样就完成了,在配置文件中读取与我们核心配置中的定义属性值。
7、 多环境开发配置
多环境兼容
在开发过程中可能有不同的环境,可能有生产环境,有开发环境,有测试环境等;
所以需要对环境进行配置
多环境配置
在 pom 文件中创建多个环境。
<profiles>
<!--定义具体的环境:生产环境-->
<profile>
<!--定义环境对应的唯一名称-->
<id>pro_env</id>
<!--定义环境中专用的属性值-->
<properties>
<jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db</jdbc.url>
</properties>
</profile>
<!--定义具体的环境:开发环境-->
<profile>
<!--定义环境对应的唯一名称-->
<id>dep_env</id>
<properties>
<jdbc.url>jdbc:mysql://localhost:3306/ssm_db</jdbc.url>
</properties>
</profile>
</profiles>
然后打包进行测试,会发现打包成的 jdbc.properties 文件中的 url 没有正常的显示。
然后怎样才能打包成功呢呢,在右上角添加 Configurations,依旧是添加Maven,右边命名为 开发环境打包,选择对应的 pom 文件是父管理模块,在Command line 中,写 install -P dep_env,然后应用。
这样打包成的 jdbc.properties 文件就会携带参数。
url:jdbc:mysql://localhost:3306/ssm_db
同理:
jdbc:mysql://127.0.0.1:3306/ssm_db
也可以添加默认启动,代表使用右方的 Maven 面板进行install,直接使用已经添加过默认启动的环境。
<profiles>
<!--定义具体的环境:生产环境-->
<profile>
<!--定义环境对应的唯一名称-->
<id>pro_env</id>
<!--定义环境中专用的属性值-->
<properties>
<jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db</jdbc.url>
</properties>
<!--设置默认启动-->
<activation>
<activeByDefault>
true
</activeByDefault>
</activation>
</profile>
加载指定环境
-
作用
- 加载指定环境配置
-
调用格式
- mvn 指令 –P 环境定义id
-
范例
- mvn install –P pro_env
8、 跳过测试(了解)
跳过测试环节的应用场景
- 整体模块功能未开发
- 模块中某个功能未开发完毕
- 单个功能更新调试导致其他功能失败
- 快速打包
跳过测试模块的方法有好几种。
-
在Maven控制台上能直接跳过
点击跳过即可 -
执行Maven命令
在对应工程成 pom 文件中,右键 run maven —> New Goal…
在打开的页面中输入自己需要执行命令的代码,比如想要将工程包装,并且是跳过 test 测试阶段,则输入 mvn install -D skipTests,点击确定即可直接安装并且跳过了 test 。 -
使用插件
在 pom 中添加插件,用来跳过测试内容
<plugin>
<!--配置跳过测试-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<!--设置跳过测试-->
<skipTests>true</skipTests>
</configuration>
</plugin>
设置指定测试内容或者排除指定的测试内容。
<configuration>
<includes>
<!--包含指定的用例 里面的内容支持通配符-->
<include>**/UserServiceTest.java</include>
</includes>
<excludes>
<!--排除-->
<exclude></exclude>
</excludes>
</configuration>
9、 私服
分模块合作开发
Nexus服务器
- Nexus是Sonatype公司的一款maven私服产品
- 下载地址: https://help.sonatype.com/repomanager3/download
在官网上下载对应系统的压缩包,解压到自己放置资源的地方(除了系统盘),然后重命名为 nexus ,这是我电脑上对应的路径 D:\idea\nexus\nexus-3.20.1-01\bin
在 bin 目录下路径导航栏输入 cmd ,然后回车。
在命令控制符界面输入nexus /run nexus
,然后就会打开 nexus 文件,会进行打开的一系列操作,直到
这个出现说明打开成功。
在浏览器上去访问这个服务器,地址栏输入http://localhost:8081/
,当想要修改端口号时,在 etc 目录中的默认配置文件中可以修改。
这就是对应的端口号,改完之后重启 nexus,输入自己修改的端口号即可。
如果想修改服务器相关的配置,则要修改 bin 目录下的 nexus.vmoptions文件,例如默认占用内存空间。
私服资源获取
-
宿主仓库 hosted
-
保存无法从仓库获取的资源
- 自主研发
- 第三方非开源项目
-
-
代理仓库 proxy
- 代理远程仓库,通过 nexus 访问其他公共仓库,例如中央仓库
-
仓库组 group
- 将若干个仓库组成一个群组,简化配置
- 仓库组不能保存资源,属于设计型仓库
进入到服务器中,点击右上角的 sign in,进行登录,用户名默认为 admin,密码在nexus\sonatype-work\nexus3\admin.password
,这就是服务器的密码,进入之后会让修改密码,修改成自己可以记住的,一般是跟用户名重复 admin 或者是 1234,像 sql 数据库的用户名就是 root ,密码一般为 root 。
然后登录进去,
在浏览仓库的时候会发现有三种仓库的标志,不同的符号代表不同的仓库类型。
在上方有个设置按钮,里面是用来操作服务器使用的。
在设置中创建一个新的仓库,点击设置,在 Repositories 中创建新的仓库。
在仓库列表中找能创建的仓库,这三个是可以的,创建一个 hosted 仓库。
输入创建的仓库名,选择仓库属于的类型,里程碑还是次版本;
然后点击下面的创建仓库按钮。
然后在仓库列表中就多出了一个我们新建的仓库,将我们的仓库添加到仓库组中。
点击 maven-public ,如图按顺序点击。
然后回到浏览界面,去进入这个仓库中。
进入之后可以上传插件
在 IDEA 中打包成的 jar 包,可以导入进去。
然后将 pom 文件中的群组ID、项目ID和版本号填写进去。
提交的话显示出错,原因是因为我们创建的是 release 仓库,不允许添加 SNAPSHOT,将SNAPSHOT改为 RELEASE,重新上传即可。
然后在新建的仓库中会显示上传的东西
IDEA环境中资源上传与下载
上传:
本地仓库上床到私服中,需要访问私服的用户名 / 密码、上传的位置(宿主地址)
下载:
访问私服的用户名 / 密码、下载的地址(组地址)
每次上传不同的项目可能会上传到不同的地方,格式也不同,所以上传的地址配置到项目中,下载的地址配置到本地里面。
在 Maven 的 settings.xml 文件中,在 servers 标签下添加 server 标签。
<server>
<id>zpd-release</id>
<username>admin</username>
<password>admin</password>
</server>
id 的值是自己设置的,这是 release 的 id 值,但是还应该有 snapshot 的配置,所以再写一个 server 标签。并在仓库中添加 release 仓库。
</server>
<id>zpd-snapshots</id>
<username>admin</username>
<password>admin</password>
</server>
然后在 mirrors 标签中添加 mirror 标签,以前在里面添加过阿里云的仓库,现在在原来的基础上添加一个新的。
<!--自定义的私服-->
<mirror>
<id>nexus-zpd</id>
<mirrorOf>*</mirrorOf>
<!--maven-public 仓库组的 url-->
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
这是上传,接下来我们来说怎么下载;
需要在 pom 文件中添加发布配置管理
<distributionManagement>
<repository>
<!--settings文件中service标签的id-->
<id>zpd-release</id>
<!--mirror中的url标签-->
<url>http://localhost:8081/repository/zpd-release/</url>
</repository>
<snapshotRepository>
<id>zpd-snapshots</id>
<url>http://localhost:8081/repository/zpd-snapshots/</url>
</snapshotRepository>
</distributionManagement>
写完后就可以在Maven控制台利用插件上传,deploy。
在仓库内中的 snapshots 中就可以看到上传的各个模块。可以通过 Search 搜索模块。