也许是本人不才,初识Maven时,被各种不明所以的教程搞得一头雾水,而在后来的使用中,我发现Maven大部分功能没有想象的那么困难。

本片文章面向Maven初学者,希望能让其以最快的速度了解Maven并享受到它所带来的一系列好处。

[一个简单的问题]

在进行讲解前,先提问一个简单的问题。
    假如你正在Eclipse下开发两个Java项目,姑且把它们称为A、B,其中A项目中的一些功能依赖于B项目中的某些类,那么如何维系这种依赖关系的呢?
    笔者在使用Maven前是这样做的,将B项目打包为jar,并在A项目的Library下导入B的jar文件。
    这样做有着很明显的缺点:
        1.如果在开发过程中,发现B中的bug,则必须重新将B打包并对A项目进行重编译操作
        2.在协同开发A项目时,为了保证其能够正常运行,要么选择将B打包入A中,要么选择将B一样发布出去并告知开发者使用方法。显然这两个方法都不太好,前者可能造成资源浪费(比如开发者可能正在开发依赖B的其它项目,B已经存储到本地了),而后者则会为项目正常运行带来风险(一旦把工作交给人工注定会带来一定的失败率)。
    因此,这样手动的控制项目间依赖关系显然是一种‘拙劣’的方法。

[Maven介绍]

依据笔者看来,Maven的核心功能便是合理叙述项目间的依赖关系。
    所有的Maven项目包含着一个名为pom.xml的文件,在文件中记录着自己的<groupId><artifactId><version>等字段,这些字段在创建Maven项目时填写,Maven会依据它们来定位到该项目。

在pom中的另一个关键标签是<dependencies>,该标签下可以包含若干个<dependency>标签,而<dependency>下则是上面介绍的<groupId><artifactId><version>等依赖字段,它们确定着一个唯一的项目版本。

一个典型的pom.xml[来自项目luajava]:

<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>org.keplerproject</groupId>
<artifactId>luajava</artifactId>
<version>1.1</version>
<packaging>jar</packaging> <name>luajava</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

[Maven库]

以刚才的A、B项目为例,在A项目的pom文件中写入<dependency>关联B项目,Maven会在工作区中找到B项目,并创建依赖。此时A项目可以直接访问到B项目中的类资源,而且对A调试时依然会击中B项目中设置的断点。
    除去工作区的依赖关联外,Maven也可以关联一个远端镜像中的项目,在默认情况下,如果工作区中没有对应的项目记录,Maven会连接到中心仓库查找,如果找到,它会把项目下载到本地库中(Windows中本地库位于用户文档的.m2目录下),并自动设置关联。这是一个十分便利的特性,在我们需要额外jar包支持时,不再需要进行手动的下载和引入,我们仅需要将需要项目对应的依赖字段粘贴到pom的合适位置,剩下的交给Maven完成即可。

[其它特性]

1.镜像源

很明显,Maven中心仓库负载比较大,而且不在国内,因此速度非常慢,有时甚至会找不到依赖。因此,尤其是在小规模团队开发这种场合下,搭建一个Maven私服会极大的提升效率。这里推荐一个Maven镜像搭建工具:Nexus:http://www.sonatype.org/nexus/
使用它可以很快速方便的搭建私有Maven镜像源,之后在Maven的settings.xml里进行配置即可。

2.惰性下载src源码

在一些时候,我们需要参阅依赖项目的源文件,此时可以尝试直接双击class文件,如果Maven镜像源中存在源文件,会自动下载到本地,eclipse会自动加载并显示。

3.编译参数配置

笔者使用Eclipse Luna版,Maven默认的Java编译版本为1.5,我们可以在pom指定其编译版本,使其提升至1.7(参考luajava pom中的build标签);此外这些设置也会被诸如jenkins持续集成等自动化工具读取并进行恰当配置。

Maven通俗讲解的更多相关文章

  1. 5.7 Maven通俗讲解

    好的东西只适合ctry+c+v 原文地址:https://blog.csdn.net/shuzhe66/article/details/45009175 Maven通俗讲解 也许是本人不才,初识Mav ...

  2. 网络编程懒人入门(九):通俗讲解,有了IP地址,为何还要用MAC地址?

    1.前言 标题虽然是为了解释有了 IP 地址,为什么还要用 MAC 地址,但是本文的重点在于理解为什么要有 IP 这样的东西.本文对读者的定位是知道 MAC 地址是什么,IP 地址是什么. (本文同步 ...

  3. 通俗讲解:PoW共识机制与以太坊的关系、Ghost协议 及 PoS共识机制的变种---Casper

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  4. 验分享:CSS浮动(float,clear)通俗讲解

    经验分享:CSS浮动(float,clear)通俗讲解 很早以前就接触过CSS,但对于浮动始终非常迷惑,可能是自身理解能力差,也可能是没能遇到一篇通俗的教程. 前些天小菜终于搞懂了浮动的基本原理,迫不 ...

  5. Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解

        Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解 在Hadoop分布式环境下实现K-Means聚类算法的伪代码如下: 输入:参数0--存储样本数据的文本文件inpu ...

  6. CSS(6)---通俗讲解浮动(float)

    CSS(6)---通俗讲解浮动(float) CSS有三模块:盒子模型.浮动 .定位.上篇博客有讲到 盒子模型地址:CSS(5)---通俗讲解盒子模型 一.理解浮动 1.概念 概念 浮动可以理解为让某 ...

  7. CSS(7)--- 通俗讲解清除浮动

    CSS(7)--- 通俗讲解清除浮动 上一篇讲了CSS浮动 博客地址:CSS(6)---通俗讲解浮动(float) 一.理解清除浮动 1.为什么要清除浮动 我们前面说过,浮动本质是用来做一些文字混排效 ...

  8. CSS(8)---通俗讲解定位(position)

    CSS(8)---通俗讲解定位(position) CSS有三种基本的定位机制: 普通流.浮动.定位.前面两个之前已经讲过,详见博客: 1.CSS(5)---通俗讲解盒子模型 2.CSS(6)---通 ...

  9. 通俗讲解python__new__()方法

    目录 通俗讲解python__new__()方法 引子: 小结: 通俗讲解python__new__()方法 转载于别人的博客https://blog.csdn.net/sj2050/article/ ...

随机推荐

  1. how tomcat works 读书笔记(二)----------一个简单的servlet容器

    app1 (建议读者在看本章之前,先看how tomcat works 读书笔记(一)----------一个简单的web服务器 http://blog.csdn.net/dlf123321/arti ...

  2. android 数据重构(仿淘宝浏览记录,足迹)

    数据结构 ->数据重构 原因 处理这个数据的主要原因是,后台服务器返回的数据格式在ios那边因为其控件可以对数据进行分区显示,可以直接处理,而在android上我们显示控件就是listview, ...

  3. 【面试笔试算法】Problem 7: 补提交卡(hiho题库)

    时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho给自己定了一个宏伟的目标:连续100天每天坚持在hihoCoder上提交一个程序.100天过去了,小Ho查看自己的提交 ...

  4. 新版MATERIAL DESIGN 官方动效指南(一)

    Google 刚发布了新版Material Design 官方动效指南,全文包括三个部分:为什么说动效很重要?如何制作优秀的Material Design动效及转场动画,动效的意义.新鲜热辣收好不谢! ...

  5. 【49】java内部类剖析

    什么是内部类: 定义在其他类(outer class)中的类被称作内部类.内部类可以有访问修饰服,甚至可以被标记为 abstract 或 final. 内部类与外部类实例有特殊的关系,这种关系允许内部 ...

  6. 和菜鸟一起学linux之initramfs方式启动

    关于initramfs initramfs在编译内核的同时被编译并与内核连接成一个文件,它被链接到地址__initramfs_start处,与内核同时被加载到ram中.initramfs被解析处理后原 ...

  7. java的finalize方法使用

    1. finalize的作用 finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法. finalize()与C++中的析构函数 ...

  8. angularjs指令中的compile与link函数详解

    这篇文章主要介绍了angularjs指令中的compile与link函数详解,本文同时诉大家complie,pre-link,post-link的用法与区别等内容,需要的朋友可以参考下   通常大家在 ...

  9. JavaScript 对象分类

    参考自W3School:JavaScript对象主要有三类. 一:JavaScript核心对象是ECMAScript标准定义好的一些对象与函数,在JavaScript语言中可以直接使用.主要常用有如下 ...

  10. 用xml还是json

    1.定义介绍 (1).XML定义 扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允 ...