Maven简介

Maven是一个项目构建和管理工具。那什么是构建呢?构建就是软件项目生产的整个过程,比如这个过程应该包括:

  • 文档和代码的生成(有些项目会使用代码自动生成工具,比如数据库访问代码的逆向工程)
  • 代码的编译、测试和打包
  • 打包好的代码进行分发或者部署

可见,项目的构建可不仅仅是编译软件这件事情。除了写代码,在项目层面做的大部分工作,都包含在构建的过程中。Maven可以帮助我们在非常短的时间里完成项目的配置工作,管理开发时的依赖,从而快速建立开发环境。同时Maven能够自动化地帮我们执行编译、构建、测试和发布等过程,比我们手动执行要更加高效。

接下来我们通过Maven来管理我们的项目,因此我们先简单了解Maven的一些基本概念和使用方法。

安装Maven

Eclipse Luna自带了Maven,可以直接使用。但是一般情况下建议手动安装Maven,这样更容易在不同环境以及不同团队成员之间统一Maven版本,同时也更便于在命令行中执行Maven命令。

前往官网下载Maven,下载二进制文件即可,即apache-maven-{version}-bin.zip或者apache-maven-{version}-bin.tar.gz

将下载文件解压到某个目录,如/Users/david/DevTools/apache-maven-3.3.3,将目录中的bin文件夹路径(/Users/david/DevTools/apache-maven-3.3.3/bin)添加到环境变量path

如果你使用的是Mac,通过Brew安装Maven,只需要一条命令:

brew install maven

为了验证Maven是否安装成功,在命令行执行mvn -v命令,如果安装成功,可以看到控制台输出:

➜  ~  mvn -v
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /usr/local/Cellar/maven/3.3.9/libexec
Java version: 1.8.0_20, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "mac os x", version: "10.10.5", arch: "x86_64", family: "mac"

为了让Eclipse使用本地安装的Maven版本而非自带的默认版本,需要进行简单的配置。

打开偏好设置,选择【Maven】->【Installations】,点击【Add】;

QQ20160205-3@2x.png

在弹出对话框中,输入本地Maven安装的路径,同时进行命名,比如我们命名为Maven 3.3.9

QQ20160205-1@2x.png

完成之后,将Maven 3.3.9勾选,点击【OK】,则Eclipse将使用本地安装的Maven。

QQ20160205-2@2x.png

创建Maven项目

接下来让我们创建第一个Maven项目。【File】->【New】->【Other...】,选择【Maven】->【Maven Project】。

QQ20160203-0@2x.png

接下来设置项目路径,勾选Create s simple projectUse default Workspace location,点击【Next】。

QQ20160203-3@2x.png

填写以下信息后,点击【Finish】完成项目创建。

QQ20160203-2@2x.png

其中:

  • Group Id是这个项目所属的组织,一般都是组织域名的反写形式,这里我们填写为com.tianmaying

  • Artifact Id是这个项目所产生的制品的名称,比如最终所生成的JAR包或者WAR包的名称

  • Version是项目的版本

  • Pacaking是项目如何打包,默认的值为jar

  • Name是项目的可读名称

  • Description是项目的描述

项目创建完成之后,Maven已经为我们建立好了项目的文件结构:

  • 默认的代码目录为src/main/java
  • 默认的资源目录为src/main/resources
  • 默认的测试目录src/test/java
  • 默认的测试资源目录为src/test/resources

点击打开项目根目录下的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.tianmaying</groupId>
  <artifactId>hello-maven</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>hello-maven</name>
  <description>A demo of simple maven projects</description>
</project>

POM是Project Object Model的缩写,即项目对象模型,项目的所有信息都体现在POM文件中了。事实上我们说通过Maven文件管理项目,更确切的就是通过POM文件来描述项目,Maven会根据POM文件来帮我们自动化执行各种过程和任务。

上面的XML代码中的信息包含了最简单的项目信息,其中<modelVersion> POM模型的版本(只能是4.0.0),其它信息与刚刚在创建项目导向中输入的信息是一致的。Eclipse根据我们的输入自动生成了这些信息,很多情况下我们也可以手动输入。

新创新的Maven的项目,默认是使用JDK 1.5,为了让Maven项目使用JDK 1.8,可以在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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.tianmaying</groupId>
  <artifactId>hello-maven</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>hello-maven</name>
  <description>A demo of simple maven projects</description>

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <configuration>
            <source>1.8</source>
            <target>1.8</target>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

这段代码将Maven编译Java 代码的JDK改为了1.8版本,详细解释我们暂时略过。【右键】->【Maven】->【Update Project】就可以在项目导航栏中看到JRE System Library中显示为JavaSE 1.8了。

编写代码

src/main/java/目录下来创建我们需要的Java类,我们创建一个用于Say Hello World的NewComer类,另外一个包含main方法的HelloWorld类。

NewComer.java

package com.tianmaying.mavendemo;

public class HelloWorld {
    public static void main(String[] args) {
        NewComer newComer = new NewComer();
        System.out.println(NewComer.sayHello());
    }
}

NewComer

package com.tianmaying.mavendemo;

public class NewComer {
    public String sayHello() {
        return "Hello Tianmaying!";
    }
}

在命令行中构建项目

我们可以通过Maven执行不同的构建生命周期目标,比如编译项目代码,创建制品(如JAR包),将包安装到本地仓库等。

在命令行中输入:mvn compile

这里compile就是一个目标,这条命令告诉Maven执行编译,如果成功执行,将可以在target/classes文件夹下看到编译出来的.class文件。如果首次运行maven命令,需要花一些时间去将依赖的包下载到本地仓库,执行成功可以在控制台中看到Build Success的信息。

通常情况下,我们执行得更加频繁的命令是:mvn package

执行package目标不仅会编译代码,同时会运行所有的测试,最后将target目录下的生成JAR包。JAR包的名称时<artifactId><version>两个属性值连接起来构成的。比如上面这个例子中,生成JAR包会被命名为hello-maven-0.0.1.jar。如果将<packaging>的值从"jar"改成"war",则将生成一个WAR包。

Maven在本地维护着一个缓存依赖的仓库,通常在用户目录下的.m2/repository目录,这样构建时可以迅速获取所需的依赖。如果你希望项目生成JAR包也放到本地仓库中,可以执行:mvn install

install目标不仅编辑、测试和打包,同时将打包出来的制品会复制到本地依赖仓库中,将来其它项目如果需要依赖于这个包时,就可以在POM文件中引用它。

更多生命周期目标以后再使用到时我们在为大家解释。

在Eclipse中构建项目

我们也可以在Eclipse中通过菜单操作来执行命令。【邮件】->【Run As】->【Maven build】:

MavenCommands.png

在弹出如下对话框,我们在【Goals】中输入clean package后,点击【Run】就相当于在命令行执行了mvn clean package

QQ20160205-0@2x.png

一条Maven命令可以执行多个目标,在这个例子中,就先后执行了cleanpackage两个目标,其中clean目标会删除之前的编译和打包结果,通常我们会在一个目标前加入clean目标。

登录发表评论 注册

yu_han01

@David现在已经解决了!

David

丢到tomcat的webapps目录下就行 @yu_han01

如果要设置context path要修改一下server.xml

yu_han01

@David 老师,请问下用maven构造的项目打包成war文件,要如何才能部署到tomcat服务器啊?

席暖

@David谢谢你,我现在已经解决了blush

席暖

天啊,简直可以出书了!!!!

David

可以截个图上来,或者说一下有什么错误提示信息~

反馈意见