注:开始阅读 Maven 基础知识系列文章之前,读者应该已经掌握了 Java 基础知识。另外,本系列文章中的所有实例都是使用 IntelliJ IDEA 编辑,所以还需要对 IntelliJ IDEA 有基本的了解。以下是常用的 Java 开发工具(IDE):


Eclipse IDE for Java Developers: http://www.eclipse.org/downloads/packages/

JetBrains IDEA: https://www.jetbrains.com/idea/download/

Netbeans: http://www.netbeans.org/index.html



1. Maven 简介

    Apache Maven 是一款基于 Java 平台的项目管理和整合工具,它将项目的开发和管理过程抽象成一个项目对象模型(POM)。开发人员只需要做一些简单的配置,Maven 就可以自动完成项目的编译、测试、打包、发布以及部署等工作。


    Maven 是使用 Java 语言编写的,因此它和 Java 一样具有跨平台性,这意味着无论是在 Windows ,还是在 Linux 或者 Mac OS 上,都可以使用相同的命令进行操作。


    Maven 简化并标准化了项目构建过程。它将项目的编译,生成文档,创建报告,发布,部署等任务无缝衔接,构建成一套完整的生命周期。Maven 能够帮助开发者完成以下任务:


        (1) 构建项目

        (2) 生成文档

        (3) 创建报告

        (4) 维护依赖

        (5) 软件配置管理

        (6) 发布

        (7) 部署


    约定优于配置:


        约定优于配置(Convention Over Configuration)是 Maven 最核心的涉及理念之一 ,Maven对项目的目录结构、测试用例命名方式等内容都做了规定,凡是使用 Maven 管理的项目都必须遵守这些规则。


        Maven 项目构建过程中,会自动创建默认项目结构,开发人员仅需要在相应目录结构下放置相应的文件即可。


        例如,下表显示了项目源代码文件,资源文件和其他配置在 Maven 项目中的默认位置。



            文件                目录

            Java 源代码     src/main/java

            资源文件          src/main/resources

            测试源代码       src/test/java

            测试资源文件    src/test/resources

            打包输出文件    target

            编译输出文件    target/classes


    Maven 具有以下特点:


        (1) 设置简单;

        (2) 所有项目的用法一致;

        (3) 可以管理和自动进行更新依赖;

        (4) 庞大且不断增长的资源库;

        (5) 可扩展,使用 Java 或脚本语言可以轻松的编写插件;

        (6) 几乎无需额外配置,即可立即访问新功能;

        (7) 基于模型的构建:Maven 能够将任意数量的项目构建为预定义的输出类型,例如 JAR,WAR;

        (8) 项目信息采取集中式的元数据管理:使用与构建过程相同的元数据,Maven 能够生成一个网站(site)和一个包含完整文档的 PDF;

        (9) 发布管理和发行发布:Maven 可以与源代码控制系统(例如 Git、SVN)集成并管理项目的发布;

        (10) 向后兼容性:您可以轻松地将项目从旧版本的 Maven 移植到更高版本的 Maven 中;

        (11) 并行构建:它能够分析项目依赖关系,并行构建工作,使用此功能,可以将性能提高 20%-50%;

        (12) 更好的错误和完整性报告:Maven 使用了较为完善的错误报告机制,它提供了指向 Maven Wiki 页面的链接,您将在其中获得有关错误的完整描述;



    Apache Maven: https://maven.apache.org/

    Apache Maven GitHub: https://github.com/apache/maven



2. Maven 安装配置

    Maven 是一个基于 Java 的项目管理工具,因此最基本的要求是在计算机上安装 JDK 7.0 及以上。


    1) Windows 下安装

        Windows版本: Windows 10 Home (20H2)


        https://archive.apache.org/dist/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.zip


        下载后解压缩,无需安装,只需配置。假设 Maven 相关的目录如下:


            Maven 目录: C:\Applications\java\apache-maven-3.8.1

            本地 Maven 仓库: C:\Applications\java\maven-repository


        (1) 配置环境变量


            右击“我的电脑” → “属性” → “高级系统设置” → “高级” → “环境变量”


            新建系统变量(点击“系统变量”下方的“新建”按钮,填写变量名与变量值,点击“确定”)


                MAVEN_HOME = C:\Applications\java\apache-maven-3.8.1


            编辑系统变量 Path (PATH)


                Path = … ;%MAVEN_HOME%\bin;


        (2) 修改成阿里源


            修改 C:\Applications\java\apache-maven-3.8.1\conf\settings.xml


复制代码

 1             …

 2 

 3             # 修改本地仓库路径

 4             <localRepository>C:\Applications\java\maven-repository</localRepository>

 5 

 6             …

 7 

 8             # 修改成阿里源

 9             <mirror>

10                 <id>alimaven</id>

11                 <name>aliyun maven</name>

12                 <url>http://maven.aliyun.com/nexus/content/groups/public/</url>

13                 <mirrorOf>central</mirrorOf>       

14             </mirror>

复制代码

 


    2) macOS 下安装

        macOS版本: macOS High Sierra (Version: 10.13.6)


        下载:https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz


        下载后解压缩,无需安装,只需配置。假设 Maven 相关的目录如下:


            Maven 目录: /Users/xxx/Applications/Java/apache-maven-3.8.1

            本地 Maven 仓库: /Users/xxx/Applications/maven-repository


        (1) 配置环境变量


            修改系统配置文件 /etc/profile


                $ sudo vim /etc/profile


                    …

                    MAVEN_HOME=/Users/xxx/Applications/Java/apache-maven-3.8.1

                    CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

                    PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$MAVEN_HOME/bin

                    export JAVA_HOME JRE_HOME MAVEN_HOME CLASS_PATH PATH


                $ source /etc/profile

                $ echo $MAVEN_HOME


        (2) 修改成阿里源


            修改 /Users/xxx/Applications/Java/apache-maven-3.8.1/conf/settings.xml


复制代码

 1             …

 2 

 3             # 修改本地仓库路径

 4             <localRepository>/Users/xxx/Applications/maven-repository</localRepository>

 5 

 6             …

 7 

 8             # 修改成阿里源

 9             <mirror>

10                 <id>alimaven</id>

11                 <name>aliyun maven</name>

12                 <url>http://maven.aliyun.com/nexus/content/groups/public/</url>

13                 <mirrorOf>central</mirrorOf>       

14             </mirror>  

复制代码

 


    3) Linux 下安装

        参考 macOS 下安装



3. 创建 Quickstart 项目

    Maven 提供了大量不同类型的 Archetype 模板,通过它们可以帮助用户快速的创建 Java 项目,其中最简单的模板就是 maven-archetype-quickstart,它只需要用户提供项目最基本的信息,就能生成项目的基本结构及 POM 文件。


    1) 创建 maven-archetype-quickstart 项目

        在 D:\Workshop\maven 目录中创建一个基于 Maven 的 Quickstart 项目。


        打开 cmd 命令行窗口,进入 D:\Workshop\maven 目录,执行如下命令:


           D:\Workshop\maven>mvn archetype:generate -DgroupId=com.example -DartifactId=MavenDemo01 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false


        参数说明:


            -DgroupId: 项目组 ID,通常为组织名或公司网址的反写。

            -DartifactId: 项目名。

            -DarchetypeArtifactId: 指定 ArchetypeId,maven-archetype-quickstart 用于快速创建一个简单的 Maven 项目。

            -DinteractiveMode: 是否使用交互模式。


        命令运行后,D:\Workshop\maven\ 目录下自动生成了 MavenDemo01 项目。


    2) 项目目录结构

        MavenDemo01

            |- src

            |   |- main

            |   |    |- java

            |   |         |- com

            |   |             |- example

            |   |                   |- App.java

            |   |- test

            |        |- java

            |             |- com

            |                 |- example

            |                       |- AppTest.java

            |- pom.xml


        (1) 目录及文件说明


            MavenDemo01:项目名,包含 src 文件夹和 pom.xml;

            src/main/java:用于存放项目的 Java 文件;

            src/main/resources:用于存放项目资源文件,需手动创建;

            src/test/java:用于存放所有测试 Java 文件,如 JUnit 测试类;

            src/test/resources :用于存放测试资源文件,需手动创建;

            target:项目输出位置,用于存放编译后的文件,编译运行时自动创建;

            pom.xml:Maven 项目核心配置文件。


        (2) App.java 代码


复制代码

 1             package com.example;

 2 

 3             /**

 4             * Hello world!

 5             *

 6             */

 7             public class App

 8             {

 9                 public static void main( String[] args )

10                 {

11                     System.out.println( "Hello World!" );

12                 }

13             }

复制代码


        (3) TestApp.java 代码


复制代码

 1            package com.example;

 2 

 3             import junit.framework.Test;

 4             import junit.framework.TestCase;

 5             import junit.framework.TestSuite;

 6 

 7             /**

 8             * Unit test for simple App.

 9             */

10             public class AppTest

11                 extends TestCase

12             {

13                 /**

14                 * Create the test case

15                 *

16                 * @param testName name of the test case

17                 */

18                 public AppTest( String testName )

19                 {

20                     super( testName );

21                 }

22 

23                 /**

24                 * @return the suite of tests being tested

25                 */

26                 public static Test suite()

27                 {

28                     return new TestSuite( AppTest.class );

29                 }

30 

31                 /**

32                 * Rigourous Test 🙂

33                 */

34                 public void testApp()

35                 {

36                     assertTrue( true );

37                 }

38             }

复制代码


        (4) pom.xml 代码


复制代码

 1             <project xmlns="http://maven.apache.org/POM/4.0.0"

 2                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 3                     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0

 4                                         http://maven.apache.org/maven-v4_0_0.xsd">

 5 

 6                 <modelVersion>4.0.0</modelVersion>

 7                 <groupId>com.example</groupId>

 8                 <artifactId>MavenDemo01</artifactId>

 9                 <packaging>jar</packaging>

10                 <version>1.0-SNAPSHOT</version>

11                 <name>MavenDemo01</name>

12                 <url>http://maven.apache.org</url>

13                 <dependencies>

14                     <dependency>

15                         <groupId>junit</groupId>

16                         <artifactId>junit</artifactId>

17                         <version>3.8.1</version>

18                         <scope>test</scope>

19                     </dependency>

20                 </dependencies>

21             </project>

复制代码


    3) POM

        POM(Project Object Model,项目对象模型)是 Maven 的基本组件,它是以 xml 文件的形式存放在项目的根目录下,名称为 pom.xml。


        当 Maven 执行一个任务时,它会先查找当前项目的 POM 文件,读取所需的配置信息,然后执行任务。在 POM 中可以设置如下配置:


            (1) 项目依赖

            (2) 插件

            (3) 目标

            (4) 构建时的配置文件

            (5) 版本

            (6) 开发者

            (7) 邮件列表


        Maven 项目都有一个 POM 文件,所有的 POM 文件都必须有 project 元素和 3 个必填字段:groupId、artifactId 以及 version。


            节点            描述

            groupId        项目组 ID,定义当前 Maven 项目隶属的组织或公司,通常是唯一的。它的取值一般是项目所属公司或组织的网址或 URL 的反写,例如 com.example。

            artifactId    项目 ID,通常是项目的名称。groupId 和 artifactId 一起定义了项目在仓库中的位置。

            version        项目版本。


        POM 默认继承自一个父 POM,这个父 POM 被称为 Super POM,它包含了一些可以被继承的默认设置。


        Maven 使用 effective pom (Super POM 的配置加上项目的配置)来执行相关任务,它替开发人员在 pom.xml 中做了一些最基本的配置。当然,开发人员依然可以根据需要重写其中的配置信息。


        执行以下命令 ,就可以查看 Super POM 的默认配置。


            D:\Workshop\maven\MavenDemo01>mvn help:effective-pom


        执行结果如下:


            [INFO] Scanning for projects…

            [INFO]

            [INFO] ———————-< com.example:MavenDemo01 >———————–

            [INFO] Building MavenDemo01 1.0-SNAPSHOT

            [INFO] ——————————–[ jar ]———————————

            [INFO]

            [INFO] — maven-help-plugin:3.2.0:effective-pom (default-cli) @ MavenDemo01 —

            [INFO]

            Effective POMs, after inheritance, interpolation, and profiles are applied:


            …


        实际开发过程中,Maven 的 pom.xml 文件不需要手工编写,Maven 提供了大量的原型(Archetype)插件来创建项目,包括项目结构和 pom.xml。



    4) 构建&测试项目

        (1) 修改代码


            创建 src/main/java/com/example/Common.java 文件


复制代码

1             package com.example;

3             public class Common {

4                 public static void sayHello(String message) {

5                     System.out.println(message);

6                 }

7             }

复制代码


            修改 src/main/java/com/example/App.java 文件


复制代码

1             package com.example;

3             public class App {

4                 public static void main( String[] args ) {

6                     Common.sayHello("Common: say hello");

7                 }

8             }

复制代码


        (2) 清理和编译


            打开 cmd 命令行窗口,进入 D:\Workshop\maven\MavenDemo01 目录,执行如下命令:


                D:\Workshop\maven\MavenDemo01>mvn clean compile


            在项目根目录中生成了一个名为 target 的目录,该目录包含以下文件:


                    target

                        |- classes

                        |- maven-status


            进入 D:\Workshop\maven\MavenDemo01\target\classes 目录,执行如下命令:


                D:\Workshop\maven\MavenDemo01\target\classes> java com.example.App


                    Common: say hello


            注:mvn 是 Maven 的命令行命令,clean 参数是指清理 target 目录,compile 参数是指把 *.java 编译成 *.class。clean 和 compile 可以分开单独使用。


        (3) 打包 jar


            执行如下命令:


                D:\Workshop\maven\MavenDemo01>mvn clean package


            在 target 目录下生成 MavenDemo01-1.0-SNAPSHOT.jar,运行如下命令:


                D:\Workshop\maven\MavenDemo01>java -jar target\MavenDemo01-1.0-SNAPSHOT.jar


                    target\MavenDemo01-1.0-SNAPSHOT.jar 中没有主清单属性


            显然,MavenDemo01-1.0-SNAPSHOT.jar 不支持 java 命令行运行。




本系列文章资料参考来源:


1. http://c.biancheng.net/maven2/

2. https://www.w3cschool.cn/maven/

3. https://maven.apache.org/

转自:cnblogs.com/tkuang/p/16344188.html