新手Maven入门(一)

news2024/11/16 7:21:24

Mavenue介绍和基本概念

  • 一、什么是Maven
    • 1.1 Maven的组成
    • 1.2 安装和配置Maven
      • 1.2.1 下载
      • 1.2.2 安装
  • 二、Maven 的基本概念
    • 2.1 标准的目录结构
    • 2.2 POM 大纲
      • 2.2.1 pom大纲展示
    • 2.3 构件
      • 2.3.1 什么是maven的构建
    • 2.4 POM 文件的用例
    • 2.5 GAV 坐标
  • 三、依赖

一、什么是Maven

Maven 是一种用来管理 Java 项目的工具,但不是那种用来管理资源规划和调度的工具。它处理的是管理一个具体的项目所涉及的各种任务,如编译、测试、打包、文档以及分发。

1.1 Maven的组成

Maven 包括以下的几个部分。

  • 一组用于处理依赖管理、目录结构以及构建工作流的约定。基于这些约定实现的标准化可以极大地简化开发过程。例如,一个常用的目录结构使得开发者可以更加容易地跟上不熟悉的项目的节奏。
  • 一个用于项目配置的XML Schema:项目对象模型(Project Object Model),简称POM。每一个Maven项目都拥有一个POM文件 。
  • 一个委托外部组件来执行项目任务的插件架构。这简化了更新以及扩展 Maven 能力的过程。

1.2 安装和配置Maven

1.2.1 下载

可以从此处下载适合于你的系统的Maven tar.gz或者zip文件。

1.2.2 安装

安装非常简单:将下载内容解压到你选择的任意文件夹(我们称之为<安装目录>)中。

下来我们以apache-maven-3.8.6举例:

第一步: 将环境变量 M2_HOME 设置为指向<安装目录>apache-maven-3.8.6,这个环境变量将会告诉 Maven 在哪里能找到它的配置文件,conf\settings.xml;

第二步:将%M2_HOME%\bin(在 Linux 上是${M2_HOME}/bin)添加到你的执行路径,在这之后,在命令行执行 mvn 就能运行 Maven 了。

在编译和运行示例项目时,不需要修改默认配置。在首次执行mvn时,Maven会为你创建本地存储库,并从Maven中央存储库下载基本操作所需的大量JAR文件。最后,它会下载构建当前项目所需要的依赖项。settings.xml的详细信息可以在找到。

二、Maven 的基本概念

2.1 标准的目录结构

Maven定义了一个标准的项目目录结构 。(注意:并不是每种类型的项目都需要Maven的所有元素,很多都可以在必要的时候在POM文件中重写。)
在这里插入图片描述

2.2 POM 大纲

2.2.1 pom大纲展示

<project>     //根元素

  <groupId/>
  <artifactId/> //唯一地定义一个Maven 项目的值 
  <version/>
  
  <packaging/>  //该项目所产生的构件的类型;默认值是 jar
  <properties/> //在 POM 中所引用的符号
  <dependencies/> //构建当前项目所需要的其他 Maven 项目
  <build/> //构建该项目所需要执行的任务的配置
  <profiles/> //为不同的用例自定义POM的命名的配置
</project>

2.3 构件

2.3.1 什么是maven的构建

任何可以被 Maven 的坐标系统唯一标识的对象都一个 Maven 构件。大多数情况下,构件是构建 Maven 项目所生成的文件,如 JAR。但是,只包含其他 POM(该文件本身并不产生构件)使用的定义的 POM 文件也是 Maven 构件。Maven 构件的类型由其 POM 文件的元素指定。最常用的值是 pom、jar、ear、war 以及 maven-plugin。

2.4 POM 文件的用例

可以通过以下的方式来使用 POM 文件。

  • 默认的——用于构建一个构件。
  • 父 POM——提供一个由子项目继承的单个配置信息源——声明这个 POM 文件作为它们
    的元素的值。
  • 聚合器——用于构建一组声明为的项目,这些子项目位于其当前聚合器项目的文件夹中,每个都包含有它自己的 POM 文件。

作为父 POM 或者聚合器的 POM 文件的元素的值将是 pom。注意,一个 POM文件可能同时提供两项功能。

2.5 GAV 坐标

POM 定义了 5 种称为坐标的元素,用于标识 Maven 构件。首字母缩写 GAV 指的是必须始终指定的 3 个坐标、以及的首字母。

下面的坐标是按照它们在坐标表达式中出现的顺序列出的。

1、groupId : 是项目或者项目组的全局的唯一标识符。这通常是 Java 源代码中使用的全限定的 Java 包名。例如,io.netty、com.google。

2、artifactId: 用于标识和某个相关的不同的构件。例如,netty-all、netty-handler。

3、type: 是指和项目相关的主要构件的类型(对应于构件的 POM 文件中的值)。它的默认值是 jar。例如,pom、war、ear。

5、version: 标识了构件的版本。例如,1.1、2.0-SNAPSHOT、、4.1.9.Final。

6、classifier: >用于区分属于相同的 POM 但是却被以不同的方式构建的构件。例如,javadoc、sources、jdk16、jdk17。

例如:

  • 完整的坐标表达式具有的格式:artifactId:groupId:packaging:version:classifier
  • 包含 Netty 的所有组件的GAV 坐标:io.netty:netty-all:4.1.9.Final
  • POM 文件必须声明它所管理的构件的坐标。上面的组件具有如下坐标的项目:
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.92.Final</version>
            <packaging>jar</packaging>
  • 它的的构件具有以下格式的名称:artifactId-version.packaging
  • 在这种情况下,它将产生这个构件:netty-all-4.1.9.Final.jar

三、依赖

项目的依赖是指编译和执行它所需要的外部构件。在大多数情况下,项目的依赖项也会有它自己的依赖。我们称这些依赖为你的项目的传递依赖。一个复杂的项目可能会有一个深层级的依赖树;

Maven提供了各种用于帮助理解和管理它的工具。Maven的声明在POM的元素中:

<dependencies>
   <dependency>
     <groupId/>
     <artifactId/>
     <version/>
     <type/>
     <scope/>
    <systemPath/>
  </dependency>
...
</dependencies>

在声明中,GAV坐标总是必不可少的。。type以及scope元素对于那些值不分别是默认值jar和compile的依赖来说也是必需的。

举个例子:

    <dependencies>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.92.Final</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

元素可以具有以下值。

  • compile—编译和执行需要的(默认值)。
  • runtime—只有执行需要。
  • optional——不被引用了这个项目所产生的构件的其他项目,视为传递依赖。
  • provided——不会被包含在由这个 POM 产生的 WAR 文件的 WEB_INF/lib 目录中。
  • test——只有编译和测试的执行需要。
  • import——这将在后面的“依赖管理”一节进行讨论。
  • systemPath元素用来指定文件系统中的绝对位置。

Maven 用来管理项目依赖的方式,包括了一个用来存储和获取这些依赖的存储库协议,已经彻底地改变了在项目之间共享 JAR 文件的方式,从而有效地消除了项目的中每个开发人员都维护一个私有 lib 目录时经常会出现的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/657046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年前端面试汇总-计算机网络

1. HTTP协议 1.1. GET和POST的请求的区别 Post 和 Get 是 HTTP 请求的两种方法&#xff0c;其区别如下&#xff1a; 1. 应用场景 GET 请求是一个幂等的请求&#xff0c;一般 Get 请求用于对服务器资源不会产生影响的场景&#xff0c;比如说请求一个网页的资源。而 Post 不是…

如何在Ubuntu上安装MongoDB?

一、Ubuntu安装MongoDB MongoDB安装很简单&#xff0c;无需下载源文件&#xff0c;可以直接用apt-get命令进行安装。 打开终端&#xff0c;输入以下命令 sudo apt-get install mongodb这时装好以后应该会自动运行mongod程序&#xff0c;通过命令查看进程是否已经启动 pgrep …

Spring 实现AOP常见的两种方式(注解或者自定义注解)

第一种 导入AOP相关坐标(依赖冲突解决办法&#xff0c;将依赖中版本号删除&#xff0c;springboot会自动匹配合适的版本 ) <dependencies><!--spring核心依赖&#xff0c;会将spring-aop传递进来--><dependency><groupId>org.springframework</gr…

自动化测试必会之数据驱动测试

数据驱动测试 在实际的测试过程中&#xff0c;我们会发现好几组用例都是相同的操作步骤&#xff0c;只是测试数据的不同&#xff0c;而我们往往需要编写多次用例来进行测试&#xff0c;此时我们可以利用数据驱动测试来简化该种操作。 参数化&#xff1a; 输入数据的不同从而产…

C语言:输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。

题目&#xff1a; 描述 输入两个升序排列的序列&#xff0c;将两个序列合并为一个有序序列并输出。 输入描述&#xff1a; 输入包含三行&#xff0c; 第一行包含两个正整数n, m&#xff0c;用空格分隔。n表示第二行第一个升序序列中数字的个数&#xff0c;m表示第三…

C++ 教程(12)——循环

C 循环 有的时候&#xff0c;可能需要多次执行同一块代码。一般情况下&#xff0c;语句是顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 编程语言提供了允许更为复杂的执行路径的多种控制结构。 循环语句允许我们多次…

朋友圈功能合集来咯!定时发朋友圈,查看朋友圈,朋友圈跟圈,一键转发朋友圈,延迟评论

&#x1f30a;发布朋友圈 功能介绍&#xff1a;可使用已登录在系统上的微信号发送朋友圈。支持发送图片、文字、视频和公众号链接等几种类型的内容。 &#xff08;1)朋友圈内容编辑&#xff1a;可以在输入框中输入要发送的文本&#xff0c;并在浮窗中选择表情。上传图片可以点…

【c++11】c++11特性

c11 c11简介列表初始化std::initializer_list autodecltypenullptr 结语 c11简介 从C0x到C11&#xff0c;C标准10年磨一剑&#xff0c;第二个真正意义上的标准珊珊来迟。相比于C98/03&#xff0c;C11则带来了数量可观的变化&#xff0c;其中包含了约140个新特性&#xff0c;以…

QT QTreeView\QTreeWidget控件 使用详解

本文详细的介绍了QTreeView、QTreeWidget控件的各种操作&#xff0c;例如&#xff1a;新建界面、QTreeWidget、QTreeView、控件布局、设置列、设置宽高、设置列表头、设置复选框、设置图标、添加树、删除树、查找树、修改树、设置选中、树排序、事件、信号、槽函数、添加节点、…

【玩转Docker小鲸鱼叭】MacOS系统安装Docker

安装Docker Mac 系统安装 Docker 其实很简单&#xff0c;我们在官方文档下载安装一下就可以了&#xff0c;但是需要注意 Docker 官方建议 MacOS 必须是版本 11 或更高版本&#xff0c;如果版本较低&#xff0c;建议先升级 MacOS 版本。 可以通过左上角的小  图片查看系统版…

浅析Spring-kafka源码——消费者模型的实现

SpringBoot项目中的消费端实现而言,Spring-kafka没有用原生的ConsumerConnector,,而是借助原生client的拉取消息功能做了自己的消费模型的实现,提供了@KafkaListener注解这种方式实现消费。 开发中在使用Spring-kafka时,一般也都是通过使用@KafkaListener注解的方法来实现…

Android MPAndroidChart折线图渐变填充实现

效果如下&#xff1a; 以下是一个从上到下渐变的drawable&#xff0c;上面是蓝色&#xff0c;逐步向下变成白色&#xff1a; chart_bg.xml <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk…

静态链接和动态链接 -- 静态加载(隐式调用)和动态加载(显式调用)

区别 静态链接和动态链接 静态链接 : 由链接器在链接时将库的内容加入到可执行程序中&#xff0c;这里的库是静态库&#xff0c;Windows下是*.lib后缀&#xff0c;Linux下是*.a后缀。动态链接 : 可执行程序加载时(静态加载) 或者 运行时(动态加载)&#xff0c;将库文件中的内容…

OpenShift Virtualization - 通过外部固定 IP 访问 VM 中的服务(附视频)

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.12 的环境中验证 文章目录 方法1&#xff1a;通过 Service 的 NodePort 访问 VM方法2&#xff1a;通过外部 IP 访问 VM确认 OpenShift 集群环境为 Worker 节点添加 Linux Bridge创建使用 Li…

『DevOps最佳实践』使用Jenkins和Harbor进行持续集成和交付的解决方案

&#x1f4e3;读完这篇文章里你能收获到 全文采用图文形式讲解学会使用Harbor配置项目学会在Jenkins中配置Harbor推送权限使用Jenkins和Harbor进行持续集成的实践感谢点赞收藏&#xff0c;避免下次找不到~ 文章目录 一、准备工作1. 环境准备2. 修改Docker配置文件3. Docker登陆…

2023蓝桥杯大学A组C++国赛游记+个人题解

Day0 发烧了一晚上没睡着&#xff0c;感觉鼻子被打火机烧烤一样难受&#xff0c;心情烦躁 早上6点起来吃了个早饭&#xff0c;思考能力完全丧失了&#xff0c;开始看此花亭奇谭 看了六集&#xff0c;准备复习数据结构考试&#xff0c;然后秒睡 一睁眼就是下午2点了 挂了个…

04- c语言数组 (C语言)

一 数组的概念 1、在程序设计中&#xff0c;为了方便处理数据把具有相同类型的若干变量按有序形式组织起来,这些按序排列的 同类数据元素的集合 称为 数组。 2、在C语言中&#xff0c;数组属于构造数据类型。一个数组可以分解为多个数组元素&#xff0c;这些数组元素可以是基本…

力扣动态规划专题(三)完全背包 518.零钱兑换II 377. 组合总和 Ⅳ 70. 爬楼梯 322. 零钱兑换 279.完全平方数 步骤及C++实现

文章目录 完全背包一维dp数组 滚动数组 518.零钱兑换II377. 组合总和 Ⅳ70. 爬楼梯322. 零钱兑换279.完全平方数139.单词拆分 完全背包 完全背包的物品数量是无限的&#xff0c;01背包的物品数量只有一个 完全背包和01背包分许步骤一样&#xff0c;唯一不同就是体现在遍历顺序上…

deque的介绍

前言 为什么会存在deque呢&#xff1f;在c标准库中deque是作为 stack和queue的底层容器就是deque&#xff0c;我们要是了解过list和vector就会知道这两种容器各有优劣&#xff0c;vector的优点是支持随机访问&#xff0c;进而可以支持排序和二分查找等算法&#xff0c;它的缺点…

鼠标事件 获取鼠标坐标及点击事件

运行效果&#xff1a; 头文件 #ifndef MOUSEEVENT_H #define MOUSEEVENT_H #include #include #include #include class MouseEvent : public QMainWindow { Q_OBJECT public: MouseEvent(QWidget *parent 0); ~MouseEvent(); protected: void mousePressEvent(QMouse…