Maven初识
如今用于项目管理和自动化构建的东东用的比较多的,比如:
-
eclipse中用到的ant
-
现今流行的android studio中用到的gradle
这里将介绍另一种工具——maven (也可以用来构建android项目)!
Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理软件,如今越来越多的项目开始使用这种工具,大小项目都有。
主要功能可分为三类:
-
项目自动化构建
-
版本控制
-
依赖管理
Maven能够很方便的帮你管理项目报告,生成站点,管理JAR文件。
如下是Maven的官网,可以看到是托管到apache下面的(不知道什么原因,我的firefox访问这个站点速度很慢...)
Maven下载和安装配置
如图给出了下载位置(网址即为上述网址,笔者尝试打开这个页面时总是发现是一片空白,突然我按下F5刷新后...页面出来了)
(插一句, 注意maven的安装运行是需要Java环境的,确认系统已经正确下载配置了jdk)
下载解压后放置到合适的位置,里面的内容如下:
这个即为maven的根目录,bin存放了二进制文件,boot里面是一个类加载jar包,conf里面是一些配置用文件,lib是maven所以来的一些jar包。
随后将这个根目录配置到Path环境变量中,打开控制台,输入命令:mvn -v出现下面结果,就说明安装成功了~
<span style="font-size:12px;">D:\Work\moudle\maven\mavenapp1> mvn -v
Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T19:57:37+08:00)
Maven home: D:\Program Files (x86)\apache-maven-3.3.3\bin\..
Java version: 1.8.0_45, vendor: Oracle Corporation
Java home: D:\Program Files\Java\jdk1.8.0_45\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 8.1", version: "6.3", arch: "amd64", family: "dos"</span>
创建Maven项目和简单命令
这里以创建一个简单的java项目为例。
首次创建项目可以使用mvn archetype:generate命令(这实际上是一个maven插件),可以看到首次执行后会自动的下载很多依赖文件,这里需要等待片刻
这实际上是在下载一个叫做maven-archetype-quickstart的插件,这个插件可以用来方面的新建maven项目(就好比是在eclipse中安装ADT方便创建android项目工程)
下载一段时间后会发现提示选择这个插件的版本:
<span style="font-size:12px;">Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
Choose a number: 6: 6</span>
选择默认的即可。
随后到了要输入所要新建项目的信息时候了,根据提示会依次要求你输入下列信息:
<span style="font-size:12px;">Define value for property '<span style="color:#CC0000;">groupId</span>': : com.company.maven01
Define value for property '<span style="color:#CC0000;">artifactId</span>': : mavenapp1
Define value for property '<span style="color:#CC0000;">version</span>': 1.0-SNAPSHOT: :
Define value for property '<span style="color:#CC0000;">package</span>': com.company.maven01: :
Confirm properties configuration:
<span style="color:#CC0000;">groupId</span>: com.company.maven01
<span style="color:#CC0000;">artifactId</span>: mavenapp1
<span style="color:#CC0000;">version</span>: 1.0-SNAPSHOT
<span style="color:#CC0000;">package</span>: com.company.maven01
Y: : Y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.1
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: D:\Work\moudle\maven
[INFO] Parameter: package, Value: com.company.maven01
[INFO] Parameter: groupId, Value: com.company.maven01
[INFO] Parameter: artifactId, Value: mavenapp1
[INFO] Parameter: packageName, Value: com.company.maven01
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: D:\Work\moudle\maven\mavenapp1
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 18:12 min
[INFO] Finished at: 2015-08-04T14:46:23+08:00
[INFO] Final Memory: 14M/168M
[INFO] ------------------------------------------------------------------------</span>
这里四个输入变量含义是:
-
groudId,可以看作为项目的包名
-
artifactId,可以看作为项目的模块名
-
version,版本号,这里maven-archetype-quickstart插件会自动分配一个默认的版本号(1.0-Snapshot),这里例子中直接回车用默认的即可
-
package,这里设置包名,maven-archetype-quickstart也会自动的将groupId作为默认的包名,直接回车即
下面我们进入执行命令所在的目录,发现maven-archetype-quickstart自动为我们创建了一个项目目录骨架:
同时还帮我们创建了一个示例java文件和一个测试示例文件(用到了junit)
<span style="font-size:12px;">package com.company.maven01;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
System.out.println( "Hello World!" );
}
}</span>
<span style="font-size:12px;">package com.company.maven01;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
/**
* Unit test for simple App.
*/
public class AppTest
extends TestCase
{
/**
* Create the test case
*
* @param testName name of the test case
*/
public AppTest( String testName )
{
super( testName );
}
/**
* @return the suite of tests being tested
*/
public static Test suite()
{
return new TestSuite( AppTest.class );
}
/**
* Rigourous Test :-)
*/
public void testApp()
{
assertTrue( true );
}
}</span>
在项目目录中,到控制台运行mvn compile即可编译(第一次运行这个命令会下载很多东西,需要等待片刻),发现下面这个结果,就表示编译通过了
<span style="font-size:12px;">[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\Work\moudle\maven\mavenapp1\target\classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:09 min
[INFO] Finished at: 2015-08-04T15:05:03+08:00
[INFO] Final Memory: 16M/164M
[INFO] ------------------------------------------------------------------------</span>
进入项目目录发现下面多了一个target文件夹
我们再运行下mvn test命令,得到如下结果
<span style="font-size:12px;">-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.company.maven01.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.005 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.226 s
[INFO] Finished at: 2015-08-04T15:13:53+08:00
[INFO] Final Memory: 10M/232M
[INFO] ------------------------------------------------------------------------</span>
这里是在运行那个junit测试文件,可以发现测试通过。这个时候再回到刚才根目录,进入target文件夹,发现有很多目录,主要是存放了编译后的class文件和测试及项目管理报告等。
再执行一次命令mvn package (该命令即为打包操作)
<span style="font-size:12px;">[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ mavenapp1 ---
[INFO] Building jar: D:\Work\moudle\maven\mavenapp1\target\mavenapp1-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.639 s
[INFO] Finished at: 2015-08-04T16:04:25+08:00
[INFO] Final Memory: 14M/233M
[INFO] ------------------------------------------------------------------------</span>
这个时候再看target目录,又多出来了一个打包后的jar包,命令和之前配置的artifactId和version一致。最终target文件夹下面的内容为:
POM.xml
项目根目录下有个pom.xml文件,这个即为项目对象模型文件,类似于ant构建方式中的build.xml。他是用来描述整个项目的,比如基础信息设置、依赖配置、构建配置等等,采用xml文件格式组织。
打开上述例子中的pom.xml文件,这里即为一个典型而简单的pom.xml的结构:
<span style="font-size:12px;"><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.company.maven01</groupId>
<artifactId>mavenapp1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mavenapp1</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project></span>
-
modelVersion为使用的maven版本
-
groupId、artifactId、version的含义已经介绍过(参考上一节创建项目的地方)
-
packaging定义了打包方式,上述例子中即打包成Jar,也可以打包成war, ear等。当不定义packaging的时候,Maven 会使用默认值jar
-
dependencies配置了依赖冠以,这里引用了junit,也可以引用本地仓库中的其他项目
pom.xml文件的使用内容还是很多的,比如pom文件之间的复用(采用了继承、依赖、聚合等关系配置)、构建的设置、属性赋值(类似于gcc中makefile的常量定义)、配置开发者信息等等,后面后续会有详细的博客介绍。