Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

核心功能

  • 依赖管理:Maven工程对jar包的管理过程。

一个复杂的项目将会包含很多依赖,也有可能包含依赖于其它构件的依赖。这是Maven最强大的特征之一,它支持了传递性依赖(transitive dependencies)。假如你的项目依赖于一个库,而这个库又依赖于五个或者十个其它的库(就像Spring或者Hibernate那样)。你不必找出所有这些依赖然后把它们写在你的pom.xml里,你只需要加上你直接依赖的那些库,Maven会隐式的把这些库间接依赖的库也加入到你的项目中。Maven也会处理这些依赖中的冲突,同时能让你自定义默认行为,或者排除一些特定的传递性依赖。

  • 项目构建:mvn tomcat:run

仓库

本地仓库、远程仓库(私服)、中央仓库

本地仓库默认为{user.home}.m2.repority,可以在配置文件中修改

Maven项目标准目录结构

核心代码部分:src/main/java

配置文件部分:src/main/resources

测试代码部分:src/test/java

测试配置文件:src/test/resources

页面资源(包含js,css,图片资源等):src/main/webapp

Maven常用命令

clean:删除项目中已经编译好的信息,删除target目录

compile:Maven工程的编译命令,用于编译项目的源代码,将src/main/java下的文件编译成class文件输出到target目录下。

test:使用合适的单元测试框架运行测试。

package:将编译好的代码打包成可分发的格式,如JAR,WAR。

install:安装包至本地仓库,以备本地的其它项目作为依赖使用。

deploy:复制最终的包至远程仓库,共享给其它开发人员和项目(通常和一次正式的发布相关)。

每一个构建项目的命令都对应了maven底层一个插件。

Maven命令package、install、deploy的联系与区别

mvn clean package依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段。

mvn clean install依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8个阶段。

mvn clean deploy依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy等9个阶段。

主要区别:
package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库。

install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库。

deploy命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库。 

Maven生命周期

清理生命周期:运行mvn clean将调用清理生命周期 。

默认生命周期:是一个软件应用程序构建过程的总体模型 。

compile,test,package,install,deploy

站点生命周期:为一个或者一组项目生成项目文档和报告,使用较少。

Maven概念模型

项目对象模型(Project Object Model,POM),对应着Maven项目中的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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.shangguan</groupId>
<artifactId>concurrency</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>concurrency</name>
<description>Demo project for Spring Boot</description>

项目运行所依赖的jar包信息,如:

    <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<groupId>:团体,公司,小组,组织,项目,或者其它团体。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。

<artifactId>:项目的唯一标识符

version:项目的版本

package:项目的类型,默认是jar,描述了项目打包后的输出 。

项目运行环境信息,比如:jdk,tomcat信息

    <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

依赖范围

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

provided:编译和运行有效,最后在运行的时候不会加入。官方举了一个例子。比如在JavaEE web项目中我们需要使用servlet的API,但是Tomcat中已经提供这个jar,我们在编译和测试的时候需要使用这个api,但是部署到tomcat的时候,如果还加入servlet构建就会产生冲突,这个时候就可以使用provided。

runtime:测试和运行有效。

test:测试有效。

system:与本机系统关联,编译和测试时有效。

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

Maven依赖冲突

每个显式声明的类包都会依赖于一些其它的隐式类包,这些隐式的类包会被maven间接引入进来,因而可能造成一个我们不想要的类包的载入,严重的甚至会引起类包之间的冲突。

要解决这个问题,首先就是要查看pom.xml显式和隐式的依赖类包,然后通过这个类包树找出我们不想要的依赖类包,手工将其排除在外就可以了。 例如:

<exclusions>
<exclusion>
<artifactId>unitils-database</artifactId>
<groupId>org.unitils</groupId>
</exclusion>
</exclusions>

最权威最简明的maven 使用教程的更多相关文章

  1. Maven使用教程

    一.Maven介绍 我们在开发项目的过程中,会使用一些开源框架.第三方的工具等等,这些都是以jar包的方式被项目所引用,并且有些jar包还会依赖其他的jar包,我们同样需要添加到项目中,所有这些相关的 ...

  2. Maven插件开发教程收集(待实践)

    官方教程:http://maven.apache.org/plugin-developers/index.html http://blog.csdn.net/csfreebird/article/de ...

  3. Linux安装maven(详细教程)

    一.简介 Maven是意第绪语,意思是“知识的积累者”,最初是为了简化Jakarta Turbine项目中的构建过程.有几个项目,每个项目都有自己的Ant构建文件,所有项目都略有不同.JAR已检入CV ...

  4. [Maven]Maven入门教程

    概念 Maven是什么 Maven 是一个项目管理工具.它负责管理项目开发过程中的几乎所有的东西. 版本 maven有自己的版本定义和规则 构建 maven支持许多种的应用程序类型,对于每一种支持的应 ...

  5. Maven代理教程

    明确代理服务器地址及端口,比如proxy.supremehover.com:8080 找到maven目录下的conf\settings.xml并打开,在proxies节点下添加proxy <pr ...

  6. maven入门教程

    一.Maven 是什么? Maven 英文名称:专家,由名字可见,这个工具野心非常大.有人说他是"构建工具",一个用来把源代码构建成可发布的构件的工具.也有人说是项目管理工具. 官 ...

  7. Maven基础教程

    更多内容请参考官方文档:http://maven.apache.org/guides/index.html 官方文档很详细,基本上可以查找到一切相关的内容. 另外,快速入门可参考视频:孔浩的maven ...

  8. Idea构建Maven项目教程

    Idea构建Maven项目,以及其中遇到的坑,及解决方案 步骤一:配置Idea的maven插件 步骤二:创建maven项目 file-->new-->project 下一步,设置group ...

  9. Maven安装教程

    一.安装Maven及配置环境变量 1.Maven官网地址:http://maven.apache.org/download.cgi  下载apache-maven-3.5.0-bin.zip文件 2. ...

随机推荐

  1. next v5升级到next v7需要注意的地方

    title: next v5升级到next v7需要注意的地方 date: 2020-03-04 categories: web tags: [hexo,next] 大部分的设置都是一样的,但有一些细 ...

  2. 2018ACM上海大都会赛 F Color it【基础的扫描线】

    题目:戳这里 题意:有n*m个点全为白色,q个圆,将q个圆内所有的点都染成黑色,问最后剩下多少白色的点. 解题思路:每一行当做一个扫描线,扫描所有的圆,记录每一行在圆中的点即可,O(n*q). 附ac ...

  3. Leetcode(4)-两个排序数组的中位数

      给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 示例 1: nums1 = [1, 3] ...

  4. Win10 Nodejs搭建http-server注意点

    下载安装,并用命令行查看版本:如果提示输入命令找不到等,可能是没有安装成功,或者是环境变量引起的: 如果在提示安装不成功可能是win10权限问题,最好使用管理员模式运行cmd,再用cmd命令打开安装文 ...

  5. javascript & call & apply & bind & new

    javascript & call & apply & bind & new Javascript call() & apply() vs bind()? ht ...

  6. Google & Chrome console & text adventure game

    Google & Chrome console & text adventure game Google's text adventure game https://www.googl ...

  7. vue & components & props & methods & callback

    vue & components & props & methods & callback demo solution 1 & props & data ...

  8. Enums & JavasScript & TypeScript

    Enums & JavasScript & TypeScript ES6 & TS https://www.typescriptlang.org/docs/handbook/e ...

  9. npm & private npm service & nrm & nvm

    npm & private npm service & nrm & nvm npm server # nrm https://www.cnblogs.com/xgqfrms/t ...

  10. py django

    创建项目 $ django-admin startproject server 运行项目 $ cd server $ python manage.py runserver 创建一个模块 $ pytho ...