Maven 学习笔记

Maven 是一个项目管理和构建自动化工具,所有的项目配置信息都被定义在 pom.xml 文件中。通过该文件,Maven 可以管理项目的整个生命周期,包括编译、构建、测试、发布、报告等。

Maven 使用惯例优于配置的原则 。它要求在没有定制之前,所有的项目都有如下的结构:

目录 目的
${basedir} 存放 pom.xml和所有的子目录
${basedir}/src/main/java 项目的 java源代码
${basedir}/src/main/resources 项目的资源,比如说 property文件
${basedir}/src/test/java 项目的测试类,比如说 JUnit代码
${basedir}/src/test/resources 测试使用的资源

maven 项目在默认情况下会产生 JAR 文件,放在 ${basedir}/target 下面。 

1、创建 HelloWorld 项目。Maven 安装成功后,在命令行输入:

mvn archetype:generate -DgroupId=com.mycompany.helloworld -DartifactId=helloworld -Dpackage=com.mycompany.helloworld -Dversion=1.0-SNAPSHOT -DarchetypeCatalog=internal

archetype:generate 是什么意思呢?archetype 是一个插件的名字,generate是目标(goal)的名字。这个命令的意思是告诉 maven 执行 archetype 插件的 generate 目标。插件目标通常会写成 pluginId:goalId。mvn 本身不会做太多的事情,它把构建的任务交给插件去做。

一个目标是一个工作单元,而插件则是一个或者多个目标的集合。比如说Jar插件,Compiler插件,Surefire插件等。从看名字就能知道,Jar 插件包含建立Jar文件的目标, Compiler 插件包含编译源代码和单元测试代码的目标。Surefire 插件的话,则是运行单元测试。

-D 选项指定项目属性。GroupId 指明创建项目的组织或者小组的唯一标识。典型的,此标识以组织的完全限定名来定义。比如,org.apache.maven.plugins是所有Maven插件项目指定的groupId。 artifactId 指明此项目产生的主要产品的基本名称,源代码包通常使用artifactId作为最后名称的一部分。典型的产品名称使用这个格式: <artifactId>- <version>. <extension>(比如:myapp-1.0.jar)。version 项目产品的版本号,Maven帮助你管理版本,可以经常看到SNAPSHOT这个版本,表明项目处于开发阶段。

其中参数 -DarchetypeCatalog=internal 表示不要从远程服务器上取catalog,不加这个参数,界面会卡死在命令 Generating project in Interactive mode 下。

2、构建项目。

~$cd helloworld

~$mvn package

第一次运行 maven 的时候,它会从网上的 maven 库 (repository) 下载需要的程序,存放在电脑的本地库 (local repository) 中,默认的本地库是 ~/.m2/repository/ ,在 Windows 下是 %USER_HOME%.m2 epository ,如果要将库建在其它文件,要修改 apache-maven-X.X.Xconf 下的 setting.xml 文件。

与首次执行的命令(那是一个goal) archetype:generate 不同,这次执行的只是一个简单的命令---package。不同于goal,这是一个phase(阶段),一个phase是指构建生命周期的一个阶段,构建生命周期是指有序的一系列phase。当给出一个phase,Maven将执行所有的在此阶段前的phase及其自身,例如,如果我们执行compile阶段,实际上执行的阶段有: 

validate 
generate-sources 
process-sources 
generate-resources 
process-resources 
compile

构建完成后,maven 在 helloworld 下面建立了一个新的目录 target/ ,构建打包后的 jar 文件 helloworld-1.0-SNAPSHOT.jar 就存放在这个目录下。编译后的 class 文件放在 target/classes/ 目录下面,测试 class 文件放在 target/test-classes/ 目录下面。

可以使用以下的命令来测试新编译和打包出来的jar包:

java -cp target/helloworld-1.0-SNAPSHOT.jar com.mycompany.helloworld.App

3、Maven 生命周期。Maven 能支持不同的生命周期,但最常用的是默认的 Maven 生命周期,上面的 mvn package 会依次执行默认生命周期中直到包括 package 阶段前的所有阶段的插件目标。

process-resources 阶段:resources:resources

compile 阶段:编译项目的源代码

process-classes 阶段:(默认无目标)

process-test-resources 阶段:resources:testResources

test-compile 阶段:compiler:testCompile

test 阶段:使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。

prepare-package 阶段:(默认无目标)

package 阶段:jar:jar

参考资料:

1、Apache Maven 入门篇:http://www.oracle.com/technetwork/cn/community/java/apache-maven-getting-started-1-406235-zhs.html

2、maven 教程一 入门:http://wentao365.iteye.com/blog/903396

3、maven 环境快速搭建:http://www.cnblogs.com/fnng/archive/2011/12/02/2272610.html

原文地址:https://www.cnblogs.com/NaughtyBaby/p/4690445.html