Maven基础知识(1)- Maven 简介、Maven 安装配置、创建 Quickstart 项目

 

注:开始阅读 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;
2 
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;
2 
3             public class App {
4                 public static void main( String[] args ) {
5 
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/


posted @ 2022-06-05 16:03  垄山小站  阅读(567)  评论(0编辑  收藏  举报