这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战
Maven是一个项目资源管理工具
Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶(phase)中插件(plugin)目标(goal)的逻辑
Maven优点:
- 简化项目依赖jar包管理,防止冲突
- 便于项目升级,项目依赖jar包升级
- 有助于项目开发,一个模块开发好后,发布到仓库,需要依赖改模块是可以从仓库引入
- maven有很多插件,便于工能扩展
- 便于与持续集成工具(jenkins)整合
Maven解决问题
1.解决项目中jar包需要手动导入,一旦jar包资源过多,容易造成遗漏
2.解决项目导包,比较麻烦
Maven的专业术语
中央仓库(Central Repository),
官方维护, 存放所有相关的jar包(包含各个版本)
本地仓库(Local Repository),
maven项目都是从本地仓库加载jar包的
镜像仓库(Mirror Repository),
国内有能力的组织(机构)搭建的仓库, 这个仓库就是将中央仓库中的所有内容复制了一份存起来.
jar包定位:坐标,三部分构成
- GroupId 一般是公司逆向域名
- Artifactld 项目名
- Version 版本号
Maven安装配置
- 将maven的压缩包解压到指定的文件夹中
- 配置maven的本地仓库地址
- 在idea中继承maven
Maven setting.xml文件配置
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- 本地仓库 -->
<localRepository>E:/Repository</localRepository>
<mirrors>
<!-- 配置镜像仓库地址 -->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<profiles>
<!-- 配置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>
</profiles>
</settings>
Maven项目类型
类型 | 对应项目 | 描述 |
---|---|---|
jar | java工程 | 目最终被打包为jar包 |
war | wen工程 | 项目被打包为war包 |
pom | 逻辑工程 | 父工程必须是pom类型的工厂,pom工程中不写java代码,管理子工程 |
项目结构
- projectname -------------- 项目名
- src
- java -------------- 存放项目核心代码
- resource ---------- 存放项目配置文件
- test
- java ---------------- 存放测试代码
- pom.xml ---------------- 引入jar包,maven项目配置
- src
scope作用域
指依赖的jar包作用范围
compile:不写默是compile,指Maven项目依赖的jar包,在编译、测试、运行有效,由于运行时需,依赖会被打包
示例
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
provided:Maven项目依赖的jar包,只在编译和测试时需要,在运行时不需要
比如:servlet api/jsp-api 被 tomcat 容器提供。
示例
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
runtime:Maven项目依赖的jar包,只在运行和测试时需要,在编译时不需要
比如:jdbc 的驱动包。由于运行时需要所以 runtime 范围的依赖会被打包。
test:指依赖的jar包,在编译和运行时都不需要,只在测试编译和测试运行阶段可用
比如:junit。由于运行时不需要所以 test范围依赖不会被打包
实例
<!--junit 单元测试依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit-version}</version>
<scope>test</scope>
</dependency>
system:依赖于provided类似,但必须指定jar文件路径,指定systemPath磁盘路径,不推荐使用
Maven 指令
clean
清除maven项目下的target目录中的class和本地仓库中已打包的文件
validate
验证工程是否正确,所有需要的资源是否可用
compile
即编译项目中的java文件,并存放在项目的编译目录
test
即运行项目中的测试用例文件,如果测试用例未通过,也会打包失败,这里test过程可以在pom中通过配置跳过。
package
将本地编译好的文件打包为war 或者jar
verify
运行任何检查,验证包是否有效且达到质量标准
install
将打包的代码存放到本地maven仓库,可供本地其它项目依赖使用
site
生成项目报告,站点,发布站点
deploy
将打包在本地仓库中的项目发布到服务器,供他人依赖使用
常用Maven指令
clean
package
install
test
Maven 指令生命周期
Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
Site Lifecycle 生成项目报告,站点,发布站点。
Maven项目之间关系
Maven项目依赖关系
什么是Maven项目依赖关系?
依赖关系指一个项目依赖另一个项目资源,指项目之间的调用
项目A中会使用项目B中的资源,我们会将项目B的包导入到项目A中使用那么项目A和项目B之间就是依赖关系。项目A依赖项目B
Maven项目依赖关系的使用
① 创建项目A完成功能开发
② 在项目A的pom文件中配置项目B或者其他第三方资源的资源坐标
③ 在项目A中正常调用项目B的资源即可。
依赖原则
依赖jar包有相同情况,路径不同间接依赖中maven采用的是路径最短者优先
路径相同间接依赖中maven 采用的是依赖定义顺序从上到下
依赖关系实现
<dependency>
<groupId>com.test</groupId>
<artifactId>05maven_gx_yla</artifactId>
<version>1.0-SNAPSHOT</version>
<!--
排除依赖关系中依赖的jar包
排除maven_gx_yla项目中的jar
-->
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
Maven项目继承关系
什么是Maven项目继承关系?
子项目可以直接调用父项目资源,父项目必须是pom类型,
子项目通过父项目pom.xml获得资源,指的是pom资源继承,不是项目功能代码继承
Maven项目继承关系使用
① 创建两个maven项目,项目parent和项目child,项目paren是pom类型,没有代码
② 建立两个项目之间的继承关系
在子项目中的pom.xml文件中使用parent标签,并声明父项目的资源坐标即可
③ 观察在父项目中配置资源,在子项目中是否会自动加载相关资源
注意:
(1) maven项目的继承关系中的父项目要创建为pom类型
(2) 继承关系中的maven项目是相互独立的,本质就是两个项目
继承关系实现
<!--继承父项目-->
<parent>
<groupId>com.test</groupId>
<artifactId>06maven_gx_jcpom</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!--调用父项目资源-->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
Maven项目聚合关系
什么是Maven项目聚合关系?
快速构建,将一个Maven项目,划分为多个子项目。前提是子项目必须继承父项目
Maven项目聚合关系使用
① 创建一个maven pom类型项目
② 在pom项目下创建多个 module
Maven项目聚合关系实现
父项目
<groupId>com.test</groupId>
<artifactId>07maven_gx_jh</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>jh_pojo</module>
<module>jh_util</module>
</modules>
<packaging>pom</packaging>
子项目
<parent>
<artifactId>07maven_gx_jh</artifactId>
<groupId>com.test</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jh_pojo</artifactId>
继承和聚合之间区别
继承目的是减少重复配置,是一种单向的,子项目继承父项目配置,父项目不能访问子项目
聚合目的是快速构建项目,一个项目拆分成多个项目,是一种双向的,前提必须是继承。子项目继承父项目,父项目可以访问子项目
部署
什么是部署?
将项目部署到服务器,在服务器运行
手动部署
① 使用maven将项目整体打包到本地仓库中
② 在idea中找到war类型的web项目将其target文件夹下的war包上传到其他的tomcat中,然后启 动其他的tomcat
③ 在本地的浏览器中访问另一个中的web项目
注意:访问项目的虚拟项目的名字为tomcat下的war包解压后的文件夹的名字
远程热部署
什么是远程热部署?
远程上传项目部署到服务器
实现步骤
-
tomcat tomcat-user.xml文件 配置登录账号
<role rolename="manager-gui"/> <role rolename="manager-script "/> <role rolename="manager-jmx"/> <role rolename="manager-status"/> <user username="admin" password="admin" roles="manager-gui,manager-script,manager-jmx,manager-status"/>
-
启动tomcat服务器
-
在maven项目中配置pom.xml文件,tomcat7-maven-plugin 插件远程上传
<!--引入tomcat服务器插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!--远程发布地址-->
<url>http://192.168.1.75:8080/manager/text</url>
<username>admin</username>
<password>admin</password>
<!--发布到远程服务器端名称-->
<path>/flower</path>
<!--设置自动更新-->
<update>true</update>
</configuration>
</plugin>
-
tomcat7-maven-plugin 插件使用deploy名,远程部署
-
访问tomcat服务器中部署好的项目
pom.xml文件配置
引入jar包
<dependencies>
<!--引入jar包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
定义依赖jar包版本号
<!--定义依赖jar包版本号 方便查看 修改-->
<properties>
<mysql-version>8.0.17</mysql-version>
</properties>
<dependencies>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-version}</version>
</dependency>
</dependencies>
排除依赖jar包中的依赖
<dependency>
<groupId>com.test</groupId>
<artifactId>05maven_gx_yla</artifactId>
<version>1.0-SNAPSHOT</version>
<!--
排除依赖关系中依赖的jar包
排除maven_gx_yla项目中的jar
-->
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖管理
<!--依赖管理 让子项目选择性继承-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
</dependencies>
</dependencyManagement>
继承父项目
<dependency>
<groupId>com.test</groupId>
<artifactId>05maven_gx_yla</artifactId>
<version>1.0-SNAPSHOT</version>
<!--
排除依赖关系中依赖的jar包
排除maven_gx_yla项目中的jar
-->
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
调用父项目资源
<!--调用父项目资源-->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
Maven项目资源拷贝插件
<build>
<!--
资源拷贝插件
将项目源码中的xml文件也进行编译,并放到classes编译目录中
-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
引入tomcat插件并远程热部署
<build>
<plugins>
<!--引入tomcat服务器插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!--远程发布地址-->
<url>http://192.168.1.75:8080/manager/text</url>
<username>admin</username>
<password>admin</password>
<!--发布到远程服务器端名称-->
<path>/flower</path>
<!--设置自动更新-->
<update>true</update>
</configuration>
</plugin>
</plugins>
</build>
引入tomcat插件部署不使用远程热部署
<!--引入tomcat服务器插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!--配置tomcat启动的端口号-->
<port>8080</port>
<!--配置项目的访问名称 上下文路径-->
<path>/flower</path>
</configuration>
</plugin>