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\repository\ ,如果要将库建在其它文件,要修改 \apache-maven-X.X.X\conf\ 下的 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