maven
1.简介
Maven 是一款基于 Java 平台的项目管理和整合工具,它将项目的开发和管理过程抽象成一个项目对象模型(POM)。开发人员只需要做一些简单的配置,Maven 就可以自动完成项目的编译、测试、打包、发布以及部署等工作。
Maven 是使用 Java 语言编写的,因此它和 Java 一样具有跨平台性,这意味着无论是在 Windows ,还是在 Linux 或者 Mac OS 上,都可以使用相同的命令进行操作。
Maven 使用标准的目录结构和默认构建生命周期,因此开发者几乎不用花费多少时间就能够自动完成项目的基础构建工作。
Maven 能够帮助开发者完成以下任务:
- 依赖管理
- 构建项目
- 生成文档
- 创建报告
- 维护依赖
- 软件配置管理
- 发布
- 部署
总而言之,Maven 简化并标准化了项目构建过程。它将项目的编译,生成文档,创建报告,发布,部署等任务无缝衔接,构建成一套完整的生命周期。
1.1 依赖管理
依赖:指当前项目运行所需要的jar包。一个项目中可以引入多个依赖:
例如:在当前工程中,我们需要用到logback来记录日志,此时就可以在maven工程的pom.xml文件中,引入logback的依赖。具体步骤如下:
在pom.xml中编写标签
在标签中使用 引入坐标
定义坐标的 groupId、artifactId、version
点击刷新按钮,引入最新加入的坐标
1.2 项目构建
● 清理:删除以前的编译结果,为重新编译做好准备。
● 编译:将 Java 源程序编译为字节码文件。
● 测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
● 报告:在每一次测试后以标准的格式记录和展示测试结果。
● 打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。 Java 工程对应 jar 包, Web工程对应 war 包。
● 安装:在 Maven 环境下特指将打包的结果——jar 包或 war 包安装到本地仓库中。
● 部署:将打包的结果部署到远程仓库或将 war 包部署到服务器上运行。
创建的构建工具
● ant
● maven
● Gradle
1.3maven的核心概念
Maven 能够实现自动化构建是和它的内部原理分不开的, 这里我们从 Maven 的九个核心概念入手,看看 Maven 是如何实现自动化构建的
● POM
● 约定的目录结构
● 坐标
● 依赖管理
● 仓库管理
● 生命周期
● 插件和目标
● 继承
2.安装
2.1下载、解压、配置
1.下载
2.解压
3.配置maven环境变量
2.2配置文件
maven配置文件有2个
全局配置文件d:\java\apache-maven-3.6.3\conf\settings.xml,安装目录config下
用户配置文件~/.m2/settings.xml,这个配置文件开始不存在,需要自己创建.m2,拷贝配置文件
因为idea中默认使用用户配置文件,所以一般配置用户配置文件,这样idea就不需要在更改
2.2.1 本地仓库的配置
本地仓库默认的路径
linux:~/.m2/repository
windows:c:\Users\Administrator.m2\repository
自定本地仓库:
修改~/.m2/setting.xml
2.2.2 阿里云镜像仓库
避免去中央仓库访问构件,提高访问效率
~/.m2/setting.xml
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
2.2.3 profile配置
配置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>
在profile配置JDK11
<profile>
<id>jdk-11</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>11</jdk>
</activation>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.compilerVersion>11</maven.compiler.compilerVersion>
</properties>
</profile>
指定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的仓库可以分为本地仓库和远程仓库。
3.1.2 本地仓库
本地仓库相当于一个缓存,在电脑上是一个文件夹,我们可以设置这个文件夹的路径(具体怎么设置会在下面的配置体现),工程第一次需要某种jar包时,会从远程仓库(互联网)下载并保存到本地仓库中(在程序员的电脑上),当第二次使用时,不需要去远程仓库下载,会先去本地仓库中找,如果找不到才会去远程仓库上下载。
默认情况下,每个用户在自己的用户目录下都有一个路径名为 .m2/respository/ 的仓库目录。
3.1.3 远程仓库
远程仓库中分为中央仓库和私服两类。
3.1.2.1 中央仓库
中央仓库中的jar包由专业团队(Maven团队)维护,中央仓库中存放了全世界大多数流行的开源软件的jar包,是Maven默认的远程仓库。
http://mvnrepository.com/:搜索中央仓库的中的依赖构件
要浏览中央仓库的内容,Maven 社区提供了一个 URL:http://search.Maven.org/#browse。使用这个仓库,开发人员可以搜索所有可以获取的代码库。
3.1.2.2 镜像私服
私服是另一种特殊的远程仓库,为了节省带宽和时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库。内部的项目还能部署到私服上供其他项目使用。除了中央仓库和私服,还有很多其他公开的远程仓库,常见的有java.net Maven库(http://download.java.net/maven/2/)和jboss Maven库(http://repository.jboss.com/maven2/)等
为了提高访问远程仓库的效率可以在特定的国家区域搭建的中央仓库的镜像私服
3.2 maven项目目录结构
Maven项目目录结构是什么样的呢?Maven约定了一套规则来创建和构建我们的项目。得益于Maven的一些约定,我们只要学习相对很少的命令就可以创建和管理我们的项目。在项目的目录结构上,Maven有一套约定的通用的目录结构。
使用一套通用的目录结构的好处是,可以减少开发人员熟悉不同Maven项目时的认知负担。在使用相同的目录结构的情况下,开发人员可以很快的熟悉一个项目。接下来,我们将开始介绍Maven的通用的目录结构。
Maven项目通用目录结构
Maven默认约定了一套目录结构,在通过Maven创建了项目以后,项目的目录结构就是以这套目录结构作为模板创建的。
Maven项目目录结构
src/main/java 项目的源代码所在的目录
src/main/resources 项目的资源文件所在的目录
src/main/filters 项目的资源过滤文件所在的目录
src/main/webapp 如果是web项目,则该目录是web应用源代码所在的目录,比如html文件和web.xml等都在该目录下。
src/test/java 测试代码所在的目录
src/test/resources 测试相关的资源文件所在的目录
3.3 坐标
maven项目的坐标(gav坐标),在maven仓库定位构件使用groupId,artifactiId,version坐标来进行定位。
<groupId>com.lxs.demo</groupId>
<artifactId>hello-maven</artifactId>
<version>1.0-SNAPSHOT</version>
执行完mvn install本地仓库中相应的坐标下,产生jar
4.maven常见命令
● mvn compile:编译
○ 编译程序,在target中编译成.class
● mvn clean:清理
○ 删除target,清理输出目录
● mvn test:执行测试计划
○ 执行测试,注意测试失败,不能打包
● mvn package:打包
○ 打包成jar文件,输出到target
● mvn install :部署
○ 部署jar文件,部署到本地仓库
● mvn deploy
○ 部署jar包,部署到远程仓库
● mvn clean install:清理,部署
○ 先清理,然后部署
● mvn clean install -Dmaven.test.skip=true
○ 忽略测试,直接部署
5.入门案例
创建目录hello-maven
pom.xml
<?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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lxs.demo</groupId>
<artifactId>hello-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
创建相应的目录
src/main/java
src/main/resources
src/test/java
src/test/resources
HelloMaven.java
在src/main/java创建HelloMaven.java
public class HelloMaven {
public String sayHello() {
return "hello maven";
}
}
创建测试HelloMavenTest
在src/main/test创建HelloMaven.java
import org.junit.Assert;
import org.junit.Test;
import static org.junit.Assert.*;
public class HelloMavenTest {
@Test
public void sayHello() {
Assert.assertTrue("hello maven".equals(new HelloMaven().sayHello()));
}
}
执行命令
mvn package
6.maven的依赖
可以在一个项目的pom.xml文件中引入另外一个项目的坐标,用来完成开发
现在有两个项目
- maven-first
- maven-second
maven-first:
在second项目中引入first的坐标
就可以使用first项目中的HelloFirst类。