已复制
全屏展示
复制代码

Maven入门实战总结


· 5 min read

一. 概要说明

Maven是一个Java项目管理和构建工具,它可以定义项目结构、项目依赖,并使用统一的方式进行自动化构建,是Java项目不可缺少的工具。它的主要功能有:

  • 提供了一套标准化的项目结构。
  • 提供了一套标准化的构建流程(编译,测试,打包,发布……)。
  • 提供了一套依赖管理机制。

二. 项目结构

2.1 目录结构

一个使用 Maven 管理的普通的 Java 项目,它的目录结构默认如下,这些就是一个Maven 项目的标准目录结构。

netflow
|── pom.xml
|── src
|   ├── main
|   │   └── java
|   │       └── com
|   │           └── yuchaoshui
|   │               └── App.java
|   └── test
|       └── java
|           └── com
|               └── yuchaoshui
|                   └── AppTest.java
└── target

项目的根目录netflow是项目名

  • 它有一个项目描述文件 pom.xml
  • 存放Java源码的目录是 src/main/java
  • 存放资源文件的目录是 src/main/resources
  • 存放测试源码的目录是 src/test/java
  • 存放测试资源的目录是 src/test/resources
  • 所有编译、打包生成的文件都放在 target目录里。

2.2 命令行创建项目

mvn archetype:generate \
    -DgroupId=com.yuchaoshui \
    -DartifactId=netflow \
    -DarchetypeArtifactId=maven-archetype-quickstart \
    -DinteractiveMode=false

2.3 pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<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.yuchaoshui</groupId>
	<artifactId>project-name</artifactId>
	<version>1.0</version>
	<properties>
        ...
	</properties>
	<dependencies>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        ...
	</dependencies>
	<build>
        <plugins>
            ...
        </plugins>
    </build>
</project>

其中,groupId类似于Java的包名,通常是公司或组织名称,artifactId类似于Java的类名,通常是项目名称,再加上version,一个Maven工程就是由groupId,artifactIdversion作为唯一标识。我们在引用其他第三方库的时候,也是通过这 3 个变量确定。

2.4 mvn命令打包

打包。下面的命令表示先清除之前的打包内容,重新到一个新的包。这也是最常用的打包命令。

mvn clean package

三. 依赖关系

Maven 定义了几种依赖关系,分别是compile、test、runtime、provided、system。

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.6.5</version>
            <scope>provided</scope>
            <exclusions>
                <exclusion>
                    <groupId>com.google.protobuf</groupId>
                    <artifactId>protobuf-java</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
scope 说明 示例
compile 编译时需要用到该jar包(默认) commons-logging
test 编译Test时需要用到该jar包 junit
runtime 编译时不需要,但运行时需要用到 mysql
provided 编译时需要用到,但运行时由JDK或某个服务器提供 servlet-api
system 和provided相同,不同的是system需要自己指定jar包路径
  • Maven 维护了一个中央仓库 repo1.maven.org,所有第三方库将自身的 jar 以及相关信息上传至中央仓库,Maven 就可以从中央仓库把所需依赖下载到本地。
  • Maven 并不会每次都从中央仓库下载jar包。一个 jar 包一旦被下载过,就会被Maven 自动缓存在本地目录(用户主目录的 .m2 目录),所以,除了第一次编译时因为下载需要时间会比较慢,后续过程因为有本地缓存,并不会重复下载相同的jar包。
  • 注:只要包含了 SNAPSHOT 的版本号会被 Maven 视为开发版本,开发版本每次都会重复下载,这种 SNAPSHOT 版本只能用于内部私有的 Maven repo,公开发布的版本不允许出现 SNAPSHOT。

四. Maven镜像

除了可以从Maven的中央仓库下载外,还可以从Maven的镜像仓库下载。如果访问Maven的中央仓库非常慢,我们可以选择一个速度较快的Maven的镜像仓库。Maven镜像仓库定期从中央仓库同步。比如使用阿里云提供的Maven镜像仓库,使用Maven镜像仓库需要一个配置,在用户主目录下进入.m2目录,创建一个settings.xml配置文件,内容如下:

cat ~/.m2/settings.xml

<settings>
    <mirrors>
        <mirror>
            <id>aliyun</id>
            <name>aliyun</name>
            <mirrorOf>*</mirrorOf>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        </mirror>
    </mirrors>
</settings>

五. 构建流程

Maven不但有标准化的项目结构,而且还有一套标准化的构建流程,可以自动化实现编译,打包,发布,等等。Maven的生命周期(Lifecycle)由一系列阶段(Phase)构成,

5.1 默认生命周期default

  • validate
  • initialize
  • generate-sources
  • process-sources
  • generate-resources
  • process-resources
  • compile
  • process-classes
  • generate-test-sources
  • process-test-sources
  • generate-test-resources
  • process-test-resources
  • test-compile
  • process-test-classes
  • test
  • prepare-package
  • package
  • pre-integration-test
  • integration-test
  • post-integration-test
  • verify
  • install
  • deploy

如果我们运行mvn package,Maven就会执行default生命周期,它会从开始一直运行到package这个phase为止:

  • validate
    ...
  • package

如果我们运行mvn compile,Maven也会执行default生命周期,但这次它只会运行到compile,即以下几个phase:

  • validate
    ...
  • compile

5.2 常用生命周期clean

生命周期是clean会执行3个phase:

  • pre-clean
  • clean (注意这个clean不是lifecycle而是phase)
  • post-clean

5.3 常用命令总结

  • mvn clean:清理所有生成的class和jar(通常是target目录);
  • mvn clean compile:先清理,再执行到compile;
  • mvn clean test:先清理,再执行到test,因为执行test前必须执行compile,所以这里不必指定compile;
  • mvn clean package:先清理,再执行到package。
  • mvn install: 在本地 Repository 中安装 jar
🔗

文章推荐