使用Maven构建Java项目

最近的工作是,在build过程中,查看项目内的依赖信息,例如文件A依赖文件B。
针对Java项目,常见的构建工具有Ant、Maven、Gradle,由于对Maven较为熟悉一点,因此就先用Maven切入。

Maven的简介

Maven是Apache下的一个纯Java开发的开源项目,它是一个项目管理工具,可以使用Maven对Java项目进行依赖管理和构建。

依赖管理

依赖管理即是指——对项目所有依赖的jar包进行规范化管理。

传统项目的依赖管理

传统的项目工程要管理所依赖的jar包完全靠人工进行,程序员从网上下载jar包添加到项目工程中,例如程序员手工将Hibernate、Struts2、Spring的jar添加到工程中的WEB-INF/lib目录下。

手工拷贝jar包添加到工程中的问题是:
1、没有对jar包的版本统一管理,容易导致版本冲突。
2、从网上找jar包非常不方便,有些jar包找不到。
3、jar包添加到工程中会导致工程过大。

Maven项目的依赖管理

Maven项目管理所依赖的jar包不需要手动向工程添加jar包,只需要在pom.xml(Maven工程的配置文件)添加jar包的坐标,即可自动从maven仓库中下载jar包、运行。

使用Maven依赖管理添加jar的好处是:
1、通过pom.xml文件对jar包的版本进行统一管理,可避免版本冲突。
2、Maven团队维护了一个非常全的maven仓库,里边包括了当前使用的jar包,Maven工程可以自动从maven仓库下载jar包,非常方便。

构建

项目构建是一个项目从编写源代码到编译、测试、运行、打包、部署、运行的过程。

Maven项目构建过程:
Maven将项目构建的过程进行标准化,每个阶段使用一个命令完成。

使用maven的好处

除了依赖管理和一步构建外,使用Maven还有另外两个好处。
1、跨平台,可在window、linux上使用。
2、Maven遵循规范开发有利于提高大型团队的开发效率,降低项目的维护成本。

Maven的使用

下载Maven

https://maven.apache.org/download.cgi 下载Maven最新版,需要注意下该页面System Requirements中的JDK要求。
解压到本地,在环境变量中添加MAVEN_HOME,值为Maven的安装目录,在Path中添加%MAVEN_HOME%\bin
打开cmd,执行mvn -v命令检查是否安装成功。

配置Maven

Maven仓库

Maven的工作需要从仓库下载一些jar包,例如本地的项目A、项目B等都会通过Maven工具从远程仓库(可以理解为互联网上的仓库)下载jar包并存储在本地仓库(即本地文件夹),当第二次需要此jar包时则不再从远程仓库下载,因为本地仓库已经存在了,可以将本地仓库理解为缓存,有了本地仓库就不用每次从远程仓库下载了。

1、本地仓库
用来存储从远程仓库或中央仓库下载的插件和jar包,项目使用一些插件或jar包,优先从本地仓库查找。
默认本地仓库位置在 ${user.dir}/.m2/repository${user.dir}表示windows用户目录。

2、远程仓库
如果本地需要插件或者jar包,本地仓库没有,默认去远程仓库下载。
远程仓库可以在互联网内也可以在局域网内。

3、中央仓库
在Maven工具中内置一个远程仓库地址http://repo1.maven.org/maven2 ,它是中央仓库,服务于整个互联网,由Maven团队自己维护,里面存储了非常全的jar包,它包含了世界上大部分流行的开源项目构件。

配置本地仓库

在任意盘符下新建一个目录作为Maven的本地仓库,例如命名为LocalWarehouse。
然后在Maven的安装目录下找到conf文件夹下的settings.xml配置文件,打开此文件配置本地仓库的路径。
查找下面这行代码:

<localRepository>/path/to/local/repo</localRepository>

localRepository节点默认是被注释掉的,需要把它移到注释之外,并修改为:

 <localRepository>D:\software\LocalWarehouse</localRepository> 

如图:

配置镜像

将Maven镜像路径设置为阿里镜像,以便下载速度快。
查找以下代码:

<mirror>
      <id>mirrorId</id>
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
</mirror>

这一段也是在注释中的,需要将其放到注释外,可以复制出去,修改为以下代码:

<mirror>
      <id>nexus-aliyun</id>
      <mirrorOf>*</mirrorOf>
      <name>Nexus aliyun</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

如图:

创建Maven项目

使用Intellij创建Maven项目。首先在Intellij中设置新项目的Maven配置,File-->Other Settings-->Settings for New Projects。

指定本地Maven的安装目录和settings.xml位置。

再创建Maven项目:
New-->Project-->选择Maven-->Next-->输入GroupId,ArtifactId-->Next-->输入Project location-->Finish。

Maven项目的目录结构

在 Maven 项目的根目录下,有如下必要的目录结构:

  • src
    • main
      • resources「存放项目资源文件」
      • java 「存放项目的.java文件」
    • test
      • resources「存放一些资源文件」
      • java 「存放测试的.java文件」
    • target 「目标文件输出位置,例如.class、.jar、.war文件」
  • pom.xml 「maven项目核心配置文件」

构建命令

Maven命令列表
mvn archetype:generate 创建Maven的普通Java项目
mvn clean 清除maven生成的target目录
mvn compile 编译源代码,一般编译模块下的src/main/java目录。
mvn test 测试命令,执行src/test/java/下junit的测试用例
mvn package 项目打包工具,会在模块下的target目录生成jar或war等文件
mvn install 将打包的jar/war文件复制到本地仓库中,供其他模块使用
mvn deploy 将打包的文件发布到远程参考,提供其他人员进行下载依赖
mvn eclipse:eclipse 将项目转化为Eclipse项目
mvn dependency:tree 打印出项目的整个依赖树

这些命令实际上都由相应的Maven插件来完成。

构建Maven项目

可以利用Intellij IDE来对Maven项目进行管理和构建。

或者使用命令行运行Maven命令,首先定位到Maven项目的目录,也就是项目的pom.xml文件所在的目录。

分析构建日志

此次构建的项目为开源项目depends,执行命令mvn install -X(参数-X表示显示Maven允许的debug信息),并将输出重定向到文本。发现构建日志中主要包含以下内容:

1.  运行环境信息

2.  maven初始化信息

3.  项目的报错或警告信息

4.  REACTOR BUILD PLAN
    包含此次maven命令的任务以及build lifecycle,由于执行的命令为mvn install,故task为install。
    
5.  PROJECT BUILD PLAN
    执行install命令前,需要完成的一系列操作,而这些操作需要绑定相应的maven插件。
    罗列所需要的插件和插件的配置信息(读取pom.xml的<build>中的<plugin>,如果没有进行配置,则采用默认配置),配置中均带有参数。
    注意,第5部分只是一些配置信息,真正的执行在第7部分。
5.1 maven-resources-plugin:resources
    处理源资源文件,一般情况下将src/main/resources下的文件复制到target/classes下。
5.2 maven-compiler-plugin:compile
    编译源文件,一般情况下将src/main/java下的源代码编译成功后放在target/classes下。
5.3 maven-resources-plugin:testResources
    处理测试资源文件,一般情况下将src/test/resources复制到target/test-classes下。
5.4 maven-compiler-plugin:testCompile
    编译测试源文件,一般情况下将src/test/java下的源代码编译成功后放在target/test-classes下。
5.5 maven-surefire-plugin:test
    执行测试文件,依次执行src/test/java下的每一个测试用例,并将每个测试用例的结果放在target/surefire-reports下。
5.6 maven-jar-plugin:jar
    创建jar,放在targets下。
5.7 maven-assembly-plugin
    自定义打包,可以把工程依赖元素、模块等其他文件存放在单个归档文件里。
5.8 maven-install-plugin:install
    安装jar,将创建生成的jar拷贝到本地maven仓库里。
    
6.  分析pom.xml文件里的dependencies
    包括直接引入的jar和该dependency所依赖的jar,形成一颗依赖树。(猜测会在这个步骤下载所需要的jar?
    
7.  完成基本操作
    针对PROJECT BUILD PLAN中的插件名和其配置信息,此处会完成具体的操作。
    首先分析该插件所依赖的jar,引入未被引入的,再对配置中的参数进行具体化,最后执行该插件的功能。
7.1 maven-resources-plugin:resources
    处理源资源文件,将src/main/resources下的文件复制到target/classes下。
7.2 maven-compiler-plugin:compile
    编译源文件,一般情况下将src/main/java下的源代码编译成功后放在target/classes下。
7.3 maven-resources-plugin:testResources
    处理测试资源文件,将src/test/resources下的文件复制到target/test-classes下。
7.4 maven-compiler-plugin:testCompile
    编译测试源文件,将src/test/java下的源代码编译成功后放在target/test-classes下。
7.5 maven-surefire-plugin:test
    执行测试文件,依次执行src/test/java下的每一个测试用例,并将每个测试用例的结果放在target/surefire-reports下。
7.6 maven-jar-plugin:jar
    创建默认的depends-0.9.3.jar,放在targets下。
7.7 maven-assembly-plugin
    自定义打包,根据描述符文件即src/main/assemble/jar-with-dependencies.xml和package.xml,创建depends-0.9.3-jar-with-dependencies.jar和depends-0.9.3-package.zip,放在targets下。
7.8 maven-install-plugin:install
    安装jar,将创建生成的jar等拷贝到本地maven仓库里。
    
8.  build结果信息,显示SUCCESS或FAILURE。

【参考文档】:
1、Maven学习总结(三)——使用Maven构建项目
2、使用 Maven 构建 Java 项目
3、Maven常用命令
4、Maven常用命令大全与pom文件讲解
5、Introduction to the Build Lifecycle
6、MAVEN的安装与配置以及配置MAVEN镜像为阿里云
7、Maven安装及配置
8、Maven安装与配置

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容