一、maven前言
1、maven定义
maven 是apache组织的开源的项目构建工具
struts2 框架 controller
tomcat 应用服务器
项目构建:是指代码 编辑 编译 测试 打包(jar,war)部署、 上线 、维护等一系列流程 称之为项目构建
2、为什么是maven
a.摆脱现有ide的规范
b.maven项目支持远程部署 同时支持远程热部署
c.maven帮助我们完成持续集成(CI) 重要角色 jenking(免费开源)|hudson(收费 Oracle) 可以形成构建计划定时触发
d.自动构建项目中的依赖,节省本地磁盘空间占用。 默认本地仓库位: c:/user/Hiapad/.m2/repository
3、maven的约定(规范)(目录结构)
二、maven的第一个环境搭建
2.1 官网下载地址:
https://maven.apache.org/download.cgi
2.2实例3.5.3版本
a、解压
b、maven工具中目录结构
bin 存放maven启动执行脚本文件 .ba
boot 用来在启动maven的引导文件
conf 用来存放,maven核心配置文件 在这个目录中存在settings.xml 这个文件是核心配置文件
lib maven运行时的依赖jar文件
2.3 配置maven环境变量
1、找到系统环境变量配置 添加一个名字为 “MAVEN_HOME”
MAVEN_HOME = D:\Maven\apache-maven-3.6.1-bin\apache-maven-3.6.1
2、将系统PATH变量添加MAVEN环境
PATH = xxxx;%MAVEN_HOME%/bin
2.4检测maven环境
a、在cmd中执行 mvn -version 检测是否成功
2.5 构建得如下信息
![在这里插入图片描述](https://img-blog.csdnimg.cn/80fb8e76be2d4e4aa3d1c776997e4c83.png#pic_center)
三、手动搭建一个项目
3.1、maven项目的目录结构介绍
对于maven目录的基本结构说明
Hello:工程名
|—src
|—|—main:存放主程序
|—|—|—java:存放java源文件
|—|—|—resources:存放框架的配置文件或者其他工具的配置文件
|—|—test:存放测试程序
|—|—|—java:存放测试的java源文件
|—|—|—resources:存放测试的配置文件等
|—pom.xml:maven的主配置文件
3.2、创建一个文件夹作为项目的根目录
在根目录中创建一个pom.xml文件,内容如下:
<?xml version="1.0" ?>
<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>
<!--maven中grouid和artifactId用来唯一确定一个项目的位置-->
<groupId>com.njwb.maven</groupId>
<!--项目名-->
<artifactId>Hello</artifactId>
<!--版本号-->
<version>1.0</version>
<name>Hello</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>`
Ps:标签定义解释
根目录下的第一个子元素 Modelversion指定当前Pom模型的版本,对于Maven3来说,它只能是4.0.0,指定前 Maven模型的版本号,对于Maven2和Maven3来说,它只能是4.0.0
groupId定义了项目属于哪个组,这个组往往和项目所在的组织和公司存在关联。比如:com.xXXX
artifactId 定义了当前Maven项目在组中唯一的ID。
versionk.x.x-里程碑
比如:1.0.0-SNAPSHOT
第一个x大版本有重大变革
第二个X小版本修复bug,增加功能
第三个x更新
里程碑版本:
SNAPSHOT(快照,开发版)
alpha(内部测试)
beta(公开测试)
Release [ RC(发布版)
GA(正常版本)
使用name标签声明一个对于用户更为友好的项目名称。虽然不是必须的,但还是推荐为每个Pom声明name,以方便信息交流
3.2.1.编辑主函数
package com.njwb.demo;
public class Hello{
public void sayHello(){
System.out.println("sayHello invoked....");
}
}
3.2.2cmd下编译并运行
cmd下面、进入项目的根目录
- 编译Java文件
mvn compile - 执行main方法
mvn exec:java -Dexec.mainClass=“com.njwb.demo.Hello”
注:第一次下载会比较慢,要修改maven解压之后的conf目录下的settings.xml.
1.1.修改默认仓库位置
打开maven目录->conf -> settings.xm1添加仓库位置配置
<localRepositoryF :/m2/ repository</1ocalRepository>注:仓库位置改为自己本机的指定目录,“”/"不要写反
1.2.页换阿里镜像,加快依赖下载
<mirror>
<id>nexus-a1iyun</id>
<mirrorof>centra1</mirrorof>
<name>Nexus aliyun</name>
<ur1>http:/ /maven.aliyun.com/nexus/content/groups/public</ur1>
</mirror>
如果编译不成功。可能出现的问题
1,不是使用管理员权限执行dos命令
2.DK环境配置有问题,重装DK
3.代码编写时,类里面没设置包名(如果编译时类没加包名,执行时也不需要加包名)
四、maven的相关配置
maven的所有配置都是在conf/settings.xml中配置 ,别放错了位置。
4.1、本地仓库配置
设置本地仓库。[所有的插件以及jar包、其他相关文件都会到此目录]
默认从中央仓库中下载,为了缓解中央仓库的压力。镜像站的概念。
https://repo.maven.apache.org/maven2/ :中央仓库
一般使用阿里镜像站
先从本地仓库–>找镜像站–>中央仓库。
两个网址:
官网:https://maven.apache.org/
仓库地址:https://mvnrepository.com/
4.2、配置镜像站
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
4.3、 配置jdk
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
4.4、常见命令
【1】mvn clean:清理项目生产的临时文件,一般是模块下的target目录
【2】mvn compile:编译源代码,一般编译模块下的src/main/java目录
【3】mvn test-compile:编译测试程序
【4】mvn test:执行测试,或执行src/test/java/下junit的测试用例
【5】mvn package:项目打包工具,会在模块下的target目录生产jar或war等文件
【6】mvn install:将打包的jar或war文件复制到你的本地仓库中供其他模块使用
【7】mvn site:生成站点 【了解即可,前面六个必须掌握】(生成项目相关信息的网站)
【8】mvn -version:显示版本信息
【9】mvn deploy:将打包的文件发布到远程参数,提供其他人员进行下载依赖
【10】mvn eclipse:eclipse:将项目转化为Eclipse项目
【11】mvn dependency:tree:打印出项目的整个依赖树
【12】mvn archetype:generate:创建Maven的普通Java项目
【13】mvn tomcat7:run:在tomcat容器中运行web应用
【14】mvn jetty:run:调用jetty插件的Run目标在Jetty Serclet容器中启动web应用
执行mvn site命令会报错,必须要配置一个插件。
注意、运mavend令的时候,首先需要定位到maven项目的目录,也就是项目的pom .xm1文件所在的目录。否则,必以汤讨参数来指定项目的目录.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>2.7</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.3</version>
<configuration>
<locales>zh_CN</locales>
</configuration>
</plugin>
</plugins>
</build>
4.4.1 命令参数
上面列举的只是比较通用的命令,其实很多命令都可以携带参数以执行更精准的任务,
4.4.1.1.-D传入属性参数
例如:
mvn package -omaven.test.skip=true
以-o开头,将maven.test.skip的值设为tue ,就是告诉maven打包的时候跳过单元测试。同理,mvndeploy-Dmaven.test.skip=true代表部署项目并跳过单元测试。
4.4.1.2.-P使用指定的Profile配置
比如项目开发需要有多个环境,一般为开发,测试,预发,正式4个环境,在pom.xml中的配置如下:
<profiles>
<profile>
<id>dev</id>
<properties>
<envo>dev</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>I
<profile>
<id>qa</id>
<properties>
<env>qa</env>
</properties>
</profile>
<profile>
<id>pre</id>
<properties>
<env>pre</env>
</properties>
</profile>
</profile>
......
<build>
<filters>
<fi1ter>config/S{env}.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filteringt>rue</filtering>
</resource>
</resources>
</build>
.....
profiles定义了各个环境的变量id ,filters 中定义了变量配置文件的地址,其中地址中的环境变量就是上面profile 中定义的值,resources中
是定义哪些目录下的文件会被配置文件中定义的变量替换。
通过maven可以实现按不同环境进行打包部署,例如:
mvn package -pdev -Dmaven.test.skip-true
表示打包本地环境,并跳过单元测试
4.5、maven坐标
1、数学中的坐标
[1]在平面上,使用x,y两个向量可以唯一的定位平面中的任何一个点
[2]在空间中,使用x,y,z三个向量可以唯一的定位空间中的任何一个点
2、maven中的坐标
使用下面三个向量在仓库中唯一定位一个maven工程
[1]groupid:公司或者组织域名倒序+项目名
[2]artifactid:模块名
[3]version:版本
3、maven工程的坐标与仓库中的路径的对应关系
4.6、仓库的分类
①仓库的分类
【1】本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有的maven工程服务
【2】远程仓库
私服:搭建在当前局域网环境下,为当前局域网范围内的所有maven工程服务
中央仓库:架设在互联网上,为全世界所有的maven工程服务(负载比较大)
中央仓库镜像:为了分担中央仓库的流量,提升用户访问速度
②仓库中保存的内容:maven工程
【1】maven自身所需要的插件(执行命令的插件)
【2】第三方框架或者工具的jar包
【3】我们自己开发的maven工程
4.7依赖管理
依赖指当前项目运行所需要的jar,一个项目可以设置多个依赖
格式:
<!--设置当前工程的所有依赖-->
<dependencies>
<!--具体的依赖-->
<dependency>
<!--依赖所属群组id-->
<groupId>junit</groupId>
<!--依赖所属项目id-->
<artifactId>junit</artifactId>
<!--版本号-->
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
4.7.1依赖传递
依赖具有传递性
直接依赖:在当前项目中通过依赖配置建立的依赖关系
间接依赖:被资源的资源如果依赖其他资源,当前项目间接以来其他资源
依赖传递冲突问题
路径优先:当依赖中出现相同资源时,层级越深,优先级越低,层级越浅,优先级越高
声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
特殊优先:当同级配置了相同的不同版本,后配置的覆盖先配置的
可选依赖
可选依赖指对外隐藏当前所依赖的资源-----不透明
<!--设置当前工程的所有依赖-->
<dependencies>
<!--具体的依赖-->
<dependency>
<!--依赖所属群组id-->
<groupId>junit</groupId>
<!--依赖所属项目id-->
<artifactId>junit</artifactId>
<!--版本号-->
<version>4.11</version>
<!--以来选择-->
<optional>true</optional>
<scope>test</scope>
</dependency>
</dependencies>
排除依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<!--排除依赖-->
<exclusions>
<exclusion>
<!--依赖所属群组id-->
<groupId>junit</groupId>
<!--依赖所属项目id-->
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖范围
依赖的jar默认情况可以在任何地方使用,可以通过scope标签设定其作用范围
作用范围
主程序范围有效(main文件夹范围内)
测试程序范围有效(test文件夹范围内)
是否参与打包(package指令范围内)
4.8、生命周期与插件
4.8.1、项目构建生命周期
Maven构建生命周期描述的是一次构建过程经历了多少事件
Maven对项目构建的生命周期划分为3套
clean:清理工作
default:核心工作,例如编译,测试,打包,部署等
site:产生报告,发布站点等
4.8.2、插件
插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
默认maven在各个生命周期上绑定有预设的功能
通过插件可以自定义其他功能
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-pluin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
<phase> generate-test-resources</phase>
</execution>
</executions>
</plugin>
<eloluoins>
</build>
五、IDEA中使用maven
5.1、idea中maven的配置
1、全局设置
2、设置maven【主目录、setting文件、仓库文件】
设置一下全局编码方式:
5.2、通过idea建立一个java项目
方式一:、创建一个maven项目 【不通过骨架生成】
设置坐标:
方式二:通过骨架生成一个maven项目
5.3、构建一个web项目
1、选择骨架
2、这个骨架有一些问题,要做一些修改
添加,java和resource目录
修改web.xml配置文件的头声明
3、添加相关依赖
<!-- servletApi,jspApi,jstl-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- 文件上传的依赖 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
六、Maven高级
6.1分模块开发与设计
6.1.1工程模块与模块划分
ssm_pojo拆分步骤:
1、新建模块
2、拷贝原始项目中对应的相关内容到ssm_pojo模块中
3、实体类(User)
4、 配置文件(无)
ssm_dao拆分
1、新建模块
2、拷贝原始项目中对应的相关内容到ssm_dao模块中
数据层接口(UserDao)
配置文件:保留与数据层相关配置文件(3个)
注意:分页插件在配置中与SqlSessionFactoryBean绑定,需要保留
pom.xml:引入数据层相关坐标即可,删除springmvc相关坐标
spring
mybatis
spring整合mybatismysql
druid
pagehelper
直接依赖ssm_pojo (对ssm_pojo模块执行install指令,将其安装到本地仓库)
ssm_service拆分
1、新建模块
2、拷贝原始项目中对应的相关内容到ssm_service模块中
业务层接口与实现类(UserService、UserServicelmpl)
配置文件:保留与数据层相关配置文件(1个)
pom.xml:引入数据层相关坐标即可,副除springmvc相关坐标
spring
junit
spring整合junit
直接依赖ssm_dao(对ssm_dao模块执行install指令,将其安装到本地仓库)间接依赖ssm_pojo (由ssm_dao模块负责依赖关系的建立)
◆修改service模块spring核心配置文件名,添加模块名称,格式: applicationContext-service.xm
◆修改dao模块spring核心配置文件名,添加模块名称,格式: applicationContext-dao.xml
◆修改单元测试引入的配置文件名称,由单个文件修改为多个文件
ssm_control拆分
1、新建模块(使用webapp模板)
2、拷贝原始项目中对应的相关内容到ssm_controller模块中
表现层控制器类与相关设置类(UserController、异常相关……-)
配置文件:保留与表现层相关配置文件(1个)、服务器相关配置文件(1个)
pom.xml:引入数据层相关坐标即可,删除springmvc相关坐标
spring
springmvc
jackson
servlet
tomcat服务器插件
直接依赖ssm_service (对ssm_service模块执行install指令,将其安装到本地仓库)
间接依赖ssm_dao、ssm_pojo
修改web.xml配置文件中加载spring环境的配置文件名称,使用*通配,加载所有applicationContext-开始的配置文件
6.2、聚合
作用:聚合用于快速构建maven工程,一次性构建多个项目/模块。
6.2.1、多模块构建维护
创建一个项目只留pom.xml文件在此文件管理其他项目
注意事项:参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关
6.3、继承
作用:通过继承可以实现在子工程中沿用父工程中的配置
maven中的继承与java中的继承相似,在子工程中配置继承关系
制作方式:
◆在子工程中声明其父工程坐标与对应的位置
<!--定义该工程的父工程-->
<parent>
<groupId>com.itheima</groupid>
<artifactId>ssm</ artifaotId>
<version>1.0-SNAPSHOT</version>
<!--填写父工程的pom文件-->
<relativePath>../ssm/pom. xml</relativePath>
</parent>
继承依赖定义
在父工程中定义依赖管理
<!--声明此处进行依赖管理-->
<dependencyManagement>
<!--具体的依赖-->
<dependencies>
<!--spring环境-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependenoies>
<dependenayManagement>
继承依赖使用
在子工程中定义依赖关系,无需声明依赖版本,版本参照父工程中依赖的版本
先引用父工程
<!--定义该工程的父工程-->
<parent>
<groupId>com.itheima</groupId>
<artifactId>ssm</artifactid>
<version>1.0-SNAPSHOT</version>
<!--填写父工程的pom文件-->
<relativePath>../ssm/pom.xml</relativePath>
</parent>
<!--子工程的头-->
<modelversion>4.0.0</modelversion>
<artifactId>ssm_pojo</ artifactId>
<packaging>jar</packaging>
<dependencies>
<!--spring环境-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
</dependencies>
继承与聚合
作用
聚合用于快速构建项目
继承用于快速配置
相同点:
聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个pom文件中
聚合与继承均属于设计型模块,并无实际的模块内容
不同点:
聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些
继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己
6.4、属性
<!--定义自定义属性-->
<properties>
<spring-version>5.3.6</spring-version>
</properties>
<!--下面jar包的使用-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
6.5、版本管理
工程版本
SNAPSHOT(快照版本)
◆项目开发过程中,为方便团队成员合作,解决模块间相互依赖和时时更新的问题,开发者对每个模块进行构建的时候,输出的临时性版本叫快照版本(测试阶段版本)
◆快照版本会随着开发的进展不断更新
RELEASE(发布版本)
项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件
是稳定的,即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本
6.6、资源配置
配置文件引用pom属性
●作用
在任意配置文件中加载pom文件中定义的属性
调用格式
${jdbc.url}
开启配置文件加载pom属性
<! ――配置资源文件对应的信息-->
<resources>
<resource>
<!一设定配匿文件对应的位匿目录,支持使用属性动态设定路l-->
<direatory>${project.basedir}/src/main/resources</directory>
<!--开启对配置文件的资源加载过滤-->
<filtering>true</filtering>
</resource>
<resources>
在管理器properties中配置如下:
在build中配置其他模块
6.7、多环境开发配置
6.7.1、多环境兼容
6.7.2、多环境配置
<!--创建多环境-->
<profiles>
<!--定义具体的环境:生产环境-->
<profile>
<!--定义夺境对应的唯一名称-->
<id>pro_env</id>
<!--定义环境中专用的属性值-->
<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.ur1>
</properties>
<!--设置默认启动-->
<aativation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!--定义具体的环境:开发环境-->
<profile>
<id>dev_env</id>
.....
</profile>
</profiles>
也可以设置命令:
加载指定环境
作用
加载指定环境配置
调用格式
mvn 指令 -P 环境定义id
范例:
mvn install -P pro_env
6.8、跳过测试配置
跳过测试的3中方法:
第一种命令:
mvn 指令 -D skipTests
注意事项:
执行的指令生命周期必须包含测试环节
在build中配置
第二种方式
使用界面操作跳过测试:
第三中pom.xml文件中build中配置
<!--配置跳过测试-->
<plugin>
<artifactId>maven-surefire-plugin</artifaatId>
<version>2.22.1</version>
<!―-设置跳过全部测试-->
<configuration>
<!―-设置跳过测试-->
<skipTests>true</skipTests>
</configuration>
<!―-设置指定测试-->
<configuration>
<!―-设置跳过测试包含-->
<includes>
<!―-包含指定的用例-->
<include>**/User*Tesr.java</include>
</includes>
<!―-排除-->
<excludes>
<!―-排除某些测试-->
<exclude></exclude>
</excludes>
</configuration>
</plugin>
6.9、私服
Nexus
Nexus是Sonatype公司的一款maven私服产品
下载地址: https://help.sonatype.com/repomanager3/download
仓库分类
宿主仓库hosted
保存无法从中央仓库获取的资源
自主研发
第三方非开源项目
代理仓库proxy
代理远程仓库,通过nexus访问其他公共仓库,例如中央仓库
仓库组group
将若干个仓库组成一个群组,简化配置
仓库组不能保存资源,属于设计型仓库
访问私服配置(项目工程访问私服)
配置当前项目访问私服上传资源的保存位置(pom.xml)
<distributionManagement>
<repository>
<id>heima-release</id>
<ur1>http://localhost:8081/repository/heima-release/</ur1>
</repository>
<snapshotRepository>
<id>heima-snapshots</id>
<ur1>http://localhost:8081/repository/heima-snapshots/</ur1></snapshotRepository>
</distributionManagement>
发布资源到私服命令
mvn deploy