Maven学习笔记

来源:互联网 发布:淘宝细节认证主图大小 编辑:程序博客网 时间:2024/06/08 13:37

原文链接:http://hedatou.com/archives/maven_learning_journal.html

什么是Maven

Maven是一个基于Java平台的项目管理工具,提供项目构建、依赖管理和信息管理等功能。而我主要关注的是它抽象出来的构建流程,以及依赖管理功能。

为什么要使用Maven

作为开发者每天都在重复这个过程:编写源代码、编译、运行单元测试、打包、部署、启动容器测试…虽然有IDE的支持,让我们每个步骤实际上只需要点一下按钮,但Maven提供给了我们一个标准规范的工作流,只需要一个命令就会执行完整的流程。在快速迭代的敏捷开发中,自动化工具至关重要。


刚参加工作时热衷于MyEclipse,就是因为喜欢用那个部署按钮,而现在Maven提供了更加强大的功能。

依赖管理是核心功能,众所周知,做Java项目总会依赖一堆的framework、类库,lib文件夹下堆着各种jar包,甚至同一个库还有不同的版本。手工管理依赖是非常麻烦的,甚至是不可能完成的任务,而Maven极大的简化了这个过程,只需要声明依赖,Maven会自动处理依赖的依赖。

没有Maven的话,我们还需要到每个framework官网上去下载最新的发布包,再去一个一个下载它们的依赖项,而Maven直接提供了一个开源中央仓库,只需要声明一下,Maven会自动下载。

Maven基础

先来看一下Maven的默认布局:

项目根路径下必须有一个pom.xml定义这个项目,/src/main/java是源码路径,/src/main/resources是properties、xml等配置文件的路径,/src/test是单元测试相关的路径,/target是编译后的字节码文件路径。

pom.xml是Maven项目的核心配置文件,定义了项目的基本信息和依赖关系。使用mvn clean package命令,顺序执行编译、单元测试、打包的过程。

依赖管理

Maven使用坐标来定义某个依赖项,使用groupId、artifactId、version这3个元素就可以定位,比如说,org.springframework:spring-core:3.0.5.RELEASE 就定位到了spring框架core模块3.0.5.RELEASE版这个jar包。

每个依赖可以定义范围区间,常用的是compile、test、provided、runtime,其中compile是默认的,表示编译、测试、运行的所有范围,都需要这个依赖项,test表示只在执行单元测试代码时才引入这个依赖,使用这个范围可以不会再发生部署包中还有junit的问题了,provided值得说一下,典型的例子是servlet-api,编译时没它就报错,部署到tomcat了有它还会出问题,使用provided就好了,表示容器提供了这个包,只在编译时引入即可,运行和部署时就不需要了,runtime的典型例子就是mysql jdbc驱动。

举个例子,我在pom.xml中只声明了两个依赖:spring-context-support和javax.mail,下面是Maven解析出的依赖树:

最终包括这些jar包:

spring-context-support-3.0.5.RELEASE.jar
spring-bean-3.0.5.RELEASE.jar
spring-context-3.0.5.RELEASE.jar
spring-aop-3.0.5.RELEASE.jar
aopalliance-1.0.jar
spring-expression-3.0.5.RELEASE.jar
spring-asm-3.0.5.RELEASE.jar
spring-core-3.0.5.RELEASE.jar
commons-logging-1.1.1.jar
mail-1.4.1.jar
activation-1.1.jar

一共11个,如果人工管理依赖的话,想想看,该有多麻烦……

Web项目

web项目的布局稍有不同,/src/main下多了个webapp,用来放css、js、image资源的,以及最重要的WEB-INF和web.xml

根据springside的最佳实践,自己开发时,用jetty-maven-plugin插件非常方便。首先在pom.xml中定义该插件,然后使用mvn jetty:run命令启动jetty,边修改边看结果时,可以在控制台敲回车触发reload。

1
2
3
4
5
6
7
8
<plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>7.4.5.v20110725</version>
    <configuration>
        <reload>manual</reload>
    </configuration>
</plugin>

如果需要实现Web容器的自动化部署,可以使用更强大的Cargo插件,可以一键在JBoss、Glassfish、Tomcat上部署并重启应用。

总结

本文是基于对《Maven实战》一书阅读后的笔记总结,书中大量介绍了Maven的实现细节,其实对于一个工具来说,掌握使用方式便足矣,实现细节并不是特别重要。看过本书的前半本,包括坐标和依赖、生命周期和插件、聚合与继承几个章节以后,便对Maven的总体思想有一个认识了,后边的章节只是对一些实际应用的操作技巧而已。

总的来说,Maven是一个很好上手的工具,没有传言中的那么复杂,希望它能为我日后的工作提升一些生产力。

0 0
原创粉丝点击