Maven

介绍和搭建

介绍

Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告,和文档的软件项目管理工具。

环境搭建

网址:https://maven.apache.org/download.cgi

windows下载这个包:

配置环境变量:

M2_HOME :

path: %M2_HOME%\bin;

打开cmd验证:

修改配置文件中本地仓库位置:

打开setting.xml文件:

修改仓库为你自己的文件夹位置:

保存关闭即可。

小案例

Maven约定目录结构

mvn-project

​ src

​ -main

​ -java

​ -package

​ -test

​ -java

​ -package

​ resources

​ target

​ pom.xml

小测试

常用maven命令

mvn -v 查看maven版本

mvn compile 编译

mvn test 测试

mvn package 打包

mvn clean 删除target

mvn install 安装jar包到本地仓库

建立maven-test目录并在其中建立如下目录结构

在main最后目录下建立一个Hallo.java文件,内容如下:

package com.imooc.maven01.model;

public class Hello{
public String sayHello(){
return "Hello";
}
}

在test文件夹最后目录下建立一个TestHello.java文件,内容如下:

package com.imooc.maven01.model;

import org.junit.*;
import org.junit.Assert.*;
public class HelloTest{
@Test
public void testSayHello(){
Assert.assertEquals("Hello",new Hello().sayHello());
}
}

在maven-test文件夹下建立一个pom.xml文件,内容如下:

<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.imooc.maven01</groupId>
<artifactId>maven-test</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
</project>

在maven-test目录下执行maven命令:

mvn compile

输出如下:

mvn test

输出如下:

mvn package

输出如下:

执行mvn clean,输出如下:

可以看到target文件夹已经不存在了:

执行 mvn install,输出如下:

可以在本地仓库中看到我们的jar包已经存在:

如果输出正确,代表安装及项目创建正确。

注册到仓库并被其他项目依赖

在maven-test目录执行: mvn install

成功后新建一个项目maven-test-2,目录如下:

并且在main最后一个目录下建立一个Speak.java文件,内容如下:

package com.imooc.maven02.util;
import com.imooc.maven01.model.*; public class Speak{
public String useSayHallo(){
return new Hello().sayHello();
}
}

在test最后一个文件夹下建立一个TestSpeak.java文件,内容如下:

package com.imooc.maven02.util;

import org.junit.*;
import org.junit.Assert.*;
public class SpeakTest{
@Test
public void testSayHello(){
Assert.assertEquals("Hello",new Speak().useSayHallo());
}
}

pom.xml添加junit和maven-test依赖:

<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.imooc.maven02</groupId>
<artifactId>maven-test-2</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<dependency>
<groupId>com.imooc.maven01</groupId>
<artifactId>maven-test</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>

执行maven test

成功,表示依赖相关操作正确。基于此功能方便在其他原有项目上构建更大的项目。

自动生成maven项目骨架

在命令行输入mvn archetype:generate,然后等待下载完相应插件根据提示输入groupId,artifactId,version然后就会自动帮你创建一个对应的maven骨架项目

结果如下:

或者直接设置所有的属性:

mvn archetype:generate -DgroupId=com.imooc.maven04 -DartifactId=maven-test-4 -Dversion1.0

-Dpackage=com.imooc.maven04.demo

然后一路回车即可完成创建

IDEA中配置Maven

当前项目配置:

为新建项目配置默认maven:

最好再更改一下下面的设置:

pom.xml解析

<project>

​	<modelVersion></modelVersion>

​	<groupId>反写公司网址+项目名</groupId>

​	<artifactId>项目名+模块名</artifactId>

​	<!--大版本.分支版本.小版本 snapshot快照,alpha内测,beta公测,Release稳定,GA正式发布-->

​	<version></version>

​	<!--默认是jar可以是war,zip,pom-->

​	<packaging></packaging>

​	<!--项目描述名-->

​	<name></name>

​	<!--项目网址-->

​	<url></url>

​	<!--项目描述-->

​	<description></description>

​	<!--开发者-->	

​	<developers></developers>

​	<licenses></licenses>

​	<organization></organization>

​	<dependencies>	

​			<dependency>

​				<groupId></groupId>

​				<artifactId></artifactId>

​				<version></version>

​				<type></type>

​				<!--依赖使用范围-->	

​				<scope></scope>

​				<!--依赖是否可选默认是false-->	

​				<optional></optional>

​				<!--排除依赖列表-->	

​				<exclusions>

​						<exclusion></exclusion>

​				</exclusions>

​			</dependency>

​	</dependencies>

<!--依赖管理(父模块定义给子模块用)-->	

<dependencyManagement>

​	<dependencies>

​			<dependency></dependency>

​	</dependencies>

​	<build>

​		<!--插件列表-->

​		<plugin>

​				<groupId></groupId>

​				<artifactId></artifactId>

​				<version></version>

​		</plugin>

​	</build>

<!--继承父模块-->

<parent></parent>

<!--聚合多个模块编译-->

<modules></modules>

</dependencyManagement>

</project>

依赖范围

三种类路径

编译,测试,运行

scope

compile:默认范围,编译测试运行都有效

provided:在测试和编译时有效

runtime:只在测试和运行时有效

test:只在测试时有效

system:只在测试和编译时有效,与本地环境关联,可移植性较差

import:导入的范围,只使用在dependencyManagement中,表示从其他的pom中导入dependecy的配置

依赖传递

bige<--nange<--shanji(默认依赖bige可以排除)

hongxing-bige的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.hongxing</groupId>
<artifactId>hongxing-bige</artifactId>
<version>1.0-SNAPSHOT</version> <name>hongxing-bige</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.0</version>
</dependency>
</dependencies> </project>

hongxing-nange的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.hongxing</groupId>
<artifactId>hongxing-nange</artifactId>
<version>1.0-SNAPSHOT</version> <name>hongxing-nange</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-bige</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
</dependencies> </project>

hongxing-shanji的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.hongxing</groupId>
<artifactId>hongxing-shanji</artifactId>
<version>1.0-SNAPSHOT</version> <name>hongxing-shanji</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-nange</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies> </project>

hongxing-shanji如果不想依赖hongxing-bige可以用下面的方式引入hongxing-nange

<dependency>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-nange</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-bige</artifactId>
</exclusion>
</exclusions>
</dependency>

依赖冲突

短路优先

A-->B-->C-->X(jar)

A-->D-->X(jar)

会优先解析短的路径

上面hongxing-shanji默认的commons-io的版本会是hongxing-nange中的版本

路径长度相同,谁的dependacy先声明,谁先解析

A-->B--X(jar)

A-->D-->X(jar)

如果在A中先声明D就用D中的X.jar版本

聚合

可以建立一个聚合maven项目来管理hongxing-bige,hongxing-nange,hongxing-shanji

建立一个hongxing-allmaven项目,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.hongxing</groupId>
<artifactId>hongxing-all</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging> <name>hongxing-all</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties> <modules>
<module>../hongxingbige</module>
<module>../hongxingnange</module>
<module>../hongxingshanji</module>
</modules>
</project>

运行该项目,会将三个module的pom.xml都运行

继承

可以建立一个父maven项目来提供依赖给子项目继承,父类提供详细描述,子类只需填写groupId和artifactId即可引入依赖。

继承后各pom.xml(注意要先将父pom注册到仓库中)

hongxing-parent的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.hongxing</groupId>
<artifactId>hongxing-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>hongxing-parent</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.11</junit.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement> </project>

hongxing-bige的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.hongxing</groupId>
<artifactId>hongxing-bige</artifactId>
<version>1.0-SNAPSHOT</version> <name>hongxing-bige</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<parent>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.0</version>
</dependency>
</dependencies> </project>

hongxing-nage的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.hongxing</groupId>
<artifactId>hongxing-nange</artifactId>
<version>1.0-SNAPSHOT</version> <name>hongxing-nange</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<parent>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-bige</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
</dependencies> </project>

hongxing-shanji的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.hongxing</groupId>
<artifactId>hongxing-shanji</artifactId>
<version>1.0-SNAPSHOT</version> <name>hongxing-shanji</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<parent>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-nange</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-bige</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies> </project>

Maven知识点一览的更多相关文章

  1. Maven插件一览

    maven-assembly-plugin 将对应模块依赖在  mvn package 阶段全部打到一个 jar 包里面: java -cp xx.jar package.name.MainClass ...

  2. Maven知识点积累二

    ①maven常用命令: mvn clean:清除target下编译生成的class文件 mvn compile:编译 mvn package:打包放到target下 mvn install:打包并放到 ...

  3. Maven知识点积累一

    配置maven变量,变量名可以是:MAVEN_HOME 或 M2_HOME settings.xml配置本地仓库地址: <localRepository>G:/.m2/repository ...

  4. Maven知识点整理

    1. 基础:maven 概念及生命周期 ===>Nexus创建本地Maven仓库(Maven私服) https://www.cnblogs.com/zishengY/p/7794923.html ...

  5. maven 知识点2

    maven 命令: table th:first-of-type { width: 500px; } table th:nth-of-type(2) { } 命令 含义 mvn help:effect ...

  6. maven 知识点1

    在POM 4中,dependency 中还引入了 scope,它主要管理依赖的部署.目前 scope 可以使用5个值: compile,缺省值,适用于所有阶段,会随着项目一起发布. provided, ...

  7. Maven知识点简要

      1.依赖管理 <dependencies> <dependency> <groupId>net.sf.json-lib</groupId> < ...

  8. Maven 知识点总结以及解决jar报冲突的几种方法

    1.常见的命令 Compile Test Package Install Deploy Clean 2.坐标的书写规范 groupId 公司或组织域名的倒序 artifactId 项目名或模块名 ve ...

  9. 各数据库连接配置与maven依赖安装

    maven用的比较多,所以自己去捣鼓了一下:以下是关于数据库配置的一块,把相关的内容张贴出来,以备不时之需 //MySql 配置文件(maven):pom.xml <dependency> ...

随机推荐

  1. OO_Unit1总结

    OO的第一单元作业告一段落,这周是总结而不是码代码,甚至心中有点落空感.OO课给我的一周构建了一个完整的循环,从周二的作业发布到接下来几天的思考和构建程序,再到面向中测进行一部分的bug修复,最后到互 ...

  2. k8s在线和离线批量修改镜像地址的两种方式

    背景介绍 有时往k8s集群里部署一堆服务的时候,需要拷贝一堆yaml文件,当然还有其他方式部署,例如通过建立一个一个的流水线等方式,但是这太慢了,虽然是一劳永逸,但是如果说仅仅是部署一次那就可太费劲了 ...

  3. 【Azure 应用服务】备份网站时由于文件太大了,导致应用服务备份失败。如何解决?

    问题描述 备份网站时由于文件太大了,导致应用服务备份失败.如何解决呢? 问题分析 App Service (应用服务)的备份功能有10GB大小的限制,超过了是无法备份成功的并且该限制是无法扩大的.查看 ...

  4. 动态地绑定到它的 is 特性,可以实现动态组件

    前面的话 让多个组件使用同一个挂载点,并动态切换,这就是动态组件.本文将详细介绍Vue动态组件 概述 通过使用保留的 <component> 元素,动态地绑定到它的 is 特性,可以实现动 ...

  5. POJ1422 最小路径覆盖

    题意:      一个战场,往战场上投放伞兵,每个伞兵不能后退,只能往前走,问你最少多少个伞兵可以吧所有的点都占领. 思路:      这个题是最小路径覆盖,最小路径覆盖 = n - 最大匹配数,首先 ...

  6. Windows Server中企业证书服务的安装

    目录 企业证书服务的安装 证书服务的应用 企业证书服务的安装 企业证书服务是基于域的,所以需要该服务器是域控服务器. 添加角色,勾选 Active Directory 证书服务 然后后面的一直下一步, ...

  7. POJ1548最小路径覆盖

    题意:       给你一个DAG,然后问你最少多少条路径能覆盖所有需要覆盖的点. 思路:       最小路径覆盖,太明显了,每个点向它右下方的点连边,然后...没啥难的地方,不说了. #inclu ...

  8. 逆向 time.h 函数库 time、gmtime 函数

    0x01 time 函数 函数原型:time_t time(time_t *t) 函数功能:返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位.如果 se ...

  9. WPF中属性经动画处理后无法更改的问题

    在WPF的Animation中,有一个属性为FillBehavior,用于指定时间线在其活动周期结束后但其父时间线仍处于活动周期或填充周期时的行为方式.如果希望动画在活动周期结束时保留其值,则将动画F ...

  10. Ubuntu Linux 学习篇 配置DHCP服务器

    isc-dhcp-server 动态主机配置协议是一个局域网的网络协议.指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码.首先, DHCP服务器必须是 ...