一 maven的作用
1.maven可以管理jar包
2.自动下载jar和它的文档,源代码
3.管理jar的直接依赖,a.jar需要b.jar,maven会自动下载b.jar
4.管理需要的jar版本
5.帮助编译程序,把java编译为class
6.帮助测试代码是否正确
7.帮助打包文件形成jar文件或war文件
8.帮助部署项目
二 项目的构建
构建是面向过程的,就是一些步骤,完成项目代码的编译,测试,运行,打包,部署等等。
maven支持的构建包括有:
1. 清理:把之前项目编译的内容删除掉,为新的编译代码做好准备。
mvn clean
2. 编译:把程序源代码编译为执行代码,java——class文件
批量的,maven可以同时编译成百上千的文件。
mvn compile
编译成功会在src同目录下生成target,里面的classes保存着字节码文件
-
测试:maven可以执行测试程序代码,验证你的功能是否正确。
批量的,maven可以同时执行多个测试代码。
mvn test -
报告:生成测试结果的文件,测试通过的话就没有。
-
打包:把项目中所有class文件,配置文件等都放到一个压缩文件中。
这个压缩文件就是项目的结果文件,对于java文件,就是jar扩展名的。
对于web应用,压缩文件扩展名是.war
mvn package -
安装:把5中生成的文件jar,war安装到本机仓库。
mvn install -
部署:把程序安装好可以执行。
mvn deploy
三 maven核心概念
1.POM:项目对象模型(project object model),maven把项目当作模型使用。
控制maven构建项目的过程,管理jar依赖
2.约定的目录结构:maven项目的目录和文件的位置都是规定的。
Hello
|---src
|---|---main //放置主程序
|---|---|---java //程序包和包中的java文件
|---|---|---resources //java程序中要使用的配置文件
|---|---test //放测试程序代码
|---|---|---java //测试程序包和包中的java文件
|---|---|---resources //测试java程序中要使用的配置文件
|---pom.xml
3.坐标:是一个唯一的字符串,用来表示资源的。
4.依赖管理:管理项目可以使用jar文件
5.仓库管理:资源存放的位置。
https://repo.maven.apache.org 中央仓库地址,全世界公用
C:\Users\Adminstrator.m2\repository 资源下载后默认存储位置,本地默认仓库
设置本机存放资源的目录位置
1.修改maven配置文件
maven安装目录/conf/setting.xml
2.修改指定你的目录(不要使用中文目录)
6.生命周期:maven构建项目的过程。
7.插件和目标:执行maven构建的时候用的工具就是插件。
8.继承:
9.聚合:
四 maven仓库
1. https://repo.maven.apache.org 中央仓库地址,全世界公用
C:\Users\Adminstrator\.m2\repository 资源下载后默认存储位置,本地默认仓库
设置本机存放资源的目录位置
1.修改maven配置文件
maven安装目录/conf/setting.xml
2.修改<localRepository>指定你的目录(不要使用中文目录)
2. 仓库分类
本地仓库:本机仓库
远程仓库: 1)中央仓库
2)中央仓库的镜像
3)私服,公司内部,在局域网内
3.仓库使用
开发人员使用某个驱动--->maven首先查看本地仓库--->私服--->镜像--->中央仓库
五 POM项目对象模型
1.是一个pom.xml文件
2.坐标:唯一值,在互联网中唯一识别一个项目的
下面三个加一块叫坐标
<groupId>公司域名的倒写</groupId> //com.baidu
<artifactId>自定义项目名称</artifactId>
<version>自定版本号</version> //如果是不稳定版本,在版本后带-SNAPSHOT(快照),
//version使用三位数标识,例如1.1.0
3.packaging:项目打包类型
4.dependencies和dependency依赖
<dependencies>
<dependency>
<groupId>公司域名的倒写</groupId> //com.baidu
<artifactId>自定义项目名称</artifactId>
<version>自定版本号</version>
</dependency>
</dependencies>
5.properties用来定义一些配置属性
6.build:maven在进行项目构建时,配置信息,例如指定编译java代码使用的jdk版本
7.parent继承
8.modules:在maven的多模块开发中,为了统一构建整个项目的所有模块。可以提供一个额外的模块,该模块的打包方式为pom
并且在其中使用modules聚合的其他模块,这样通过本模块就可以一键自动识别模块间的依赖关系来构建所有的模块
六 maven生命周期
mvn clean
mvn compile
mvn test-compile
mvn test
mvn package
mvn install
mvn deploy
1.单元测试:用的时junit,专门用来测试的框架
junit测试内容:测试的是类中的方法,每一个方法都是独立测试的。
方法是测试的基本单位
maven借助单元测试,批量的测试类中的方法
2.使用步骤
1.加入依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
2.在maven项目中的src/test/java目录下,创建测试程序
1.测试类的名称为“Test+要测试的类名”
2.测试方法名为“Test+要测试的方法名”
例如测试HelloMaven
创建测试类TestHelloMaven
@Test
public void testAdd(){
测试HelloMaven的add方法是否正确
}
1.测试方法是public的
2.测试方法没有返回值
3.方法上加上@Test
七 依赖范围
1.依赖范围用scope表示,scope的值有compile,tes
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope> //范围是src->test
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope> 提供者,打包时不会将此打包进去,因为已经有别的提供了。
</dependency>
| compile | test | provided
对主程序是否有效 | 是 | 否 | 是
对测试程序是否有效| 是 | 是 | 是
是否参与打包 | 是 | 否 | 否
是否参与部署 | 是 | 否 | 否
八 属性设置
1.maven属性设置
<properties>设置maven的常用属性
<properties>
<!--maven构建项目使用编码,避免中文乱码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--编译代码使用的jdk版本 -->
<maven.compiler.source>1.8</maven.compiler.source>
<!--运行程序使用的jdk版本 -->
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
2.maven全局变量
自定义属性,1.在<properties>通过自定义标签声明变量(标签名就是变量名)
2.在pom.xml文件中的其他位置,使用${标签名}来使用变量的值
自定义全局变量一般是定义依赖的版本号,当你的项目中要使用多个相同的版本号。
先使用全局比那辆定义,再使用${变量名}
<!-- 定义全局变量 -->
<properties>
<spring.version>5.2.0<spring.version>
</properties>
<!--使用全局变量 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
3.资源插件
<build>
<resources>
<resource>
<directory>src/main/java</directory> <!-- 所在的目录文件-->
<includes>
<include>**/*.properties</include> <!-- 包括目录下的。properties,.xml文件都会扫描到-->
<include>**/*.xml</include>
</includes>
<filtering>false</filtering> <!--false表示不启动过滤器,*.property已经起到过滤器的作用了-->
</resource>
</resources>
</build>
默认没有使用resources时,maven执行编译代码时,会把src/main/resources目录中的文件拷贝到target/classes目录中
对于src/main/java目录下的文件则不处理。
但我们执行java文件需要用到java目录下的文件时,就需要告诉maven在mvn compile src/main/java目录下文件时,
需要把文件一同拷贝到target/classes目录中。
此时就需要在<build>中加入<resources>
五 Maven多模块管理
commonModel:提供公共的基础服务,比如工具类,常量类等等
bussinessModel:业务模块,是系统真正要实现的业务,依赖于common模块,比如订单管理,财务统计,会员管理等。
application:可发布的web应用,由各个businessModel组曾
第三方模块:包括各类框架,spring,mybatis,日志等。整个应用都是依赖他们完成开发的。
application依赖于businessModel,businessModel依赖于commonModel,businessModel和commonModel都依赖于第三方模块
父工程
<groupId>com.bjpowernode.maven</groupId>
<artifactId>001-maven-parent</artifactId>
<packaging>pom</packaging>
<version>1.0.0</version>
<!--
maven父工程必须遵行以下两点
1.packaging内标签必须设置成pom,pom project object model项目对象模型
2.删除src目录
关于packaging,如果没有这个标签,默认打包成jar
maven多模块管理 其实就是让他的子模块的pom文件来继承父工程的pom文件
-->
子工程
<!--普通的java工程-->
<parent>
<artifactId>001-maven-parent</artifactId>
<groupId>com.bjpowernode.maven</groupId>
<version>1.0.0</version>
<relativePath>../001-maven-parent/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>002-maven-java</artifactId> <!--子工程的名字-->
<!--maven中的web工程-->
<parent>
<artifactId>001-maven-parent</artifactId>
<groupId>com.bjpowernode.maven</groupId>
<version>1.0.0</version>
<relativePath>../001-maven-parent/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>003-maven-webapp</artifactId>
<packaging>war</packaging>
子工程也可以有自己的子工程
<parent>
<artifactId>002-mavven-java</artifactId>
<groupId>com.bjpowernode.maven</groupId>
<version>1.0.0</version>
<relativePath>../002-maven-java/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>004-maven-java-2</artifactId>
父工程中写好了依赖,子工程就无需指定依赖,或者说,只需要指定自己单独需要的依赖。
父工程添加的依赖,所有子模块都会无条件继承
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.23</version>
</dependency>
</dependencies>
<!--
如果不希望子工程啥都继承,可以使用依赖管理dependencyManagement
此时,子工程就必须向父工程提出申请,才能继承相应依赖
-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.23</version>
</dependency>
</dependencies>
</dependencyManagement>
<!--子工程在依赖管理情况下,提出申请,只需要写groupid和artifactid,不需要写version,因为version在父工程中已经写好了,说白了,父工程其实就在管理依赖版本号。使所有的子工程的依赖版本号能够统一
于是,可以将把版本号抽出来单独管理
-->
<properties>
<mysql-connection-java>8.0.19</mysql-connection-java>
<junit-version>4.10</junit-version>
</properties>
<!--子模块也会无条件继承父工程的插件-->