最近的工作是,在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安装与配置