Maven 的本质是一个项目管理工具
,将项目开发和管理过程抽象成一个项目对象模型 (POM)
POM (Project Object Model) : 项目对象模型
https://maven.apache.org/download.cgi
1.配置高级环境
2.输入cmd 测试是否全局配置成功!!!
用于存储资源,包含各种 jar 包。
中央仓库由Maven开发者团队进行维护,私服服务器由各个公司的局域网进行管理。 正常开发者需要一个Jar现在本地找,假如本地找不到要门去私服下载对应的Jar包,要么去Maven官方管理的Maven中央仓库去下载。
私服的作用:
① 保存具有版权的资源,包含购买或自主研发的 jar;
② 解决访问速度慢的问题;
描述仓库中资源的位置。 让Maven能够更快捷的帮助我们找到对应的Jar包。
组成:
groupId (组织ID)
: 定义当前 Maven 项目隶属的组织名称(通常是域名反写,如 org.mybatis) ;
artifactId (项目名ID)
: 定义当前 Maven 项目名称(通常是模块名称,例如 CRM, SMS)
version (项目版本号)
: 定义当前项目版本号;
packaging
: 定义当前项目的版本号;
我们安装Maven的时候,官方不会给我们默认指定一个Maven的仓库的,需要我们开发者自己来对其进行配置和安装。
我们在命令控制台中输入 CMD
然后回车 ,再输入mvn
,Maven官方会再电脑用户给我们生成一个 .m2
的文件夹。这个文件夹就是我们所说的Maven本地仓库
<localRepository>E:\Maven\apache-maven-3.6.3\maven-repolocalRepository>
因为我们没有私服,只能借用阿里云的镜像进行快速访问外网Maven中央仓库
<mirror>
<id>nexus-aliyunid>
<mirrorOf>*mirrorOf>
<name>Nexus aliyunname>
<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>
我们需要手动编写: main包和test包在src父包中,然后分别在main和test的子包中写java包和resources包。
package main.java.com.jsxs;
/**
* @Author Jsxs
* @Date 2023/8/1 16:09
* @PackageName:main.java
* @ClassName: Demo1
* @Description: TODO
* @Version 1.0
*/
public class Demo1 {
public static void main(String[] args) {
System.out.println("你好 Maven!");
}
}
如果我们普通的Java目录想要变成一个Maven项目,那么我们需要在Src同级目录下编写一个文件 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<packaging>warpackaging>
<groupId>com.jsxsgroupId>
<artifactId>Maven_handleartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>Maven_handlename>
<description>Demo project for Maven_handledescription>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.13version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.mavengroupId>
<artifactId>tomcat7-maven-pluginartifactId>
<version>2.1version>
<configuration>
<port>80port>
<path>/path>
configuration>
plugin>
plugins>
build>
project>
Maven 构建命令使用 mvn 开头,后面添加功能参数,可以一次执行多个命令,使用空格分隔。
其实这里分别对应着我们SpringBoot项目中的右侧功能栏目。
mvn compile #编译
mvn clean #清理
mvn test #测试 target 目录下 surefire-reports 有测试报告
mvn package #打包 只打包源程序
mvn install #安装到本地仓库
- 执行编译命令之后
- 执行清理的操作
- 执行测试
我们在target目录中可以看到我们的测试结果,都会被记录下来的
- 执行 打包
- 将我们的项目安装到本地仓库
(注意要用 命令行,不要用 powershell)
- 创建Java工程
mvn archetype:generate
-DgroupId={project-packaging}
-DartifactId={project-name}
-DarchetypeArtifactId=maven-archetype-quickstart
-DinteractiveMode=false
- 创建 web 工程:
mvn archetype:generate -DgroupId={project-packaging}
-DartifactId={project-name}
-DarchetypeArtifactId=maven-archetype-webapp
-Dversion=0.0.1-snapshot
-DinteractiveMode=false
打包web项目打包成war; java工程打包成jar。
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.mavengroupId>
<artifactId>tomcat7-maven-pluginartifactId>
<version>2.1version>
<configuration>
<port>80port>
<path>/path>
configuration>
plugin>
plugins>
build>
依赖指当前项目运行所需要的 jar
, 一个项目可以设置多个依赖。
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
dependency>
dependencies>
就是说假如B项目使用了A项目本身的依赖,那么B项目将会拥有A项目所有的依赖,然而A项目是不变的。
依赖具有传递性:
依赖传递的冲突问题:
层级越浅,优先级越高,层级越深,优先级越低
;顺序靠前的覆盖配置顺序靠后的
;后配置的覆盖先配置的
;可选依赖指对外隐藏当前所依赖的资源 - 不透明
当我们配置完这一项之后,假如别人引入我们的项目依赖,那么不会存在延申的依赖的。比如说我们在项目A中引入项目B,项目B的pom.xml的文件中在junit这个依赖,然后加入optional之后,我们就在项目A中看不到B中的Junit这个依赖。
<optional>trueoptional>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<optional>trueoptional>
dependency>
项目3中不添加 optional,我们这里在项目2中直接进行排除的操作。
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<exclusions>
<exclusion>
<groupId>org.hamcrestgroupId>
<artifactId>hamcrest-coreartifactId>
exclusion>
exclusions>
dependency>
main 文件夹范围内
)test 文件夹范围内
)package 指令范围内
)带有依赖范围的资源在进行传递时,作用范围会受到影响:
Maven 构建生命周期描述的是一次构建过程中经历了多少个事件:
pre-clean
执行一些需要在clean之前完成的工作clean
移除所有上一次构建生成的文件post-clean
执行一些需要在clean之后立刻完成的工作initialize
(初始化) 初始化构建状态,比如设置属性值。generate-sources
(生成源代码) 生成包含在编译阶段中的任何源代码。process-sources
(处理源代码) 处理源代码,比如说,过滤任意值。generate-resources
(生成资源文件) 生成将会包含在项目包中的资源文件。process-resources
(处理资源文件) 复制和处理资源到目标目录,为打包阶段最好准备。process-classes
(处理类文件) 处理编译生成的文件,比如说对Java class文件做字节码改善优化。generate-test-sources
(生成测试源代码) 生成包含在编译阶段中的任何测试源代码。process-test-sources
(处理测试源代码) 处理测试源代码,比如说,过滤任意值。generate-test-resources
(生成测试资源文件) 为测试创建资源文件。process-test-resources
(处理测试资源文件) 复制和处理测试资源到目标目录。test-compile
(编译测试源码) 编译测试源代码到测试目标目录.process-test-classes
(处理测试类文件) 处理测试源码编译生成的文件。prepare-package
(准备打包) 在实际打包之前,执行任何的必要的操作为打包做准备。pre-integration-test
(集成测试前) 在执行集成测试前进行必要的动作。比如说,搭建需要的环境。integration-test
(集成测试) 处理和部署项目到可以运行集成测试环境中。post-integration-test
(集成测试后) 在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。默认 maven 在各个生命周期上绑定有预设的功能
eg: 我们自定义在test测试的时候,进行打包的操作。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-source-pluginartifactId>
<version>2.2.1version>
<executions>
<execution>
<goals>
<goal>jargoal>
goals>
<phase>generate-test-resourcesphase>
execution>
executions>
plugin>
plugins>
build>
当我们点击生命周期的test的时候,我们发现帮助我们打成了一个jar包
在实际开发中,dao、service、controller是不可能全部同时有一个人做的,也就是说我们的dao、service、contollrt是需要进行分包的操作的。
实体类 User
数据层接口
UserDao配置文件
: 保留与数据层相关配置文件(3 个)
pom.xml
: 引入数据层相关坐标即可,删除 springmvc 相关坐标
注意: 我们发现问题,我们发现我们的dao层项目中需要使用到实体类,但是我们的dao项目中没有放实体的项目,所以我们需要对原先的 ssm_pojo进行安装到本地的仓库,然后我们在ssm_dao层使用三件套引用即可。
业务层接口与实现类
(UserService、UserServiceImpl)配置文件
:保留与数据层相关配置文件(1个)pom.xml
: 引入数据库相关坐标即可,删除 springmvc 相关坐标
注意: 因为我们的service层是需要我们的ssm_dao层的接口和实现类的,所以我们需要在ssm_dao 进行 install的操作,又因为我们ssm_dao install ssm_pojo, 所以直接依赖ssm_dao,间接依赖ssm_pojo
。
表现层控制器类与相关设置类
(UserController,异常相关)配置文件
:保留与表现层相关配置文件(1个)、服务器相关配置文件(1个)pom.xml
:引入数据层相关坐标即可,删除 springmvc 相关坐标
运行的话,我们只需要运行Controller即可。因为我们其他的资源都放在本地仓库了,所以不需要进行启动其他的业务即可。
在实际开发的过程中,我们会有很多模块,但是假如我们对一个模块进行更新后,其他模块不知到它更新。那么这个服务就会启动不起来。所以我们现在迫切需要一个统一的管理模块,负责管理我们的4个模块,当这个统一的模块更新的时候,这管理的所有模块都将一起进行更新,谁都不会落下
。
- 创建一个空模块,打包类型定义为 pom
<packaging>pompackaging>
- 定义当前模块进行构建操作时关联的其他模块名称
<modules>
<module>../ssm_controllermodule>
<module>../ssm_servicemodule>
<module>../ssm_daomodule>
<module>../ssm_pojomodule>
modules>
注意事项:参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关;
比如说: 在我们日常开发中,我们使用多模块开发的时候,会遇到如下的问题:“我们在开发一个SpringBoot项目会出现版本依赖的版本号不一致的问题,所以我们需要对我们所有使用的公共版本号进行统一管理,避免出现不兼容的问题”。
作用:通过继承可以实现在子工程中沿用父工程中的 配置
我们不仅可以对版本依赖的版本号可以进行统一的管理,而且我们也可以使用 插件管理器
对其进行版本控制。
- 父工程进行声明的操作
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.13.2version>
<scope>testscope>
dependency>
dependencies>
dependencyManagement>
- 子工程和父工程进行联系
<parent>
<artifactId>Maven_IdeaartifactId>
<groupId>com.jsxsgroupId>
<version>1.0-SNAPSHOTversion>
<relativePath>pom.xmlrelativePath>
parent>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
dependency>
dependencies>
快速构建项目
快速配置
文件打包方式均为 pom
,可以将两种关系制作到同一个 pom 文件中聚合可以感知到参与聚合的模块有哪些
父模块无法感知哪些子模块继承了自己
我们现在已经成功的解决了 父模块 与 子模块 之间的版本信息冲突的操作, 现在还存在着一种就是 父模块内部之间的版本依赖问题
,比如说:“我们父工程内部使用mybatis与spring的时候要使用统一的版本号管理操作”
- 定义格式:
<properties>
<maven.compiler.source>8maven.compiler.source>
<maven.compiler.target>8maven.compiler.target>
<spring.version>5.1.9spring.version>
properties>
使用格式
<version>${spring.version}version>
${basedir}
${version}
${settings.localRepository}
${user.home}
mvn help:system
${env.JAVA_HOME}
mvn help:system
也就是说: 我们需要通过 Maven 来配置 比如数据库 驱动器、密码、账户等其他类似的数据。
- 定义格式:
<properties>
<jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_dbjdbc.url>
properties>
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/resourcesdirectory>
<filtering>truefiltering>
resource>
resources>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resourcesdirectory>
<filtering>truefiltering>
testResource>
testResources>
<build/>
- 调用格式
${jdbc.url}
<profiles>
<profile>
<id>pro_envid>
<properties>
<jdbc.url>jdbc:mysql://127.454545.1.1:3306/ssm_dbjdbc.url>
properties>
profile>
<profile>
<id>pro_depid>
<properties>
<jdbc.url>jdbc:mysql://127.1.8888.1:3306/ssm_dbjdbc.url>
properties>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
profile>
profiles>
mvn 指令 -P 环境定义id
例如:
mvn install –P pro_env
mvn 具体指令 -D skipTests
eg: mvn install -D skipTest
单机 test 之后,我们点击闪电的图标就会发现会有一个画线的操作
<build>
<piugins>
<plugin>
<artifactId>maven-surefire-pluginartifactId>
<version>2.22.1version>
<configuration>
<skipTests>trueskipTests>
<includes>
<include>**/User*Test.javainclude>
includes>
<excludes>
<exclude>**/User*TestCase.javaexclude>
excludes>
configuration>
plugin>
<piugins/>
<build>
1. 服务器通过命令行进行启动的操作
nexus /run nexus
访问Nexus的服务器: http://localhost:8081/
修改基础配置信息
修改服务器运行配置信息
- 登入我们的账号
- 仓库的分类图标
- 创建主机仓库
- 将我们创建的主机仓库放入 仓库组中
- 给指定的仓库添加文件
进行上传我们的组件的信息
寻找上传的jar包和自定义我们的三件套
- 做好两个仓库,其中一个是开发版,另一个是稳定版。
- 在Maven的核心配置文件中添加访问的账户和密码 ⭐
<servers>
<server>
<id>heima-releaseid>
<username>adminusername>
<password>xxxpassword>
server>
<server>
<id>heima-snapshotid>
<username>adminusername>
<password>xxxpassword>
server>
servers>
- 配置本地仓库镜像 ⭐
<id>nexus-heimaid>
<mirrorOf>*mirrorOf>
<url>http://localhost:8081/repository/maven-public/url>
mirror>
<distributionManagement>
<repository>
<id>heima-releaseid>
<url>http://localhost:8081/repository/heima-release/url>
repository>
<snapshotRepository>
<id>heima-snapshotsid>
<url>http://localhost:8081/repository/heima-snapshots/url>
snapshotRepository>
distributionManagement>
mvn deploy