1.Maven简介
Maven 是 Apache 软件基金会组织维护的一款自动化构建工具, 专注服务于 Java 平台的项目构建和依赖管理
Maven作用:
● 依赖管理
● 项目构建
1.1依赖管理
通过一个项目依赖junit的实验来介绍依赖管理
1.不用Maven进行依赖管理
若不增加junit测试类库,则运行test1、2方法需要在main方法中调用,调用代码new Main().test2();
,这样,运行哪个方法就要到main方法中更改一下方法名,非常不友好;若增加junit测试类库,则不需要在main方法中调用,junit会给一个@Test帮忙运行测试方法
(1)创建java project
(2)增加junit测试类库
(3)依赖junit类库
(4)进行测试
public class Main {
public static void main(String[] args) {
// System.out.println("Hello world!");
new Main().test2();
}
@Test
public void test1() {
System.out.println("test1");
}
@Test
public void test2() {
System.out.println("test2");
}
}
2.Maven进行依赖管理
注:想要用Maven进行依赖管理首先需要安装Maven,以下是安装并配置好Maven后的效果
用Maven进行依赖管理,在pom.xml中增加依赖,Maven会自动生成junit测试类库,此时,进行测试则不需要在main方法中,在想要测试的方法上面添加@Test
即可
(1)新建一个项目,Build system选择Maven
(2)添加依赖
(3)查看依赖的类库
(4)进行测试
注: 点击红线处绿色圆圈可直接运行
1.2项目构建
● 清理:删除以前的编译结果,为重新编译做好准备
● 编译:将 Java 源程序编译为字节码文件
● 测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性
● 报告:在每一次测试后以标准的格式记录和展示测试结果
● 打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。 Java 工程对应 jar 包, Web工程对应 war 包
● 安装:在 Maven 环境下特指将打包的结果——jar 包或 war 包安装到本地仓库中
● 部署:将打包的结果部署到远程仓库或将 war 包部署到服务器上运行
创建的构建工具
● ant
● maven
● Gradle
1.3Maven的核心概念
Maven 能够实现自动化构建是和它的内部原理分不开的,这里我们从Maven的九个核心概念入手,看看Maven是如何实现自动化构建的
● POM
● 约定的目录结构
● 坐标
● 依赖管理
● 仓库管理
● 生命周期
● 插件和目标
● 继承
2.Maven安装
2.1下载解压
1.下载
在Apache Maven官方进行下载,下载最新版本即可
2.解压
2.2配置环境变量
1.配置maven的环境变量
注:配置Maven环境变量的过程和配置jdk环境变量的过程差不多
(1)找到maven的安装目录
(2)新建环境变量
这里环境变量名称为M2_HOME,环境变量的值为maven的安装地址
注:下图path这里增加的环境变量为maven的安装地址,但是它也可以写为%M2_HOME%\bin
2.测试maven的安装
2.3配置文件
1.settings配置文件
maven配置文件有2个
● 全局配置文件D:\maven\apache-maven-3.9.3-bin\apache-maven-3.9.3\conf
,安装目录config下
● 用户配置文件~/.m2/settings.xml,这个配置文件开始不存在,需要自己创建.m2,拷贝配置文件
因为idea中默认使用用户配置文件,所以一般配置用户配置文件,这样idea就不需要在更改
2.profile配置
在settings配置文件中查看,配置maven项目的默认的JDK版本,比如指定所有maven项目采用jdk1.8
<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>
注: 若想指定所有maven项目采用jdk11,则把jdk11的注释解放,并把jdk1.8注释掉即可
指定maven项目的jdk版本,也可以具体的在pom文件中指定
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
3.核心概念
3.1仓库
maven的仓库可以分为本地仓库和远程仓库
1.本地仓库
本地仓库相当于一个缓存,在电脑上是一个文件夹,我们可以设置这个文件夹的路径(具体怎么设置会在下面的配置体现),工程第一次需要某种jar包时,会从远程仓库(互联网)下载并保存到本地仓库中(在程序员的电脑上),当第二次使用时,不需要去远程仓库下载,会先去本地仓库中找,如果找不到才会去远程仓库上下载
默认情况下,每个用户在自己的用户目录下都有一个路径名为 .m2/respository/ 的仓库目录
(1)本地仓库的配置
本地仓库默认的路径
● linux:~/.m2/repository
● windows:c:\Users\Administrator.m2\repository\
自定本地仓库:
修改~/.m2/settings.xml
<localRepository>d:\java\mvn_repo</localRepository>
2.远程仓库
远程仓库中分为中央仓库和私服两类
(1)中央仓库
中央仓库中的jar包由专业团队(Maven团队)维护,中央仓库中存放了全世界大多数流行的开源软件的jar包,是Maven默认的远程仓库
http://mvnrepository.com/
:搜索中央仓库的中的依赖构件
要浏览中央仓库的内容,Maven 社区提供了一个 URL:http://search.Maven.org/#browse
,使用这个仓库,开发人员可以搜索所有可以获取的代码库
(2)镜像私服
私服是另一种特殊的远程仓库,为了节省带宽和时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库,内部的项目还能部署到私服上供其他项目使用,除了中央仓库和私服,还有很多其他公开的远程仓库,常见的有java.net Maven库(http://download.java.net/maven/2/
)和jboss Maven库(http://repository.jboss.com/maven2/
)等,为了提高访问远程仓库的效率可以在特定的国家区域搭建的中央仓库的镜像私服
- 阿里云镜像仓库
避免去中央仓库访问构件,提高访问效率,在宿主目录下的settings文件中查看,~/.m2/setting.xml
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
3.2mvn项目的目录结构
1.java项目(jar)
(1)test4项目-生成jar包
(2)test5项目-引用test4的jar依赖
(3)约定大于配置,maven的项目结构是约定的不能改变,结构如下
● pom.xml
● src/main/java
● src/main/resources
● src/test/java
● src/test/resources
● target
2.web项目(war)
3.3坐标
maven项目的坐标(gav坐标),在maven仓库定位构件使用groupId,artifactiId,version坐标来进行定位
执行完mvn install本地仓库中相应的坐标下,产生jar
4.maven常见的命令
4.1 mvn compile:编译
编译程序,会生成target目录,并在target中编译成.class
4.2 mvn clean:清理
删除target,清理输出目录
4.3 mvn test:执行测试计划
执行测试,注意测试失败,不能打包,要想执行测试,一定要有测试文件
1.若测试之前没有target目录,则执行测试会生成一个target目录,但是此时还没有打包,所以target目录中没有jar包
4.4 mvn package:打包
打包成jar文件,输出到target
1.有target目录但是没有jar包,mvn package会打包jar文件输出到target
2.没有target目录的情况下,mvn package可以打包jar并输出到target,此时有了一个target目录,并且此目录下有一个jar包
4.5 mvn install :部署
部署jar文件,部署到本地仓库
1.有target目录和jar包的情况下,mvn install部署jar文件,部署到本地仓库
2.没有target目录的情况下,mvn install可以直接打包jar包并部署到本地库,此时在原项目中会生成一个有jar包的target目录
4.6 mvn deploy
部署jar包,部署到远程仓库
4.7 mvn clean install:清理,部署
先清理,然后部署
1.项目中没有target目录和jar包时,并且本地库也没有部署jar包,mvn clean install可以直接打包jar包并部署到本地库,此时在原项目中会生成一个有jar包的target目录
4.8 忽略测试,直接部署
mvn clean install -Dmaven.test.skip=true
1.测试失败,正常来说不能打包
2.忽略测试直接部署,此时可部署到本地仓库
5.maven依赖实战
注: idea中的可以是一个project中有多个module
5.1创建空项目
5.2配置项目默认的JDK
5.3创建maven-first
1.在pom.xml添加junit依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
2.创建HelloFirst类
package com.sys.demo;
public class HelloFirst {
public String sayHello(){
return "hello first";
}
}
3.创建测试类HelloFirstTest
package com.sys.demo;
import org.junit.Assert;
import org.junit.Test;
import static org.junit.Assert.*;
public class HelloFirstTest {
HelloFirst helloFirst = new HelloFirst();
@Test
public void sayHello() {
Assert.assertTrue("hello first".equals(helloFirst.sayHello()));
}
}
4.打包jar
5.4创建maven-second
1.在pom.xml添加maven-first依赖、junit依赖
2.创建HelloSecond类
package com.sys.demo;
public class HelloSecond {
HelloFirst helloFirst = new HelloFirst();
public String sayHello(){
return helloFirst.sayHello() + ":second";//会打印hello first:second
}
}
3.创建测试类HelloSecondTest
package com.sys.demo;
import org.junit.Assert;
import org.junit.Test;
import static org.junit.Assert.*;
public class HelloSecondTest {
HelloSecond helloSecond = new HelloSecond();
@Test
public void sayHello() {
Assert.assertTrue("hello first:second".equals(helloSecond.sayHello()));
}
}
6.父子项目工程
maven工程之间可以继承,子工程继承父工程后,就可以使用在父工程中引入的依赖
6.1父项目
1.父项目的打包方式为pom
<groupId>com.sunyanshu</groupId>
<artifactId>auth-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
6.2子项目
1.子项目会多一个<parent>
标签
<parent>
<groupId>com.sunyanshu</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
7.锁定版本依赖
锁定版本依赖使用<dependencyManagement>
标签,这个标签只能用来锁定版本依赖,不具有导入依赖的功能,可以搭配<properties>
标签一起使用,如下
<!--指定版本依赖-->
<properties>
<java.version>1.8</java.version>
<alibaba.version>2.2.0.RELEASE</alibaba.version>
<mybatis-plus.version>3.4.1</mybatis-plus.version>
<mysql.version>5.1.32</mysql.version>
<jwt.version>1.0.0</jwt.version>
<!-- <knife4j.version>2.0.8</knife4j.version>-->
<fastjson.version>1.2.29</fastjson.version>
</properties>
<!--锁定版本依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.github.xiaoymin</groupId>-->
<!-- <artifactId>knife4j-spring-boot-starter</artifactId>-->
<!-- <version>${knife4j.version}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>${jwt.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<properties>
标签定义了一些属性变量,例如 java.version、alibaba.version 等等,用于在依赖引入和其他配置中使用,在这个例子中,mybatis-plus-boot-starter、mysql-connector-java、java-jwt 和 fastjson 这些依赖版本号都是通过这些属性进行配置的
<dependencyManagement>
标签则用于管理项目中所有依赖的版本,这些依赖可以是自己编写的,也可以是第三方库,它的作用是为所有依赖设置一个默认的版本号,这样就不需要在每个依赖中都指定版本号了,如果某个依赖在这里没有声明版本号,那么使用该依赖时,Maven 将会报错
需要注意的是,<dependencyManagement>
标签只是为所有依赖设置了一个默认版本号,并不会实际引入依赖,所以在<dependencies>
标签中,依然需要显式地声明依赖关系,包括它们的 groupId、artifactId 和版本号等信息,并且在<dependencyManagement>
标签中锁定版本依赖后,那么在实际在<dependencies>
标签中引入依赖时则不需要写<version>
标签了,如下
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>