现在的位置: 首页 > 综合 > 正文

《Maven实战》

2018年04月10日 ⁄ 综合 ⁄ 共 5446字 ⁄ 字号 评论关闭

    适合Java程序员管理Java项目。几乎成为了所有Java开源项目的标配。都是用maven进行管理项目。例如阿里巴巴和淘宝。

【开源工具】【自动化构建】【依赖管理】【规范高效地管理Java项目】

    Maven的安装、配置和基本使用方法。

    坐标和依赖、Maven仓库、生命周期和插件、聚合与继承等Maven核心概念。

    系统性地阐述了使用Nexus建立私服、使用Maven进行测试、使用Hudson进行持续集成、使用Maven构建Web应用、Maven的版本管理、Maven的灵活构建、生成项目站点、和Mavenm2eclipse插件等实用性较强的高级知识。

 

    陡峭的学习曲线和匮乏的文档,在博客中撰写文章。

——Maven中文社区。

1:简要介绍

2-3:入门介绍

4:背景案例

5-8:核心概念,坐标,依赖,仓库,生命周期,插件,继承,多模块聚合。

9:使用Nexus建立私服,实际工作中使用maven

10-16:高级且离散的知识点。测试,持续集成和HudsonWeb项目与自动化部署、自动化版本管理、智能适应环境差异的灵活构建,站点生成,eclipse插件。

17-18:如何编写ArcheypeMaven插件。

1 Maven简介

何为Maven,为什么需要Maven

    跨平台的项目管理工具。Maven主要服务于基于Java平台的项目构建、依赖管理项目信息管理

 

1.1.1 何为构建

    构建(build)是每一位程序员每天都在做的工作。从源码库中签出最新的源码,然后进行单元测试。测试覆盖率报告。

    除了编写源代码,每天有相当一部分时间花在了编译、运行单元测试、生成文档、打包和部署等繁琐且不起眼的工作上,这就是构建。有人用软件的方法让这一系列工作完全自动化、使得软件的构建像全自动流水线一样,只需要一条简单的命令,所有烦琐的步骤都能够自动完成,很快就能得到最终结果。

 

1.1.2 Maven是优秀的构建工具

    自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。

        Maven是跨平台的。

    我们一直在不停地寻找避免重复的方法:设计的重复,编码的重复,文档的重复,当然还有构建的重复。

——Maven最大化地消除了构建的重复,抽象了构建生命周期,并且为绝大部分的构建任务提供了已经实现的插件。

——自动化执行遵循Maven的约定编写好的测试用例。

——帮助我们标准化构建过程,所有项目的构建命令都是简单一致的。避免了不必要的学习成本。有利于促进项目团队的标准化。

    优秀的流行的构建工具:自动化构建,抽象构建过程,提供构建任务实现,跨平台对外提供一致的操作接口。

 

1.1.3 Maven不仅仅是构建工具

    还是一个依赖管理工具和项目信息管理工具。它提供了中央仓库,能帮我们自动下载构件。

    开源的年代,几乎任何Java应用都会借用一些第三方的开源类库。通过依赖的方式引入到项目中来。随着依赖的增多,版本不一致、版本冲突、依赖臃肿等问题接踵而来。

        Maven提供一个坐标系统准确的定位每一个构件(artifact),通过一组坐标,Maven能够找到任何一个Java类库。有序管理依赖,解决繁杂的依赖问题。

        帮助我们管理原本分散在项目中各个角落的项目信息:项目描述,开发者列表,版本控制系统地址,许可证,缺陷管理系统地址。节省了大量寻找信息的时间。除了直接的项目信息,通过Maven自动生成的站点,以及一些已有的插件,我们还能够轻松获得项目文档、测试报告、静态分析报告、源码版本日志报告等非常具有价值的项目信息。

——Maven还为全世界的Java开发者提供了一个免费的中央仓库,在其中几乎可以找到任何的流行开源类库。

    通过Maven的衍生工具(如Nexus),我们还能对其进行快速地搜索。只要定位了坐标,Maven就能够帮我们自动下载。

        约定优于配置:Maven对于项目目录结构、测试用例命名方法等内容都有既定的规则。只要遵循这些成熟的规则,用户在项目间切换的时候就免去了额外的学习成本。

 

1.2 为什么需要Maven

    其他构建管理的解决方法:IDEMakeAnt

    使用脚本建立高度自定义的构建系统就像买组装PC,费时耗力结果也不一定好。虽然你可以享受从无到有的乐趣。

1.2.2 IDE不是万能的

    优秀的IDE可以大大提供开发效率,都提供了强大的文本编辑、测试甚至重构功能。

——IDE依赖大量的手工操作。编译、测试、代码生成等工作都是相互独立的,很难一键完成所有工作。手工劳动往往意味着低效,意味着容易出错。

——很难在项目中统一所有的IDE配置。

我们可以在IDE中方便地运行Maven执行构建。

 

1.2.3 Make

    最早的构建工具。强大在于:利用所有系统的本地命令。尤其是Linux系统中丰富的功能和强大的命令,帮助Make快速高效地完成任务。

Make语法格式的基本组成部分:

    一系列规则(rules),每一条规则又包括目标(Target)依赖(Prerequisite)和命令(Command

    但是由于Make将自己和操作系统绑定在一起,就不能实现跨平台的构建,这对于Java来说是很不友好的。Makefile语法对于空格或Tab问题。

 

1.2.4 Ant

    另一个整洁工具:Another Neat Tool。最早用来构建著名的Tomcat

        Ant是一个Java版本的Make,使用XML定义构建脚本。构建脚本:build.xml

    基本结构也是目标target,依赖depends,以及实现目标的任务。

        Ant是过程式的,开发者显式定义每一个目标以及要完成该目标所需要执行的任务。针对每一个项目都要重新编写这一过程,隐含着大量的重复。

        Maven是声明式的,项目构建过程和过程各个阶段所需的工作都由插件实现,并且大部分插件都是现成的,开发者只需要声明项目的基本元素,Maven就执行内置的完整的构建过程。

 

        Ant是没有依赖管理的。可以通过Ivy管理依赖。而Maven内置了依赖管理,而且有一个Java开源软件包的中央仓库。

 

1.2.5 不要重复发明轮子

       Jar包的版本错误和版本冲突问题。这些依赖需要一个框架或者系统来进行管理。

Ant打包:

       创建目录、复制文件、编译源代码、使用一些任务(copydir/fileset/classpath/ref/target)、打包(jar/zip/war

 

1.3 Maven与极限编程

       极限编程:拥抱变化。

Maven的特点:

       Maven暴露一组一致、简洁的操作接口

       与版本控制系统结合

       自动生成项目报告

       测试驱动开发(测试是Maven生命周期重要组成部分)

       十分钟构建:清理、编译、测试、打包、部署、得到产品。

       持续集成:强调项目以很短的周期集成最新的代码。CI的前提是源码管理系统和构建系统。

       富有信息的工作区。

自动化构建系统:

       节省很多手动的测试时间。

       建议:尽早使用构建系统,集成团队的代码。

 

Maven核心插件:

       都设定了稳定版本。

 

 

 

2 Maven的安装和配置

20140918

2.1 Windows上安装Maven

    笔记本电脑中:

 

 

 

2.2 在基于UNIX的系统上安装Maven

    略过

 

 

2.3 安装目录分析

2.3.1 M2_HOME

bin:

       mvn运行的脚本,这些脚本用来配置Java命令,准备好ClassPath和相关的Java系统属性,然后执行Java命令。

       mvnDebug文件中只是比mvn多了MAVEN_DEBUG_OPTS选项。

       m2.conf文件是classworlds的配置文件。

boot:

只有一个文件plexus-classworlds-2.5.1.jar。类加载器。

conf:

settings.xml,全局定制Maven的行为。

lib:

包含Maven运行时需要的Java类库。



2.3.2 ~/.m2

该目录下的repository仓库:Maven本地仓库。

Maven根据一套规则来确定任何一个构件在仓库中的位置。



2.4 设置HTTP代理

2.5 安装m2eclipse

2.7 Maven安装最佳实践

    运行Maven命令实际上是执行了Java命令。

    MAVEN_OPTS环境变量:Maven运行所需内存设置。-Xms
128m -Xmx512m

 

3 Maven使用入门

本章内容

编写POM,编写主代码,编写测试代码,打包和运行,使用Archetype生成项目骨架,m2eclipse简单使用。

3.1 编写POM
P46

POM,Project Object Model,项目对象模型、定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。

 

第一行:XML头,指定了该xml文档的板式和编码方式。

modelVersion指定当前POM模型的版本。

 

项目的基本的坐标:

——groupId定义项目属于哪个组。com.mycom.myapp

——artifactId当前Maven项目在组中的唯一ID

——version

 

让项目对象模型最大程度地与实际代码相独立。

POM稳定后,日常的Java代码开发基本不涉及POM的修改。

 

3.2 编写主代码

src/mian/java目录。

compile任务:将项目主代码编译至target/classes目录。

 

3.3 编写测试代码

src/test/java目录。

上述代码添加了依赖,自动下载junit-4.7.jar

中央仓库:http://repol.maven.org/maven2/

 

最后使用Junit框架的Assert类检查结果是否为正确的。

需要执行的测试的方法都应该以@Test进行标注。

 

执行测试之前,先自动执行项目主资源处理、主代码编译、测试资源处理、测试代码编译等工作。 

 

3.4 打包和运行

 

Maven主要的命令:mvn clean compile,mvn clean test,mvn clean package,mvn clean install

P53 生成可执行的jar文件。

 

3.5 使用Achetype生成项目骨架

我们称基本的目录结构和pom.xml文件内容为项目的骨架。

快速勾勒出项目骨架。

命令:mvn archetype:generate。实际上是在运行maven-archetype-plugin

 

3.6 m2eclipse简单使用

 

 

 

4章 背景案例

本章内容:

简单的账户注册服务。需求阐述。简要设计。小结。P63

 

4.1 简单的账户注册服务

 

4.2 需求阐述

4.2.1 需求用例

4.2.2 界面原型

4.3 简要设计

4.3.1 接口

4.3.2 模块结构

基于包名划分模块。

 

 

service包:系统的核心,封装了所有下层细节,对外暴露简单的接口。

这实际上是一个Facade模式(外观模式)。

web包:包含所有与web相关的内容,JSP,Servlet,web.xml等。

persist包:处理账户信息的持久化,包括增删改查。

 

 

 

 

 

5章 坐标和依赖

本章内容:【管理项目依赖】

什么是Maven坐标,坐标详解,account-email,依赖的配置,依赖范围,传递性依赖,依赖调解,可选依赖,最佳实践,小结。

 

Maven的一大功能是管理项目依赖。

依赖管理的底层基础:坐标。

 

5.1 何为Maven坐标

Maven坐标的元素包括groupIdartifactIdversionpackageingclassifier

Maven中央仓库地址:http://repol.maven.org/maven2

 

5.2 坐标详解 P71

——groupId:定义当前Maven项目隶属的实际项目。

一个实际项目往往被划分为很多模块。

——artifactId:定义实际项目中的一个Maven模块项目。

一般使用实际项目名作为前缀,以便区分。

——version

——packagingMaven项目的打包方式。

——classifier:该元素用来帮助定义构建输出的一些附属构件,比如nexus-indexer-2.0.0-javadoc.jar

不能直接定义项目的classifier,因为附属构件不是项目直接默认生成的,而是由附加的插件帮助生成的。

5.3 account-email

       熟悉该发送账户激活电子邮件模块的POM配置和Spring配置。

5.3.1 account-emailPOM

<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/maven-v4_0_0/xsd">

 

下图为导入到Eclipse后的界面:

scope:用来定义依赖范围。

 

5.3.2 account-email的主代码

5.4 依赖的配置

P80

5.5 依赖范围

P81

 

 

 

【上篇】
【下篇】

抱歉!评论已关闭.