文章目录
maven是什么
- 本质是一种项目管理工具,将开发者和管理过程抽象成一个对象模型(POM)
- POM :项目对象模型
Maven作用
- 项目构建:提供标准跨平台的自动化构建项目
- 依赖管理:方便快捷的管理项目依赖的jar包,避免资源间版本的冲突问题
- 统一开发结构:提供标准的统一的项目结构
Maven基础概念
仓库
- 存储资源和jar包
- 中央仓库存储着99%的资源,当你需要什么时本地仓库从远端中央仓库下载到本地仓库
- 私服 :
1. 大部分是公司内局域网之内访问,减少资源占用,访问速度快
2. 具有版权的资源,包含自主研发的jar
3. 仅对范围内共享,不对外开放
坐标
- Maven中描述仓库中资源的位置 http://mvnrepository.com/
- Maven坐标主要组成
- groupId:定义当前Maven项目隶属于组织的名称(通常是域名反写)
- artifactId:定义当前Maven项目名称
- version:定义当前项目版本号
- packaging:定义该项目的打包方式
本地仓库配置
- conf文件夹下面的setting文件
- 镜像下载地址
- 可以拥有自己的setting文件
手动构建自己的maven项目
- maven构建命令使用mvn开头,后面添加功能参数,可以一次执行多个命令,使用空格分隔
IDEA构建工程的几种方式
IDEA自动创建java项目
Maven模板帮助创建
文件缺损如何解决
- 第一种:可以创建文件夹后添加标记
- 第二种:直接在项目目录下进行添加
pom文件解读
<?xml version="1.0" encoding="UTF-8"?>
<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>
<!-- 打包方式-->
<packaging>war</packaging>
<!-- 组织id-->
<name>web01</name>
<!-- -->
<groupId>com.ssc</groupId>
<!-- 项目名字-->
<artifactId>web01</artifactId>
<!-- 版本号-->
<version>1.0-SNAPSHOT</version>
<!--依赖-->
<dependencies>
<!--具体依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<!--设置插件-->
<plugins>
<!--具体插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
依赖
依赖配置
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
依赖传递
- 直接依赖:当前项目通过以来配置建立连接关系的依赖
- 被资源的资源如果依赖其他资源,当前项目间接依赖其他资源
- 出现冲突:
1. 路径优先:出现相同资源时,层级越深,优先级越低
2. 申明优先:当资源在同层级依赖时,配置顺序考前的覆盖配置顺序靠后的
3. 特殊优先:同级配置了相同资源的不同版本,后配置的覆盖先配置的
可选依赖
- 被引入控制不被别人看到
<!--可选依赖 引入他时看不到这个-->
<optional>true</optional>
排除依赖
- 引入者主动排除在外
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
依赖范围
- 依赖jar默认情况下可以在任何地方使用,可以通过scope标签配置
- 作用范围:
- 主程序范围有效(main文件夹范围内)
- 测试程序范围有效(test文件夹范围内)
- 是否参与打包(package指令范围内)
<scope>test</scope>
依赖范围传递
- 带有依赖范围的资源在进行传递时,作用范围将受到影响
生命周期与插件
项目构建生命周期
- Maven构建生命周期描述的是一次构建过程中经历了多少阶段
clean生命周期
- pre-clean 执行一些需要在clean之前完成的工作
- clean 移除所有上一次构建生成的文件
- post-clean 执行一些需要在clean之后完成的工作
default构建生命周期
插件
- 插件与生命周期内的阶段进行绑定,在执行到对应生命周期时执行对应的插件
- 默认maven在各个生命周期上绑定有预设的功能
- 通过插件可以自定义其他功能
- 结合上面的图片
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<goals>
<!-- 对源码打包 -->
<!-- 如果是test-jar对测试源码进行打包-->
<!-- 可以同时写两个-->
<goal>jar</goal>
<goal>test-jar</goal>
</goals>
<!-- 对应的生命周期阶段执行-->
<phase>generate-test-resources</phase>
</execution>
</executions>
</plugin>
</plugins>
Maven高级
分模块开发与设计(重点)
- 分模块的时候如果需要其他模块的数据时,只需要在pom文件中导入相关的坐标
- 在导入之后本地仓库内还没有相关的jar,所以需要在被引入的模块下面执行install
- 有一个小问题就是如果在导入坐标执行compile之后出现Failed to collect dependencies at com.itheima:ssm_pojo:jar:1.0-SNAPSHOT: Failed to read artifact descriptor for com.itheima:ssm_pojo:jar:1.0-SNAPSHOT: Could not find artifact com.itheima:springmvc_ssm:pom:1.0-SNAPSHOT那就要注意了,执行子模块的install之前需要先在父模块下面执行clean和install命令
- 保留下所有该模块的配置文件
- 仅保留自己模块需要的功能类和配置文件
- spring核心配置根据功能不同进行独立制作
- 当前模块所依赖的模块通过坐标的形式加入当前的模块才可以使用
- web.xml需要加载所有的spring核心配置文件
聚合(重点)
- 新建一个module 只需要pom文件,在pom.xml中管理这几个模块
- 顺序无论如何书写编译时都是一个顺序(依赖顺序和书写顺序无关)
- package标签什么都不写默认就是jar包,聚合的时候标签内写成pom就可以了
<!--定义该工程进行构建管理-->
<packaging>pom</packaging>
<!--管理工程列表-->
<modules>
<module>../../BaiduNetdiskDownload/黑马教程资料/第3阶段—Java开发框架/资料-Maven/day02资料/代码/项目拆分/springmvc_ssm/ssc_controller</module>
<module>../../BaiduNetdiskDownload/黑马教程资料/第3阶段—Java开发框架/资料-Maven/day02资料/代码/项目拆分/springmvc_ssm/ssm_dao</module>
<module>../../BaiduNetdiskDownload/黑马教程资料/第3阶段—Java开发框架/资料-Maven/day02资料/代码/项目拆分/springmvc_ssm/ssm_pojo</module>
<module>../../BaiduNetdiskDownload/黑马教程资料/第3阶段—Java开发框架/资料-Maven/day02资料/代码/项目拆分/springmvc_ssm/ssc_service</module>
</modules>
继承(重点)
- 继承需要在聚合模块中的依赖标签中加入一个dependenciesManagement标签
- 声明所有依赖并添加版本,子模块可以直接引入依赖不引入版本
- 插件plugins也是在外层包裹一层pluginsManagement
<dependencyManagement>
<dependencies>
...
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<!--设置插件-->
<plugins>
<!--具体的插件配置-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
- 所有子模块需要定义它的父模块
<parent>
<artifactId>springmvc_ssm</artifactId>
<groupId>com.itheima</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
可继承的属性
继承与聚合作用,相同点,不同点
作用
相同点
不同点
属性(重点)
- 在pom.xml中插入properties标签里面定义自己的属性
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.1.9.RELEASE</spring.version>
</properties>
- 内置属性
${basedir}
${version}
- Setting属性: 获取Maven配置文件setting.xml中的标签属性,用于动态配置
${settings.localRepository}
-
java系统属性
-
系统属性查询方式
mvn help:system
${user.home}
版本管理
- SNAPSHOT 快照版本
- RELESE 发布版本
版本号约定
资源配置
- 抽取文件
<properties>
抽取jdbc.url
<jdbc.url>jdbc:mysql://localhost:3306/test</jdbc.url>
</properties>
<build>
配置资源文件对应的信息 使用了通配符
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
配置测试资源文件对应得信息
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
</build>
多环境开发配置
- 父模块的pom.xml
<profiles>
<!-- 定义生产环境-->
<profile>
<id>pro_env</id>
<properties>
<jdbc.url>jdbc:mysql://localhost:3307/test</jdbc.url>
</properties>
<!-- 设置默认启动-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>dev_env</id>
<properties>
<jdbc.url>jdbc:mysql://localhost:3308/test</jdbc.url>
</properties>
</profile>
</profiles>
- maven命令加载指定环境
mvn 指令 -P 环境定义id
范例: mvn install -P pro_env
跳过测试 (了解)
第一种IDEA右侧直接点击设置
右侧Maven工具
使用配置跳过测试
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<skipTests>true</skipTests><!-- -->
<includes> <!-- -->
<include>**/User*Test.java</include>
</includes>
<excludes><!-- -->
<exclude>**/User*TestCase.java</exclude>
</excludes>
</configuration>
</plugin>