Maven

2022/2/19 23:41:59

本文主要是介绍Maven,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1 Maven概述


1.1 为什么使用Maven

  1. 添加第三方jar包。通过坐标引用jar包。
  2. jar包间的依赖关系。通过Maven管理包之间的依赖。
  3. 管理jar包之间的冲突。自动处理jar包间的冲突。
  4. 获取第三方jar包。从中央仓库获取规范的jar包。
  5. 将项目拆分成多个工程模块。多个module间使用Maven进行管理,多个package(MVC分层等)。
  6. 实现项目分布式部署。不同的module在不同的服务器上运行。

2 Maven是什么

2.1 自动化构建工具

  • 服务于Java平台的项目构建和依赖管理。

2.2 什么是构建

  • 编写代码通过Maven的框架,构建一个可部署的项目(jar包)

2.3 构建的重要环节

  1. 清理(clean
  2. 编译(test-compile
  3. 测试(test
  4. 报告
  5. 打包(package
  6. 安装(install
  7. 部署(deploy)

2.4 自动化构建

  • 将以上重要环节自动化

2.5 Maven的核心概念

  1. POM
  2. 约定的目录结构
  3. 坐标
  4. 依赖管理
  5. 生命周期
  6. 插件和目标
  7. 继承
  8. 聚合

3 如何使用Maven

3.1安装Maven核心程序

  • JAVA_HOME环境变量配置
  • 将apache-maven-3.5.4-bin.zip解压到非中文无空格目录
  • 配置M2_HOME环境变量目录\apache-maven-3.5.4
  • 配置Path:%M2_HOME%\bin
  • dos中输入mvn -v查看是否安装成功

3.2 第一个Maven工程(Hello)

1 约定的目录结构

Hello
	src
		main
		resources
	tset
		main
		resources
	pom.xml

2 创建Maven的核心配置文件pom.xml

<?xml version="1.0" ?>
<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.atguigu.maven</groupId>
	<artifactId>Hello</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<name>Hello</name>
	  
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.0</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
</project>

3 编写主代码

package com.atguigu.maven;
public class Hello {
	public String sayHello(String name){
		return "Hello "+name+"!";
	}
}

4 编写测试程序代码

package com.atguigu.maven;	
import org.junit.Test;
import static junit.framework.Assert.*;

public class HelloTest {
	@Test
	public void testHello(){
		Hello hello = new Hello();
		String results = hello.sayHello("atguigu");
		assertEquals("Hello atguigu!",results);	
	}
}

5 运行基本的Maven命令(dos窗口)

// 运行前需要进入到pom.xml目录下
mvn compile //编译
mvn clean // 清理
mvn test-compile // 编译测试程序
mvn test // 测试程序
mvn package // 打包
mvn install // 程序jar包放到本地仓库

3.3 Maven联网问题

1 配置本地仓库

  1. 默认的本地仓库:用户.m2\repository
  2. 核心配置文件目录:解压目录的conf\settings.xml
  3. 在settings.xml中添加本地仓库路径
<localRepository>本地仓库路径</localRepository>

2 配置阿里云镜像,不使用中央仓库

<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

3.4 IDEA中配置Maven

1 设置安装目录和本地仓库

1.png

2 配置Maven自动导入jar包

2.png

3 在File - Other Settings - Settings for New Projects设置以上操作

3.5 创建Maven Module

  1. 先创建Empty Project
  2. 创建Maven模块
  3. 配置pom.xml
  4. 编写主代码
  5. 编写测试代码
  6. 运行Maven工程

3.6 Maven打包插件

  • 和依赖并列
<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
              <archive>
                    <manifest>
                     <!-- 指定主类 -->
                        <mainClass>xxx.xxx.XXX</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>

            </executions>
        </plugin>
    </plugins>
</build>

4 Maven的核心概念

4.1 POM

  • Project Object Module项目对象模型。将Java工程的相关信息封装为对象作为便于操作和管理的模型
  • pom.xml的大致结构
<project...> // 1 工程
	<modelVersion>...</modelVersion>// 1.1 版本
	
    <groupId>...</groupId>// 1.2 工程坐标
	<artifactId>...</artifactId>
	<version>...</version>
	
    <properties>// 1.3 自定义依赖版本
    	<xxx.version>...</xxx.version>
    </properties>
    
    <dependencies>// 1.2 依赖
        <dependency>//1.2.1 依赖1
            <groupId>...</groupId>// 1.2.1.1 依赖坐标
            <artifactId>...</artifactId>
            <version>...</version>
            <scope>...</scope> //1.2.1.2 依赖范围
        </dependency>
        
        <exclusions>// 1.2.2 排除
            <exclusion>// 1.2.2.1 排除1
                <groupId>...</groupId>
                <artifactId>...</artifactId>
            </exclusion>
        </exclusions>
    </dependencies>
     
    <build>//1.3构建部分
		<plugins>//1.3.1插件部分
            <plugin>...<plugin>// 1.3.1.1插件1
    	</plugins>
    </build>
    
    <reporting>// 1.4报表部分
    
    </reporting>

</project> 

4.2 约定的目录结构

  • 约定 > 配置 > 编码。有了约定,就可以不进行配置,是自动化构建的前提

4.3 坐标

1 module的坐标

  • 写在标签下的坐标
<project...> 
...
  <groupId>com.atguigu.maven</groupId>
  <artifactId>Hello</artifactId>
  <version>0.0.1-SNAPSHOT</version>
...
</project> 

2 依赖的坐标

  • 写在标签下,每个依赖使用标签中。
<project...> 
...
<dependencies>
  
  <dependency>
    <groupId>com.atguigu.maven</groupId>
    <artifactId>Hello</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </dependency>
  
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.0</version>
    <scope>test</scope>
  </dependency>
  
</dependencies>
...
</project> 

4.4 依赖管理

1 依赖的范围

  • 常见的有 compile、test、provided 还有runtime、import、system等
  • 写在标签中

Snipaste_2022-02-19_23-06-01.png

2 依赖的传递性

直接依赖和间接依赖

  • A<---B<---C。C直接依赖于B,B直接依赖于A,C间接依赖于A。

好处

  • 可以传递的依赖(非compile依赖),不必在每个模块重复声明,最下面的工程依赖一次即可。

注意

  • 非compile依赖不能传递。所以各个工程模块中,如果有需要,就要重复声明该依赖。

3 依赖的原则

  1. 路径段优先
  2. 配置文件中声明顺序优先
  3. 同时需要考虑依赖的范围

4 依赖的排除

  • 如果B不想使用A中的某个依赖a,而A中的该依赖a是compile的且无法修改的,则需要使用exclusions来排除该依赖。且被B依赖的C也被排除了。注:标签声明在标签下1.png

5 统一管理目标jar包版本

  • 如果配置中有同一版本的不同jar包,使用标签来自定义依赖的版本<xxx.version>版本号</xxx.version>,在每个依赖中,使用${spring.version}来统一修改
<project>
	<properties>
      <spring.version>4.0.0.RELEASE</spring.version>
  </properties>

  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
  </dependency>

  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
	</dependency>
</project>

4.5 仓库

1 本地仓库

2 远程仓库

  1. 私服(局域网)
  2. 中央仓库(Internet上)
  3. 中央仓库镜像(各大洲,例如阿里云镜像)

3 仓库的内容

  1. Maven插件
  2. 自己编写的项目module
  3. 第三方框架或工具jar包

4.6 生命周期

  1. Clean LifeCycle:构建前的清理工作
    1. 三个阶段:pre-clean、clean、post-clean
  2. Default LifeCycle:构建的核心工作:编译、测试、打包、安装、部署等
    1. compile编译主程序
    2. test-comply编译测试程序
    3. test进行测试
    4. package打包
    5. install安装到本地仓库
  3. Site LifeCycle:生成项目报告,站点,发布站点
    1. pre-site、site、post-site、site-depoly

4.7 插件和目标(plugin and target)

  1. Maven的核心,每个生命周期的每个步骤都是由插件完成的
  2. 每个插件有多个功能,每个功能完成一个步骤
  3. compile是maven-compiler-plugin的一个功能,pre-clean是maven-clean-plugin的一个目标

5 继承

  • 说明:
    • test范围依赖(例如junit)不能传递,各个工程都有一样的该依赖,容易造成版本不一致。
    • 例如:Hello(junit 4.0) <--- HelloFriend(junit 4.0) <--- MakeFriends(junit 4.9)
  • 解决方案:
    • 将junit提取到父工程,,在子工程中声明junit的版本即可,同时也便于修改。
  • 操作步骤:
    1. 创建父工程Parent,打包方式Packaging选pom。pom
    2. 子工程在标签中声明父工程的引用,并加上(以当前文件为基准的父工程pom.xml文件的)相对路径 ...标签
    3. 子工程的坐标中的,与父工程坐标中重复的内容删除(各子工程的g和v部分)
    4. 父工程中统一junit的依赖
    5. 子工程中删除junit依赖的版本号部分
  • 配置继承后,执行安装命令前要先安装父工程
//父
<project>    
	<packaging>pom</packaging>
    
    <dependencyManagement>
    	<dependencies>
        	<dependency>
        		<g, a, v />// 指明junit的版本
    			<scope>4.9</scope>
        	</dependency>
        </dependencies>
    </dependencyManagement>
</project>
//子
<project>
	<parent>
        <relativePath>../Parent/pom.xml</relativePath>
    </parent>
    
    <dependencies>
		<dependency>
			<g, a, v />
    		//删除scope标签
		</dependency>
	</dependencies>
</project>

6 聚合

  • 作用:一键安装各个模块工程
  • 配置方式:在一个总的聚合模块中配置各个参与聚合的模块,父工程也可以做为聚合模块。在标签中加入各个需要聚合的模块,每个中填入各个模块相对于聚合模块的相对路径。
<project>
    <modules>
    	<module></module>// 模块1
        <module></module>// 模块2
        <module></module>// 模块3
    </modules>
</project>


这篇关于Maven的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程