Maven 学习-入门
在进行Java开发的过程中,我接触到了Maven这套构建工具。所以,花费了点时间学习了一下这套构建工具,在学习过程中学习到的有关Maven的知识,在这里分享给大家。
什么是Maven
首先,在介绍Maven这套工具之前,我们得了解Maven是什么。
Maven,在依地语中的意思是知识的积累,Maven在最初的时候,是作为Jakarta的Turbine项目的构建工具。在Maven出现之前,不同的Java项目使用不同的Ant配置进行构建,并且将jar包包含在版本控制系统(CVS)中,没有一套统一的构建工具。如果有一套工具,可以拥有一套标准的方法来构建一个项目,并且可以清楚的定义一个项目是由哪些部分组成的,拥有一种简单的方法发布项目的信息,在不同的项目之间可以分享jar包。出于这个目的,Maven被创造了出来。
Maven最初始的目标是让开发者可以在最短的周期内可以快速的理解一个项目。为了达到这个目的,Maven解决了一下几个问题:
- 让构建过程变的简单
- 提供一套统一的构建系统
- 提供项目相关的信息
- 可以透明得迁移新的特性
使用Maven
在使用Maven之前,我们需要确保我们已经安装了Maven构建工具。没有安装Maven构建工具的,可以参考官方提供的手册参考如何安装Maven
在安装了Maven以后,可以通过命令 mvn -version查看Maven的版本信息:
$ mvn -version
Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T19:57:37+08:00)
Maven home: /usr/local/opt/maven
Java version: 1.7.0_79, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "mac os x", version: "10.10.2", arch: "x86_64", family: "mac"
接下来,我们通过Maven创建一个新的项目开始。
使用Maven创建一个新的Java项目
$ mvn -B archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DgroupId=com.myapp \
-DartifactId=myapp
在上面的Maven命令中,我们创建了一个名为myapp的普通Java项目。一旦我们执行了上面的命令,就会在当前目录下创建一个目录为myapp的工程。在这个工程目录下,包含了一个名为pom.xml的文件,这个新创建的pom文件内容大致如下:
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.myapp</groupId>
<artifactId>myapp</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>myapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
这个pom文件表示了当前这个项目的项目对象模型(Project Object Model(POM)。在Maven中,POM是它进行操作的基本单位。Maven的本质是以围绕POM这个概念为中心来管理整个项目的。POM中包含了项目中所有和项目相关的重要的信息,并且提供了类似一站式购物那样的依赖管理方式,可以很方便的找到当前项目关联的所有依赖来项目。
上面的pom.xml文件中的内容,包含了当前这个项目的相关信息。我们首先就上面这个POM文件中的一些元素,解释下具体的含义:
project这个元素是Maven的pom.xml文件的顶层元素。每个POM文件都是以一个project元素包裹的。modelVersion这个元素指定了当前这个pom.xml文件使用的项目对象模型(POM)的版本。groupId这个元素表示创建这个项目的组织的唯一标识。这个元素的值是区分一个项目的关键信息之一,它的值通常是由该项目的组织的域名的反写产生的(和Java的包名的机制一样)。artifactId这个元素是唯一标识了该项目最终生成的artifact(可以理解为是我们编写代码产生的一个程序,所以可以理解为是手工作品)。一个项目的artifact一般是一个jar文件。一个项目最终生成的artifact的名字的格式是<artifactId>-<version>.<extension>,比如上面的项目生成的artifact为myapp-1.0.jar。packaging这个元素指定了该artifact打包的类型(比如:jar、war、ear等)。这不只是意味着该artifact是以什么方式打包,也指定了在构建过程中会用到的特定的生命周期(所谓的生命周期,简单的说就是构建的过程)。packaging元素的默认值是JAR。version这个元素指定了项目生成的artifact的版本号。在版本号中会包含当前项目的进度,比如这里的SNAPSHOT。name这个元素表示项目的名字,常用于生成的文档中。url这个元素表示该项目所在的站点,常用于生成的文档中。description这个元素提供了对项目的描述,通常用于生成的文档中。
在项目被创建以后,除了会生成上面的pom.xml文件,还会产生一个标准的目录结构:
myapp
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- com
| `-- myapp
| `-- App.java
`-- test
`-- java
`-- com
`-- myapp
`-- AppTest.java
上面的目录结构是Maven项目的标准布局,项目的源代码在目录${basedir}/src/main/java目录下,而项目的测试代码存放在目录${basedir}/src/test/java目录下。对于${basedir},这里表示的是包含了pom.xml文件的目录,也就是项目的根目录。
现在,我们已经简单介绍了maven相关的概念和maven标准的目录结构。但是,在我们使用Maven构建项目之前,我们先简单了解下Maven的生命周期。
Maven的构建的生命周期
Maven的构建机制,是围绕生命周期(lifecycle)这个概念进行构建的。这意味着构建和发布一个项目的整个过程是预先被定义了的。采用这种方式进行项目构建,可以让用户可以在学习很少的一部分命令的情况下通过POM对项目进行构建。
在Maven中,内建了三种构建生命周期:default、clean、site。default生命周期处理项目的部署,clean生命周期处理项目构建后的清理工作,site生命周期对项目的站点文档进行生成。
Maven的生命周期,又是由不同的阶段(phase)构成的。每一个生命周期,都包含了一系列的阶段,每一个阶段都表示了生命周期中的一个状态。比如,对于default生命周期来说,包含了如下的这些阶段:
- validate
- compile
- test
- package
- integration-test
- verify
- install
- deploy
Maven在执行default生命周期的时候,会顺序执行这些阶段来完成不同的工作。
使用maven构建项目
现在我们已经安装好Maven,并且对Maven的相关概念有了一些认识。下面,我们可以开始使用Maven对我们的项目进行构建了。
编译项目
在前面,我们已经创建了一个名为myapp的项目。现在,我们可以通过下面的命令对这个项目进行编译。
$ mvn compile
这个命令执行以后,会有类似下方的输出:
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building myapp 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ myapp ---
...
[INFO] skip non existing resourceDirectory /Users/duke/practise/myapp/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ myapp ---
[INFO] Changes detected - recompiling the module!
...
[INFO] Compiling 1 source file to /Users/duke/practise/myapp/target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.159 s
[INFO] Finished at: 2015-10-06T18:57:37+08:00
[INFO] Final Memory: 11M/156M
[INFO] ------------------------------------------------------------------------
在执行这个命令以后,Maven会首先去下载所有构建当前项目所需要的插件,以及所有被当前项目所依赖所有依赖项目。从上面的输出中可以看出,我们最终构建后的文件被输出到目录${basedir}/target/classes中,这个目录是Maven约定的一个标准目录。使用Maven的好处之一,就是当我们遵循Maven的约定以后,我们可以使用尽可能少的配置就可以让Maven为我们构建项目。
编译单元测试
现在,我们已经成功地编译了我们的项目。接下来,我们可以让Maven对单元测试进行编译和执行,通过执行下面的命令,可以让Maven编译和执行我们写的单元测试:
$ mvn test
上面的命令会有大致如下的输出:
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building myapp 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
...
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ myapp ---
[INFO] Nothing to compile - all classes are up to date
...
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ myapp ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/duke/practise/myapp/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ myapp ---
[INFO] Surefire report directory: /Users/duke/practise/myapp/target/surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.myapp.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.004 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.799 s
[INFO] Finished at: 2015-10-06T19:08:08+08:00
[INFO] Final Memory: 13M/156M
[INFO] ------------------------------------------------------------------------
从输出中我们可以看到,Maven在编译和执行单元测试之前,会首先编译main中的项目代码,然后才会对test中的单元测试进行编译和执行,并提供一个有关单元测试结果的简单报告。
在这里,我们使用surefire插件对单元测试进行执行。surefire插件会对符合该插件约定的命名规则的单元测试文件进行搜索,然后进行执行。默认会执行以下命名规则的文件:
- **/*Test.java
- **/Test*.java
- **/*TestCase.java
默认会排除以下命名规则的文件
- **/Abstract*Test.java
- **/Abstract*TestCase.java
当然,如果只是需要对单元测试进行编译而不需要执行,可以运行命令mvn test-comiple实现。
项目打包
现在,我们已经对项目进行编译测试过了,我们接下来需要对项目进行打包。当前项目,我们在pom.xml中的packaging元素中指定了打包的类型为jar。所以我们可以通过下面的命令来打jar包:
$ mvn package
执行这个命令的输出大致如下:
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building myapp 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
...
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ myapp ---
[INFO] Building jar: /Users/duke/practise/myapp/target/myapp-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.741 s
[INFO] Finished at: 2015-10-06T19:41:05+08:00
[INFO] Final Memory: 10M/156M
[INFO] ------------------------------------------------------------------------
Maven在执行这个命令的时候,会从pom.xml文件中获得打包的类型,在这个项目中为jar包类型。然后将打出来的jar输出到目录${basedir}/target下。
在打完包以后,我们的jar包现在还是留在我们的项目的target目录下,为了将这个jar部署到我们的本地仓库(默认是~/.m2/repository)中以供别的项目使用,我们需要使用如下命令将当前项目的jar包部署到本地仓库中:
$ mvn install
到目前为止,我们已经学习了怎么对项目进行打包和部署到本地仓库中了。
清理项目
现在,我们如果需要对构建除的文件进行清理,我们需要使用如下的命令:
$ mvn clean
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building myapp 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ myapp ---
[INFO] Deleting /Users/duke/practise/myapp/target
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.255 s
[INFO] Finished at: 2015-10-06T19:47:25+08:00
[INFO] Final Memory: 6M/123M
[INFO] ------------------------------------------------------------------------
这个命令会删除target目录,因为在这个目录下包含了我们构建这个项目后输出的所有文件。现在,我们的项目就回到被构建之前了。
IDE相关的命令
我们如果使用IDE开发环境,我们可以使用Maven生成当前项目相关的IDE的描述文件。
对于IntelliJ IEDA环境,可以用如下命令进行生成:
$ mvn idea:idea
对于eclipse环境,可以用如下的命令生成:
$ mvn eclipse:eclipse
参考
http://maven.apache.org/guides/getting-started/index.html
Maven 学习-入门的更多相关文章
- Maven学习入门——2016-2-17
一.Maven的基本概念 1.1Mawen是干啥的??? 我们第一次接触Maven一般就是用Maven为我们的项目加入jar包,非常的方便. maven到底是干什么的??说白了,maven就是用来管理 ...
- Maven学习-目录结构
在前一篇文章中,我们介绍了什么是Maven,以及如何用Maven来构建我们的项目.不了解Maven的童鞋,可以看这里Maven学习-入门.在这篇文章中,我们将学习Maven的项目的目录结构相关的内容. ...
- Maven 学习 -- 目录
1. Maven 学习-入门 2. Maven学习-目录结构 3. Maven学习-处理资源文件 啦啦啦
- Maven——快速入门手册(学习记录)
前言: 前段时间进行了一点maven的入门学习,在这里做个记录,希望能帮到一些正在学习的朋友们.maven版本为3.3.9.希望大家觉得好的点个赞,觉得不好的多提提意见和建议做个交流.这里也贴出我学习 ...
- Maven学习总结(1)——Maven入门
Maven学习总结(一)--Maven入门 一.Maven的基本概念 Maven(翻译为"专家","内行")是跨平台的项目管理工具.主要服务于基于Java平台的 ...
- Maven 学习(一)-Maven 使用入门
http://www.cnblogs.com/xdp-gacl/p/3498271.html http://www.cnblogs.com/xdp-gacl/p/4240930.html 一.Mave ...
- Maven学习系列二(1-5)
Maven学习系列二(1-5) 本文转自 QuantSeven 博客,讲解精炼易懂,适合入门,链接及截图如下 http://www.cnblogs.com/quanyongan/category/47 ...
- Maven学习总结(1-10)
Maven学习总结(1-10) 本文转自 孤傲苍狼 博客,讲解精炼易懂,适合入门,链接及截图如下 http://www.cnblogs.com/xdp-gacl/tag/Maven%E5%AD%A6% ...
- Maven学习 二 Maven环境搭建
第一步:下载Maven并解压 注意选择镜像地址,选择国内的会快点 解压目录 Maven目录分析 bin:含有mvn运行的脚本 boot:含有plexus-classworlds类加载器框架 conf: ...
随机推荐
- 在ubuntu中安装psutil
环境:ubuntu 16.04 LTS + python 2.7/3.5共存 + psutil 4.3.0 1.sudo apt-get install python3-dev # 先把python3 ...
- keep the bar green to keep the code clean——Junit详解(一)
测试用例 单元测试时每个开发人员必需掌握的,是保证开发过程中代码的准确性,无误性,保证代码质量.敏捷开发模式是先根据用户需求写测试用例,考虑基本所有用户所需要的情况,再写实现方法.单元测试有很多种,当 ...
- i7 4790 z97-ar ssd 固态硬盘 装机的一些经历
今天电脑终于装好了,我于七夕情人节前后的几天配了一台台式机用开发,期间遇到了一些问题与大家分享一下,希望对一些朋友有帮助. 1 买HIMD线,各个零件全部组装好后,我意识到一个问题没买HIMD线,我的 ...
- XCode修改公司名称和作者名称
新建的文件最上方都会有一段类似如下的版权声明 // // ViewController.m // CBDemoProject001 // // Created by CB on 16/3/17. ...
- 转 从腾讯那“偷 了”3000万QQ用户数据
http://www.icaijing.com/hot/article4899809/ http://news.cnblogs.com/n/533061/
- Mysql数据库的一些命令_LInux
查看当前数据库的版本,因为有些命令在不同版本中 用法有可能不一样,注意 -V 是大写字母V[root@localhost ~]# mysqladmin -Vmysqladmin Ver 8.42 D ...
- JAVA小知识
eclipse是日蚀的意思,eclipse是IBM公司的,当年和SUN公司的java竞争,sun的意思是太阳,所以你明白了? Java的起名是 java(爪哇)咖啡,java原意是爪哇的意思,当初起名 ...
- USB协议规范学习(一)
什么是USB OHCI规范? OHCI(Open HCI)是目前使用比较广泛的三种USB主机控制器规范之一.USB体系结构是由四个主要部分组成:客户软件/USB驱动,主机控制器驱动(HCD),主机控制 ...
- Which ports are considered unsafe on Chrome
1, // tcpmux 7, // echo 9, // discard 11, // systat 13, // daytime 15, // netstat 17, // qotd 19, // ...
- Number of 1 Bits(Difficulty: Easy)
题目: Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also ...