1 简介
Maven 是 Apache 软件基金会组织维护的一款自动化构建工具, 专注服务于 Java 平台的项目构建和依赖管理。 Maven 这个单词的本意是: 专家,内行。 读音是['meɪv(ə)n]或['mevn]。
所用:
● 依赖管理
● 项目构建
什么是项目的依赖管理
1.1 什么是依赖管理
项目依赖junit的实验
- 创建java project
- 增加junit测试类库
- 依赖junit类库
- 测试代码
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");
}
}
maven进行依赖管理
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>compile</scope>
</dependency>
1.2 什么是项目构建
● 清理:删除以前的编译结果,为重新编译做好准备。
● 编译:将 Java 源程序编译为字节码文件。
● 测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
● 报告:在每一次测试后以标准的格式记录和展示测试结果。
● 打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。 Java 工程对应 jar 包, Web工程对应 war 包。
● 安装:在 Maven 环境下特指将打包的结果——jar 包或 war 包安装到本地仓库中。
● 部署:将打包的结果部署到远程仓库或将 war 包部署到服务器上运行。
创建的构建工具
● ant
● maven
● Gradle
1.3 Maven的核心概念
Maven 能够实现自动化构建是和它的内部原理分不开的, 这里我们从 Maven 的九个核心概念入手,看看 Maven 是如何实现自动化构建的
● POM
● 约定的目录结构
● 坐标
● 依赖管理
● 仓库管理
● 生命周期
● 插件和目标
● 继承
2 安装
2.1 下载,解压,配置
- 下载
- 解压
- 配置maven的环境变量
- 测试mvn安装
D:\java\apache-maven-3.6.3>mvn -version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: d:\java\apache-maven-3.6.3\bin\..
Java version: 1.8.0_251, vendor: Oracle Corporation, runtime: d:\java\jdk1.8.0_251\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
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
d:\java\mvn_repo
2.2.2 阿里云镜像仓库
避免去中央仓库访问构件,提高访问效率
~/.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>
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.2 远程仓库
远程仓库中分为中央仓库和私服两类。
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 mvn项目的目录结构
3.2.1 java项目(jar)
test4项目-生成jar包
test5项目-引用test4的jar依赖
约定大于配置,maven的项目结构是约定的不能改变,结构如下:
● pom.xml
● src/main/java
● src/main/resources
● src/test/java
● src/test/resources
● target
3.2.2 web项目(war)
3.3 坐标
x,y坐标
maven项目的坐标(gav坐标),在maven仓库定位构件使用groupId,artifactiId,version坐标来进行定位。
<groupId>com.lxjie.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
○ 忽略测试,直接部署
4.1maven的入门案例
- 创建目录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
5 maven的依赖
idea中的可以是一个project中有多个module
- 创建空项目
配置下项目默认的JDK
- 创建maven-first
pom.xml
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
HelloFirst
package com.lxs.demo;
public class HelloFirst {
public String sayHello() {
return "hello first";
}
}
HelloFirstTest
package com.lxs.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()));
}
}
- 创建maven-second
HelloSecond
package com.lxs.demo;
public class HelloSecond {
HelloFirst helloFirst = new HelloFirst();
public String sayHello() {
return helloFirst.sayHello() + ":second"; //hello first:second
}
}
HelloSecondTest
package com.lxs.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()));
}
}