想自学Maven?推荐Maven极简高速入门及常规使用

news/2024/6/14 19:10:53 标签: maven, java, linux, 程序人生, 开发语言

前言

笔者的工作经历中使用过Ant、Maven和Gradle,如果让笔者选择,笔者会首选Gradle。那为什么还要写Maven这篇内容呢?时下大部分公司都还在使用Maven,并且很多开源项目也在使用Maven,Maven有一些功能特性还是很不错的,很值得做总结记录。

Maven是什么

Maven是Apache旗下的一个纯Java开发的开源项目,是一个用于构建和管理任何基于Java的项目的工具。

为什么要使用Maven

使用Maven轻松实现项目jar包依赖管理、子模块管理、构建jar/war包、管理jar/war包、执行单元/集成测试、执行代码分析/代码质量检查等等,开箱即用让开发者无需花更多的时间。

Maven安装

安装Maven之前,需要确保安装了JDK,Maven3.3+版本需要安装JDK 1.7或更高版本。Apache Maven 3.6.3是当前推荐安装的最新版本,推荐使用国内镜像地址下载(
https://mirrors.tuna.tsinghua.edu.cn/apache/)。

Windows系统安装及设置

下载地址:
https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/

想自学Maven?推荐Maven极简高速入门及常规使用

windows操作系统下载
apache-maven-3.6.3-bin.zip,解压压缩包到硬盘的某个路径,例如:D:\Maven\apache-maven-3.6.3,右键"计算机"(或我的电脑),选择"属性",点击"高级系统设置",点击"环境变量",新建系统变量 MAVEN_HOME,变量值为D:\Maven\apache-maven-3.6.3,编辑系统变量Path,在变量值得末尾加上;%MAVEN_HOME%\bin,保存如上修改退出。

打开命令行窗口(快捷键win+r,输入cmd回车),输入mvn –v回车,如果正常输出Maven版本号则安装及配置完成,否则安装上述步骤检查。

Linux系统安装及设置

Linux系统下载
apache-maven-3.6.3-bin.tar.gz,通过如下命令行操作下载及解压,例如解压到/usr/local/路径:

wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tar -xvf apache-maven-3.6.3-bin.tar.gz
sudo mv -f apache-maven-3.6.3 /usr/local/

使用如下命令行操作打开/etc/profile:

sudo vim /etc/profile

在文件末尾添加如下配置:

export MAVEN_HOME=/usr/local/apache-maven-3.6.3
export PATH=${PATH}:${MAVEN_HOME}/bin

退出编辑并保存,运行如下命令使配置的环境变量生效:

source /etc/profile

在命令行窗口输入mvn –v命令检查安装及设置是否完成,如果正常输出Maven版本号则安装及配置完成,否则安装上述步骤检查。

Mac系统安装及设置

Mac系统下载
apache-maven-3.6.3-bin.tar.gz,通过如下命令行操作下载及解压,例如解压到/usr/local/路径:

curl -O https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tar -xvf apache-maven-3.6.3-bin.tar.gz
sudo mv -f apache-maven-3.6.3 /usr/local/

使用如下命令行操作打开/etc/profile:

sudo vim /etc/profile

在文件末尾添加如下配置:

export MAVEN_HOME=/usr/local/apache-maven-3.6.3
export PATH=${PATH}:${MAVEN_HOME}/bin

退出编辑并保存,运行如下命令使配置的环境变量生效:

source /etc/profile

在命令行窗口输入mvn –v命令检查安装及设置是否完成,如果正常输出Maven版本号则安装及配置完成,否则安装上述步骤检查。

如何使用Maven

Maven是一个庞大的项目,有很全面的管理功能,本篇内容只记录开发者日常使用频率比较高的部分功能。

设置Maven仓库

Maven仓库就是一个位置,用于存储项目中的依赖,这个依赖可以是jar、war、zip、pom等。

Maven仓库有三种类型:本地仓库、中央仓库和远程仓库。当执行Maven构建命令查找项目依赖时,首先从本地仓库搜索,如果本地仓库找不到,再从中央仓库搜索,如果中央仓库也找不到,又配置过远程仓库,那么再从远程仓库搜索。

本地仓库是计算机本机硬盘上的某个路径,这个路径在安装Maven后不会马上创建,它在第一次运行Maven命令的时候才被创建。默认情况下,本地仓库被创建后,这个路径是用户目录下.m2/repository/,例如Windows系统是C:\Users\admin\.m2\repository,Linux系统是
/home/admin/.m2/repository/,Mac系统是/Users/wxq/.m2/repository/。如果要修改本地仓库的位置,更改Maven解压后目录下conf中的settings.xml文件,找到localRepository标签,将其值设置为想要的本地路径,例如:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  -->
  <localRepository>D:/LocalRepository</localRepository>
</settings>

中央仓库是由Maven社区提供的仓库,其中包含了绝大多数流行的开源Java依赖。这个仓库不需要配置,只要有网络就可以直接使用。如果你想确认一下某依赖在中央仓库中是否真的存在,可以在http://search.maven.org/#browse搜索。使用中央仓库下载依赖可能会很慢,所以需要配置一个国内的镜像地址来代替原中央仓库的默认地址,推荐使用阿里云的镜像地址。打开Maven解压后目录下conf中的settings.xml文件,在mirrors标签中添加如下镜像配置即可。

<mirror>
   <id>alimaven</id>
   <name>aliyun maven</name>
   <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
   <mirrorOf>central</mirrorOf>
</mirror>

远程仓库是开发人员自己定制的仓库,用于存放不想被公开的私有依赖,例如用于存放管理个人/公司开发的公共jar。远程仓库可以在pom.xml中配置,这里不详细描述步骤了。

认识pom.xml

pom.xml是Maven的基本工作单元,包含了项目的基本信息,声明了项目依赖、项目如何构建等等。使用Maven时,Maven会自动在当前目录中查找pom.xml,读取pom.xml,获取所需的配置信息,然后执行目标任务。pom.xml一般放置在项目源码的根目录下。

每个pom.xml都有一个父pom.xml,父pom.xml中包含了一些可以被继承的默认设置,例如当查找依赖时,如果本地仓库中没有,默认会从中央仓库中查找依赖,但是这个中央仓库默认是不需要配置的,是因为在父pom.xml中配置了中央仓库的地址
http://repo1.maven.org/maven2。

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">
    <!--继承的父项目信息,默认可以不配置,如果有可以配置-->
    <!--父项目的pom.xml中定义的元素值被本项目继承下来,也就是说如果本项目pom.xml中某元素没定义,那么默认会自动使用父项目定义的值-->
    <parent>
        <!--指定父项目的全球唯一标识-->
        <groupId>com.alibaba.nacos</groupId>
        <!--指定父项目的构件标识-->
        <artifactId>nacos-all</artifactId>
        <!--指定父项目的版本号-->
        <version>1.2.1</version>
        <!--指定父项目pom.xml文件的相对路径。默认值是../pom.xml-->
        <relativePath>../pom.xml</relativePath>
    </parent>
    <!--指定模型版本号,指定当前pom.xml应遵循哪一个POM模型版本,当前版本4.0.0-->
    <modelVersion>4.0.0</modelVersion>
    <!--定义本项目的全球唯一标识-->
    <groupId>com.wind.cloud</groupId>
    <!--定义本项目的构建标识,它和groupId一起唯一标识一个构件-->
    <artifactId>demo</artifactId>
    <!--指定本项目的构建版本号-->
    <version>1.0-SNAPSHOT</version>
    <!--目标构建类型,如jar、war、pom等,默认是jar-->
    <packaging>jar</packaging>
    <!--定义key-value形式的属性,这些属性可以在全局使用-->
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <alibaba-nacos-config-version>2.2.1.RELEASE</alibaba-nacos-config-version>
    </properties>
    <!--项目需要的依赖列表-->
    <dependencies>
        <!--依赖的具体信息-->
        <dependency>
            <!--依赖的全球唯一标识-->
            <groupId>com.alibaba.cloud</groupId>
            <!--依赖的构建标识-->
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <!--依赖的版本号-->
            <version>${alibaba-nacos-config-version}</version>
            <!--指定依赖在什么时候被使用,默认是compile,即编译-->
            <!--如果值为test,则用于test任务时使用-->
            <scope>compile</scope>
            <!--当有传递依赖时,从依赖列表中排除某些不需要的依赖-->
            <exclusions>
                <!--排除依赖的信息-->
                <exclusion>
                    <!--排除依赖的构建标识-->
                    <artifactId>org.slf4j</artifactId>
                    <!--排除依赖的全球唯一标识-->
                    <groupId>slf4j-api</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <!--项目构建管理,默认会使用父pom.xml中的配置,没有特殊需求可以不配置-->
    <build>
        <!--使用的插件列表 -->
        <!--Maven社区提供了很多不同功能的插件可以使用,这里不一一介绍了,有需要的在Maven官网查看(https://maven.apache.org/)-->
        <plugins>
            <!--plugin元素描述插件所需要的信息-->
            <plugin>
                <!--插件的artifactId-->
                <artifactId>maven-compiler-plugin</artifactId>
                <!--插件的版本-->
                <version>3.5.1</version>
                <!--插件工作时需要的参数配置-->
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                    <compilerVersion>${maven.compiler.source}</compilerVersion>
                    <showDeprecation>true</showDeprecation>
                    <showWarnings>true</showWarnings>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

依赖管理

在pom.xml文件的dependencies标签中通过添加dependency元素添加项目依赖。实际的开发中,通常将项目的公共依赖定义到父项目的pom.xml中,或者定义到公共项目的pom.xml中。

Maven中的项目依赖是可传递的,例如项目A依赖jar包B,项目C依赖项目A构建后的jar包,那么项目C间接依赖jar包B。

有时,这种依赖传递会导致依赖的版本冲突,可以通过配置exclusions排除某些不需要的依赖,当然也可以通过optional标记某传递依赖是可选的。

    <!--项目需要的依赖列表-->
    <dependencies>
        <!--依赖的具体信息-->
        <dependency>
            <!--依赖的全球唯一标识-->
            <groupId>com.alibaba.cloud</groupId>
            <!--依赖的构建标识-->
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <!--依赖的版本号-->
            <version>${alibaba-nacos-config-version}</version>
            <!--指定依赖在什么时候被使用,默认是compile,即编译-->
            <!--如果值为test,则用于test任务时使用-->
            <scope>compile</scope>
            <!--当有传递依赖时,从依赖列表中排除某些不需要的依赖-->
            <exclusions>
                <!--排除依赖的信息-->
                <exclusion>
                    <!--排除依赖的构建标识-->
                    <artifactId>org.slf4j</artifactId>
                    <!--排除依赖的全球唯一标识-->
                    <groupId>slf4j-api</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <!--依赖的全球唯一标识-->
            <groupId>com.alibaba</groupId>
            <!--依赖的构建标识-->
            <artifactId>dubbo</artifactId>
            <!--依赖的版本号-->
            <version>2.6.8</version>
            <!--指定依赖在什么时候被使用,默认是compile,即编译-->
            <!--如果值为test,则用于test任务时使用-->
            <scope>compile</scope>
            <!--当有传递依赖时,指定依赖是可选的-->
            <optional>true</optional>
        </dependency>
    </dependencies>

Maven构建生命周期

Maven构建生命周期(lifecycle)由各个阶段组成,每个阶段由Maven的插件plugin来执行完成。一般情况下,一个项目的Maven构建生命周期由以下几个阶段的序列组成。

想自学Maven?推荐Maven极简高速入门及常规使用

想自学Maven?推荐Maven极简高速入门及常规使用

生命周期阶段描述

Maven构建命令

在pom.xml文件所在的路径使用mvn命令,Maven会自动查找pom.xml,加载解析并执行文件中的构建任务。

一般常用的构建命令有mvn clean package、mvn clean install和mvn clean deploy。

mvn clean package:依次执行移除所有上一次构建生成的文件、代码编译、单元测试、打包。

mvn clean install:依次执行移除所有上一次构建生成的文件、代码编译、单元测试、打包、将打好的包安装到本地仓库。

mvn clean deploy:依次执行移除所有上一次构建生成的文件、代码编译、单元测试、打包、将打好的包安装到本地仓库、将打好的包发布到远程仓库。

IntelliJ IDEA中使用Maven

最新版本的IntelliJ IDEA会自带Maven插件,但还是建议通过配置更改成本机安装的Maven,这样方便更改Maven相关配置。

新建Maven项目或打开已有的Maven项目后,IDEA会自动识别项目中的pom.xml,在IDEA右侧的窗口中会展示pom.xml中使用到的插件和构建声明周期,例如下图所示。

想自学Maven?推荐Maven极简高速入门及常规使用

双击Lifecycle中的某阶段,会自动执行相应的构建任务。当然,也可以通过IDEA中的Terminal直接执行mvn命令。

Eclipse中使用Maven

最新版本的Eclipse会自带Maven插件,但还是建议通过配置更改成本机安装的Maven,这样方便更改Maven相关配置。

新建Maven项目或打开已有的Maven项目后,Eclipse会自动识别项目中的pom.xml。项目代码在Eclipse中打开后,右键选中项目,然后选择Run As,会列出可执行的Maven构建任务。


http://www.niftyadmin.cn/n/1603519.html

相关文章

Python爬虫是如何遍历文档树呢?一招教你

遍历文档树 1.直接子节点&#xff1a;.contents .children属性 .content Tag的.content属性可以将Tag的子节点以列表的方式输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #!/usr/bin/python3 # -*- coding:utf-8 -*- from bs4 import Beautiful…

Python爬虫之Selector的基本用法正确运用方法,案例详解

Selector 的用法 我们之前介绍了利用 Beautiful Soup、pyquery 以及正则表达式来提取网页数据&#xff0c;这确实非常方便。而 Scrapy 还提供了自己的数据提取方法&#xff0c;即 Selector&#xff08;选择器&#xff09;。Selector 是基于 lxml 来构建的&#xff0c;支持 XPa…

Mybatis接口Mapper内的方法为啥不能重载?

动态代理的功能&#xff1a;通过拦截器方法回调&#xff0c;对目标target方法进行增强。 言外之意就是为了增强目标target方法。上面这句话没错&#xff0c;但也不要认为它就是真理&#xff0c;殊不知&#xff0c;动态代理还有投鞭断流的霸权&#xff0c;连目标target都不要的…

Python爬虫解析神器-正则表达式如何正确运用?案例详解

先详细的整理一下Python中的正则表达式的相关内容。正则表达式在Python爬虫中的作用就像是老师点名时用的花名册一样&#xff0c;是必不可少的神兵利器。 一、 正则表达式基础 1.1.概念介绍 正则表达式是用于处理字符串的强大工具&#xff0c;它并不是Python的一部分。 其他…

ArrayList还是LinkedList?性能可差千倍

ArrayList 和 LinkedList 有什么区别&#xff0c;是面试官非常喜欢问的一个问题。可能大部分小伙伴和我一样&#xff0c;能回答出“ArrayList 是基于数组实现的&#xff0c;LinkedList 是基于双向链表实现的。” 关于这一点&#xff0c;我之前的文章里也提到过了。但说实话&am…

八大Python爬虫技巧,你会几个?

python应用最多的场景还是web快速开发、爬虫、自动化运维&#xff1a;写过简单网站、写过自动发帖脚本、写过收发邮件脚本、写过简单验证码识别脚本。 爬虫在开发过程中也有很多复用的过程&#xff0c;这里总结一下&#xff0c;以后也能省些事情。另外要注意&#xff1a;光理论…

Spring Boot Redis 实现分布式锁,真香

之前看很多人手写分布式锁&#xff0c;其实 Spring Boot 现在已经做的足够好了&#xff0c;开箱即用&#xff0c;支持主流的 Redis、Zookeeper 中间件&#xff0c;另外还支持 JDBC。 本篇栈长以 Redis 为例&#xff08;这也是用得最多的方案&#xff09;&#xff0c;教大家如何…

Python爬虫之GET和POST请求如何正确运用详解

爬虫——GET请求和POST请求 urllib.parse.urlencode()和urllib.parse.unquote() 编码工作使用urllib.parse的urlencode()函数&#xff0c;帮我们将key:value这样的键值对转换成"keyvalue"这样的字符串&#xff0c;解码工作可以使用urllib的unquote()函数。 1 2 3 4…