• 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. Essay写作没逻辑不要慌,掌握这几点即可

    今天文章的内容,真的是很多很多留学生的最大的问题,没有之一:逻辑.是的,你没有看错,也不用惊讶.大家的essay写作得分不高,很多时候不是因为语言问题.排除很多细节表达的不足,更让教授头疼的居然是:内 ...

  2. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-refresh

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  3. exctern C

    在C++中调用C语言 因为C++扩展了函数重载.编译时会将函数名修改,所以直接条用会出错. #ifdef __cplusplusextern "C" {#endif // __cp ...

  4. 大数据高可用集群环境安装与配置(09)——安装Spark高可用集群

    1. 获取spark下载链接 登录官网:http://spark.apache.org/downloads.html 选择要下载的版本 2. 执行命令下载并安装 cd /usr/local/src/ ...

  5. apache2+django+virtualenv 服务器部署实战

    目录 基本配置 配置python环境 安装 python.pip 安装 virtualenv 配置python虚拟环境 配置 apache2 安装 apache2 安装 mod-wsgi 服务 部署d ...

  6. 对python中元类的理解

    1. 类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍然成立: >>> class ObjectCreator(object): ...

  7. JDBC批处理方法

    每次新建Connection的时候相当于建了一座桥,每次一辆车(PreparedStatement)运送货物(ResultSet)成本太高! 每次都建立网络连接的时间远远大于本地的时间,为了处理大量的 ...

  8. Java IO 乱码

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

  9. oo第四单元及课程总结

    一.第四单元作业总结 第四单元有两次作业,第十三次作业是实现一个UML类图解析器,可以通过输入一些查询指令来查询一些类图的信息.程序的主干部分已经提供,我们的任务就是实现给出的接口,过程并不繁琐.第十 ...

  10. git push 现有代码到一个新的分支

    git push origin HEAD:task/xxx-test-local git push的一般形式为 git push <远程主机名> <本地分支名>  <远程 ...