• maven介绍

项目构建过程

eclipse只是开发工具,虽然提供了创建、编码、编译、测试、运行等功能,但并不是项目构建工具。

项目构建主要过程如下:

实际的项目构建过程要复杂繁琐的多。如果是一个独立的项目,使用人工去构建勉强可以接受。但如果一个项目由很多子模块组成,这时的构建过程就很繁琐痛苦,而且容易出问题。所以我们希望能有一个工具帮我们很方便的、自动化的完成构建工作。

项目依赖jar包的管理

项目中会用到各种框架、工具包,也就是项目中会添加依赖的jar包。由于可能会依赖很多jar包,而且每个jar包可能会有多个版本,而且某些jar包可能又会依赖其他jar包...这就造成了jar包管理的混乱,特别容易出错。

我们希望有一个工具可以帮助我们管理项目所依赖的jar包,特别是管理jar包的版本,避免出现混乱和错误

使用maven来解决

  • maven是apache组织下的一个开源项目
  • maven是项目管理工具,主要管理java语言编写的项目
  • maven可以有效的构建项目、管理项目的jar包依赖
  • maven遵从插件思想的设计,所有需要的各个功能由各个插件提供
  • maven具有跨平台、自动化、标准化等特点
  • maven可以独立完成整个项目的构建,也就是说可以单独使用maven。但项目开发和构建有很多步骤是重复的,所以一般在eclipse中使用maven插件,把项目开发和构建结合起来,用起来更加方便。
  • maven项目基本目录结构

  • maven项目坐标
<groupId>com.xxx</groupId>
<artifactId>hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

说明:

groupId:组织、公司或整个项目的唯一标识

artifactId:项目名称

version:项目版本

packaging:打包方式,也就是项目类型。jar表示普通Java项目,war表示web项目等

  •  中央仓库

全世界所有的maven项目都可以发布到中央仓库,中央仓库中的项目是公开的,可以任意引用,并且几乎所有的项目都提供了源码 。

发布到中央仓库的项目一般是一些组织或者公司的开源项目,发布的目的就是为了方便别的项目引用。而公司自己的商业项目等是不应该发布到中央仓库的。

当然并不能随意的就可以把项目发布到中央仓库,需要先申请,还有其他操作,具体用到的时候可以去网上搜教程。

  •   镜像

中央仓库的copy,可缓解中央仓库的下载压力,速度一般比中央仓库快

配置镜像:在.m2目录下 settinngs.xml中 <mirrors>下:

<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
  • 项目构建

一个maven项目从源代码状态到完成部署,要经历很多阶段(可以称为项目构建的生命周期),每个阶段由若干maven插件来完成,插件所完成的事情称为插件目标,插件目标的执行顺序是事先规定好的,当执行某个插件目标时,会自动的先执行前面的插件目标。

另外还有一个常用的插件目标clean,用来清除项目target下编译好的文件

  • 依赖管理

如果项目A使用了项目B中的类、接口等,则项目A依赖项目B(简写为A -> B)

  • 配置依赖

maven以配置的方式在pom.xml文件中管理项目的依赖

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
  • <dependencies>:用来管理项目的所有依赖
  • <dependency>:用来配置一个依赖
  • <groupId>:被依赖项目的坐标的groupId
  • <artifactId>:被依赖项目的坐标的artifactId
  • <version>:被依赖项目的坐标的版本
  • <scope>:此依赖的生命周期

依赖的生命周期(<scope>取值)

  • compile  编译、测试、运行时都会依赖,是默认值
  • test     编译、测试时依赖,运行时不依赖,如junit
  • provided 编译、测试时依赖,运行时不依赖,由运行环境提供,如servlet-api由tomcat提供
  • runtime  编译时不依赖,测试、运行时依赖,如mysql-connector-java-5.1.37
  • 依赖传递

maven项目之间的依赖可以传递

A -> B,B -> C,那么A -> C

依赖传递并不是绝对的,跟依赖的scope有关。

如果B -> C的scope是compile、runtime时,A -> C,否则不依赖。

并且A -> C的scope和B -> C的scope 一致。

  • 依赖传递的冲突和解决

通过直接配置或者依赖传递而获得的依赖中如果有同一个项目的多个不同的版本,此时就会产生版本冲突。解决方法是指定优先级规则,优先级规则如下:

 深度最小优先

直接配置的依赖深度为1,传递依赖时每间隔一个项目深度加1

A -> C 1.0 的深度为2

A -> C 2.0 的深度为3

根据深度最小优先原则,A -> C 1.0

最先配置优先

根据深度最小优先原则无法解决时,最先配置的版本优先,即A -> C 1.0

  • 主动排除传递的依赖

可以通过配置主动让项目排除某个传递的依赖

<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jstl-impl</artifactId>
<version>1.2</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
</exclusion>
</exclusions>
</dependency>
  • 继承

一个较大的maven项目可以拆分为若干个maven子项目(可以称为模块)。一般都会创建一个parent模块让各个子模块继承,在parent模块中统一管理各个依赖的版本。

  •  创建parent模块

创建maven项目时指定<packaging>为pom即可创建一个pom类型的项目,可作为parent模块。

  • 管理依赖的版本

管理依赖的版本并不意味着parent项目本身依赖这些jar包。

<dependencyManagement>
<dependencies>
<!-- mysql驱动包依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency> <!-- c3p0依赖 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5</version>
</dependency> <!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency> </dependencies>
</dependencyManagement>
  • 创建子项目

只需要在创建maven项目时填写parent相关信息

子项目在配置依赖时不用配置依赖的版本,依赖的具体版本由父项目管理。同时子项目也不用配置插件信息,都由父项目来管理

  • 管理其他插件版本

如可以指定JDK版本

<build>
<plugins>
<!-- 指定JDK编译版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
  • 聚合

如果项目较大,通常的做法就是把项目切分成若干个模块,并由一个父模块来管理依赖、插件等的版本。各个模块会分别打包并安装到仓库,而且通常由某个子模块作为主模块并调用其他子模块,项目部署运行时运行这个主模块。

  • 聚合方式1

子模块使用Maven Module的方式创建,父子模块之间有很强的包含关系,并且子模块创建在父模块目录下

工作空间中目录结构如下:

  •  聚合方式2

直接以Maven Project(普通方式)的方式创建各个模块,只要正确指定父子关系以及模块间的依赖关系,这些模块在逻辑上就是聚合的。

这时的子模块目录和父模块目录同级,并且父模块pom.xml中没有<modules>,除此之外和“聚合方式1”几乎都一样,这两种聚合方式都经常使用。

关于maven的使用总结的更多相关文章

  1. 【分享】标准springMVC+mybatis项目maven搭建最精简教程

    文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...

  2. 理解Maven中的SNAPSHOT版本和正式版本

    Maven中建立的依赖管理方式基本已成为Java语言依赖管理的事实标准,Maven的替代者Gradle也基本沿用了Maven的依赖管理机制.在Maven依赖管理中,唯一标识一个依赖项是由该依赖项的三个 ...

  3. 【微框架】Maven +SpringBoot 集成 阿里大鱼 短信接口详解与Demo

    Maven+springboot+阿里大于短信验证服务 纠结点:Maven库没有sdk,需要解决 Maven打包找不到相关类,需要解决 ps:最近好久没有写点东西了,项目太紧,今天来一篇 一.本文简介 ...

  4. 安装eclipse的maven插件

    我们团队用maven来管理项目需要的库文件,其实以前都没听过maven,第一次接触这个,师兄要我直接去装下这个,开始以为还挺简单的,没想到中间遇到了一些小麻烦,现在把我成功安装maven的过程分享下, ...

  5. MAVEN学习-第一个Maven项目的构建

    MAVEN安装成功之后就可以进行项目的构建和管理了: 为什么要用maven进行项目的构建和管理? 对于初学者来说一个最直接的也是最容易里的优点在于JAR包的管理,相对于以前开发一个项目的时候我们需要用 ...

  6. Maven 代理设置

    在maven的安装目录下 %MAVEN_HOME%/conf/setting.xml 中进行设置 <proxies>    <!-- proxy     | Specificatio ...

  7. spring maven pom.xml设置

    spring pom.xml设置 <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...

  8. maven依赖查询地址

    http://search.maven.org/#search%7Cga%7C1%7C

  9. maven 中snapshot版本和release版本的区别

    maven中的仓库分为两种,snapshot快照仓库和release发布仓库.snapshot快照仓库用于保存开发过程中的不稳定版本,release正式仓库则是用来保存稳定的发行版本.定义一个组件/模 ...

  10. Maven多模块,Dubbo分布式服务框架,SpringMVC,前后端分离项目,基础搭建,搭建过程出现的问题

    现互联网公司后端架构常用到Spring+SpringMVC+MyBatis,通过Maven来构建.通过学习,我已经掌握了基本的搭建过程,写下基础文章为而后的深入学习奠定基础. 首先说一下这篇文章的主要 ...

随机推荐

  1. 一、REACT概述

    1.前端/react概述 <从零react> 1.前端工 程概述 Web跨平台.跨浏览 器的应用开发场景 网页浏览器(Web Browser) 通过 CLI 指令去操作的 Headless ...

  2. ACM-Divide Tree

    题目描述:Divide Tree   As we all know that we can consider a tree as a graph. Now give you a tree with n ...

  3. Docker 搭建开源 CMDB平台 “OpsManage” 之 Redis

    整体结构如下图   先来在 172.16.0.200 安装docker-ce (新)或 docker-io(旧)      0: Docker-ce  (新版本  Docker version 17. ...

  4. js模式-观察者模式

    // 主题,接收状态变化,触发每个观察者 class Subject { constructor() { this.state = 0 this.observers = [] } getState() ...

  5. Python LMDB的使用

    在python中使用lmdb linux中,可以使用指令 pip install lmdb 安装lmdb包. ---- lmdb 数据库文件生成 增 改 删 查 1.生成一个空的lmdb数据库文件 # ...

  6. Http协议Get与Post请求

    摘要:https://blog.csdn.net/kebi007/article/details/103059900 不就是get拼接url,post传body,get限制字符串长度吗! 请求缓存:G ...

  7. HDFS 中文件操作的错误集锦

    问题1  Java ApI执行追加写入时:无法写入 问题描述: ①当前数据节点无法写入,②追加文件需要再次请求. 问题2  命令行执行追加写入时:无法写入 问题描述: 当前数据节点无法写入 问题3   ...

  8. Java IO 乱码

    InputStreamReader isr = new InputStreamReader(new FileInputStream("./test/垃圾短信训练集80W条.txt" ...

  9. UVALive 5913 字典树

    先输入n个字符串的字典,每个字符串的前缀+后缀可以组成新的合法字符串,但肯定是有重复的,问从给定的字符串,生成的所有可能的字符串为多少个 把前缀和后缀压入字典树,达到前缀和后缀的去重,首先的总和即为前 ...

  10. 第二届中国“AI+”创新创业大赛完美收官,京东云赛道硕果累累

    聚焦南京产业发展核心诉求,京东云携手南京政府构建的"平台+生态+赋能"的产业体系,搭建产业创新云平台,以人工智能产业创新链要素补齐为核心,围绕"研.产.供.销.服&quo ...