简介
如今用于项目管理和自动化构建的东东用的比较多的,比如:
- eclipse中用到的ant
- 现今流行的android studio中用到的gradle
这里将介绍另一种工具——maven (也可以用来构建android项目)!
Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理软件,如今越来越多的项目开始使用这种工具,大小项目都有。
主要功能可分为三类:
- 项目自动化构建
- 版本控制
- 依赖管理
Maven能够很方便的帮你管理项目报告,生成站点,管理JAR文件。
如下是Maven的官网,可以看到是托管到apache下面的(不知道什么原因,我的firefox访问这个站点速度很慢...)
http://maven.apache.org/
下载安装
如图给出了下载位置(网址即为上述网址,笔者尝试打开这个页面时总是发现是一片空白,突然我按下F5刷新后...页面出来了)
(插一句, 注意maven的安装运行是需要Java环境的,确认系统已经正确下载配置了java runtime!)
下载解压后放置到合适的位置,里面的内容如下:
这个即为maven的根目录,bin存放了二进制文件,boot里面是一个类加载jar包,conf里面是一些配置用文件,lib是maven所以来的一些jar包。
随后将这个根目录配置到Path环境变量中,打开控制台,输入命令:mvn -v出现下面结果,就说明安装成功了~
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"
创建项目和简单使用
这里以创建一个简单的java项目为例。
首次创建项目可以使用mvn archetype:generate命令(这实际上是一个maven插件),可以看到首次执行后会自动的下载很多依赖文件,这里需要等待片刻
这里实际上是在下载一个叫做maven-archetype-quickstart的插件,这个插件可以用来方面的新建maven项目(就好比是在eclipse中安装ADT方便创建android项目工程)
下载一段时间后会发现提示选择这个插件的版本:
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
选择默认的即可。
随后到了要输入所要新建项目的信息时候了,根据提示会依次要求你输入下列信息:
Define value for property 'groupId': : com.company.maven01 Define value for property 'artifactId': : mavenapp1 Define value for property 'version': 1.0-SNAPSHOT: : Define value for property 'package': com.company.maven01: : Confirm properties configuration: groupId: com.company.maven01 artifactId: mavenapp1 version: 1.0-SNAPSHOT package: 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] ------------------------------------------------------------------------
这里四个输入变量含义是:
- groudId,可以看作为项目的包名
- artifactId,可以看作为项目的模块名
- version,版本号,这里maven-archetype-quickstart插件会自动分配一个默认的版本号(1.0-Snapshot),这里例子中直接回车用默认的即可
- package,这里设置包名,maven-archetype-quickstart也会自动的将groupId作为默认的包名,直接回车即
下面我们进入执行命令所在的目录,发现maven-archetype-quickstart自动为我们创建了一个项目目录骨架:
根目录为一个src文件和一个pom.xml文件,src下面有main和test文件夹,main是放置项目代码的地方,test是放置测试代码的地方,通常在src下面还会有一个resource的文件夹,用来放置图片等资源文件。
文件夹结构 | 描述 |
---|---|
consumerBanking | contains src folder and pom.xml |
src/main/java | contains java code files under the package structure (com/companyName/bank). |
src/main/test | contains test java code files under the package structure (com/companyName/bank). |
src/main/resources | it contains images/properties files (In above example, we need to create this structure manually). |
同时还帮我们一个示例java文件和一个测试示例文件(用到了junit)
package com.company.maven01; /** * Hello world! * */ public class App { public static void main( String[] args ) { System.out.println( "Hello World!" ); } }
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 ); } }
在项目目录中,到控制台运行mvn compile即可编译(第一次运行这个命令会下载很多东西,需要等待片刻),发现下面这个结果,就表示编译通过了
[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] ------------------------------------------------------------------------
进入项目目录发现下面多了一个target文件夹
我们在运行下mvn test命令
------------------------------------------------------- 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] ------------------------------------------------------------------------
这里是在运行那个junit测试文件,可以发现测试通过。这个时候再回到刚才根目录,进入target文件夹,发现有很多目录,主要是存放了编译后的class文件和测试及项目管理报告等。
再执行一次命令mvn package (改命令即为打包)
[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] ------------------------------------------------------------------------
这个时候再看target目录,又多出来了一个打包后的jar包,命令和之前配置的artifactId和version一致。最终target文件夹下面的内容为:
POM文件
根目录下有个pom.xml,这个即为项目对象模型文件,类似于ant构建方式中的build.xml。他是用来描述整个项目的,比如基础信息设置、依赖配置、构建配置等等,采用xml文件格式组织。
打开上述例子中的pom.xml文件,这里即为一个简单的pom.xml的结构:
<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>
- modelVersion为使用的maven版本
- groupId、artifactId、version的含义已经介绍过(参考上一节创建项目的地方)
- packaging定义了打包方式,上述例子中即打包成Jar,也可以打包成war, ear等。当不定义packaging的时候,Maven 会使用默认值jar
- dependencies配置了依赖冠以,这里引用了junit,也可以引用本地仓库中的其他项目
pom.xml文件的使用内容还是很多的,比如pom文件之间的复用(采用了继承、依赖、聚合等关系配置)、构建的设置、属性赋值(类似于gcc中makefile的常量定义)、配置开发者信息等等,后面后续会有详细的博客介绍。