第一个maven应用

前置条件

  • 已安装maven

建立目录并编写maven的pom.xml

在系统任意目录下建立项目目录,并在目录下建立pom.xml文件,修改pom.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
        xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.test</groupId>
        <artifactId>demo</artifactId>
        <version>1.0-SNAPSHOT</version>

        <properties>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>

</project>

注释: 第一行为标准的xml头

第三、四、五行为xml的约束,为固定写法,如果使用的maven版本不同可能会有不同

第六行为maven的POM项目模型版本,一般不会变。

第七行groupId为组织Id,一般为项目所属组织,构建时生成的路径也是由此生成。

第八行artifactId为项目名称,它和group ID一起唯一标识一个构件(项目)。

第九行version为项目版本号,项目当前版本,格式为:主版本.次版本.增量版本-限定版本号

第十一行properties节点中及其中的project.build.sourceEncoding定义了项目源代码的编码格式

建立源代码和测试代码目录

在项目目录中建立如下目录结构:

basedir
    └─src
        ├─main
        │  └─java
        │      └─org
        │          └─test
        │              └─main
        └─test
            └─java
                └─org
                    └─test
                        └─main

建立源代码和测试代码

新建文件:src\main\java\org\test\main\HelloMaven.java,内容如下:

package org.test.main;

public class HelloMaven{
    public static void main(String[] args){
        System.out.println("Hello Maven");
    }

    public String say(String name){
        return "Hello "+name;
    }
}

新建文件:src\test\java\org\test\main\TestHelloMaven.java,内容如下:

package org.test.main;

import org.junit.*;
import static org.junit.Assert.*;

public class TestHelloMaven{
    @Test
    public void testHelloMaven(){
        HelloMaven hm = new HelloMaven();
        String result = hm.say("Maven");
        assertEquals(result,"Hello Maven");
    }

}

编译

打开一个终端,切换到项目目录,执行以下命令:

mvn compile

此时maven从中心仓库中下载需要依赖的项目包,到用户目录的.m2目录(此目录可配置)下,并且在完成后,编译源代码文件,并输出结果,如果结果如下,则表示编译成功:

[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ demo ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to E:\maven\demo\target\classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.429 s
[INFO] Finished at: 2015-10-20T15:23:50+08:00
[INFO] Final Memory: 16M/110M
[INFO] ------------------------------------------------------------------------

此时,目录结构如下:

├─src
│  ├─main
│  │  └─java
│  │      └─org
│  │          └─test
│  │              └─main
│  └─test
│      └─java
│          └─org
│              └─test
│                  └─main
└─target
    ├─classes
    │  └─org
    │      └─test
    │          └─main
    └─maven-status
        └─maven-compiler-plugin
            └─compile
                └─default-compile

target目录为编译输出目录。

测试

修改pom文件,在project节点下添加如下内容:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>

此节点添加了项目对Junit包的依赖,其中的groupId、artifactId、version为Junit在maven中心仓库的坐标(唯一标识)。

修改完成后,在终端中执行如下命令:

mvn test

此时,maven下载与测试相关的包,以及依赖的Junit包到用户目录的.m2文件夹,之后完成测试。 显示如下内容表示命令执行成功:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running org.test.main.TestHelloMaven
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.087 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.373 s
[INFO] Finished at: 2015-10-20T15:31:57+08:00
[INFO] Final Memory: 14M/138M
[INFO] ------------------------------------------------------------------------

测试之后的目录结构如下:

├─src
│  ├─main
│  │  └─java
│  │      └─org
│  │          └─test
│  │              └─main
│  └─test
│      └─java
│          └─org
│              └─test
│                  └─main
└─target
    ├─classes
    │  └─org
    │      └─test
    │          └─main
    ├─maven-status
    │  └─maven-compiler-plugin
    │      ├─compile
    │      │  └─default-compile
    │      └─testCompile
    │          └─default-testCompile
    ├─surefire-reports
    └─test-classes
        └─org
            └─test
                └─main

surefire-reports目录包含了测试结果。

清理

clean指令用于清除编译、测试、打包时生成的目录及文件。

在项目目录中运行命令:

mvn clean

此时项目目录下的target目录被删除。

打包

package指令用于生成项目的jar包。

在项目目录中运行命令:

mvn package

此时,maven会下载相关包,编译源代码,测试代码,执行测试,如果测试通过,源代码将被打包。target目录下会生成项目的jar文件。

安装

install 指令用于将包安装到本地的maven仓库中,供其它的项目引用。

在项目目录中运行命令:

mvn install

执行结束后,系统用户目录下会在生成对应目录及文件如下:

~/.m2/repository/org/test/demo$ls -alh
total 5.0K
drwxr-xr-x 1 Cloud 197121   0 十月 20 08:23 .
drwxr-xr-x 1 Cloud 197121   0 十月 20 08:23 ..
drwxr-xr-x 1 Cloud 197121   0 十月 20 08:23 1.0-SNAPSHOT
-rw-r--r-- 1 Cloud 197121 274 十月 20 08:23 maven-metadata-local.xml

将maven项目转换成Eclipse支持的Java项目

在项目目录中运行命令:

mvn eclipse:eclipse

此时项目目录下会生成.classpath 和 .project。打开安装了Maven Integration for Eclipse插件的eclipse导入项目即可.

组合指令

maven的编译,清理,测试,打包,部署命令是可以几个命令同时组合起来使用的,常用的命令组合

如:

先清理再编译:mvn clean compile

先清理后打包:mvn clean package

maven的默认约定

上面的示例中,maven使用一条指令,就完成了很多工作。例如:例如,编译src/main/java目录下的源代码,输出到target目录下。这些目录,都是maven预设置的。maven采用类化于grails"约定优于配置"的原则。

目录描述
${project.dir}/src/main/javajava源码目录
${project.dir}/src/main/resources资源文件目录
${project.dir}/src/main/filters资源过滤目录
${project.dir}/src/main/webappweb应用文件目录(当打包为war时),如WEB-INF/web.xml
${project.dir}/src/test/java测试java源码目录
${project.dir}/src/test/resources测试资源文件目录
${project.dir}/src/test/filters测试资源过滤目录
${project.dir}/src/it集成测试(主要为插件)
${project.dir}/src/assemblyAssembly descriptors
${project.dir}/src/site项目site输出目录
${project.dir}/LICENSE.txt项目许可证
${project.dir}/NOTICE.txt项目依赖类库的属性要求,及以通告
${project.dir}/README.txt项目的README文件,用于描述这份源码是用来做什么的?如何使用项目?项目中重要的文件和子目录的结构信息?