Maven学习

Maven介绍

Maven是Apache的一个开源项目,主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。
Maven可以让团队能够更科学的构建项目,我们可以用配置文件的方式,对项目的名称、描述、项目版本号、项目依赖等信息进行描述,这使得我们项目结构更加清晰,从而能快速上手项目。
由于项目可能需要第三方库,所以Maven提出了Maven仓库的概念。把需要的依赖都放在仓库中,当项目需要时,就可以去Maven仓库中去获取;同时,其他项目组也需要同样的第三方库时,也可以直接去Maven获取。这样,大家都可以直接通过Maven获取依赖,而不需要单独去找资源了。

Maven的四大特性

依赖管理系统

Maven为Java引入了一个新的依赖管理系统jar包管理,jar升级时修改配置文件即可。Java中,一个依赖的唯一标识(Coordination,也称坐标)由以下三个部分组成:

  • groupId:定义当前Maven项目隶属的实际项目-公司名称。
  • artifactId:该元素定义实际项目中的一个Maven模块-项目名。推荐的做法是使用时机项目名称作为artifactId的前缀。
  • version:该元素定义Maven项目当前所处的版本。

一个典型依赖引用:

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>6.1.0-M2</version>
</dependency>
多模块构建

在Maven中需要定义一个parent POM作为一组module的聚合POM。在该POM中可以使用标签来定义一组子模块。pare POM不会有什么实际构建产出。而pare POM中的build配置以及依赖配置都会自动继承给子module。

一致的项目结构

Maven设置的理念是——Conversion over configuration (约定大于配置),其定制了一套项目目录结构作为标准的Java项目结构,解决了不同ide带来的文件目录不一致问题。

一致的构建模型和插件机制

在这里插入图片描述

Maven 使用

Maven的目录结构


pom.xml的举例:
在这里插入图片描述
(大概了解一下它是什么样子就可以了)

  • modelVersion指明当前Pom模型的版本,对于Maven3来说,它只能是4.0.0。指定了当前Maven模型的版本号;
  • groupId 定义了项目所属组,这个组往往和项目所在的组织和公司存在关联,例如:com.baidu;
  • articactId 定义了当前Maven项目在组的唯一的ID;
  • version X.X.X-里程碑,第一个X 大版本,有重大变革;第二个X 小版本,修复bug,增加功能;第三个X 更新;
    • 里程碑版本:SNAPSHOT(快照,开发版);alpha(内部测试);beta(公开测试);Release | RC(发布版);GA(正常版)

Maven相关配置
找到Maven的配置文件:在这里插入图片描述
在settings中修改以下配置:
修改下载的依赖所存放的位置:
在这里插入图片描述
修改镜像,加快下载速度:
在这里插入图片描述
maven下载依赖:mvn compile

Maven命令

Maven的命令格式: mvn [plugin-name]:[goal-name]
命令代表的含义:执行plugin-name插件的goal-name目标。

命令描述
mvn -version显示版本信息
mvn clean清理项目生产的临时文件,一般是模块下的target目录
mvn compile编译源代码,一般编译模块下的src/main/java目录
mvn package项目打包工具,会在模块下的target目录生成jar或war等文件
mvn test测试命令,或执行src/test/java/下junit的测试用例
mvn install将打包的jar/war文件复制到你的本地仓库中,供其他模块使用
mvn deploy将打包的文件发布到远程参考,提供其他人员进行下载依赖
mvn site生成项目相关信息的网站
mvn eclipse:eclipse将项目转化为Eclipse项目
mvn dependency:tree打印出项目的整个依赖树
mvn archetype:generate创建Maven的普通java项目
mvn tomcat7:run在tomcat容器中运行web应用
mvn jetty:run调用Jetty插件的Run目标在Jetty Servlet容器中启动web应用

Tips: 运行maven命令的时候,要先定位到maven项目的目录,也就是项目pom.xml文件所在的目录。否则,必须以通过参数来指定项目的目录。
Maven命令的参数
1)-D传入属性参数
例如:mvn package -Dmaven.test.skip=true ,以-D开头,将maven.test.skip的值设置为true,就是告诉maven打包的时候跳过单元测试。同理, mvn deploy -Dmaven.test.skip=true 代表部署项目跳过单元测试。
2)-P使用指定的Profile配置
一般情况下,项目开发需要多个环境,包括开发、测试、预发、正式这4个环境,在pom.xml的配置(部分)如下:
在这里插入图片描述
profiles定义了各个环境的变量id,filters中定义了变量配置文件的地址,其中地址中的环境变量就是上面profile中定义的值,resources中定义哪些目录下的文件会被配置文件中定义的变量替换。
通过maven可以实现按不同环境进行打包部署,例如:mvn package -Pdev -Dmaven.test.skip=true 表示打包本地环境,并跳过单元测试。

在IDEA中集成Maven环境

局部设置: 通过File的setting进行:
在这里插入图片描述
全局设置: 通过File–>New Project Setup–> Setting for new projects,修改Maven home path为自己解压后的maven路径(bin的上一级目录)和User setting file为对应的文件所在地址。

编译项目
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
添加打包命令:
在这里插入图片描述
可以在此处进行命令切换:
在这里插入图片描述

Maven仓库的基本概念

对Maven来说,仓库只分为:本地仓库远程仓库
当Maven根据坐标寻找构件的时候,它首先会查看本地仓库,如果本地仓库存在,则直接使用;如果本地没有,Maven就会去远程仓库查找,发现需要的构件之后,下载到本地仓库再使用。如果本地仓库和远程仓库都没有,Maven就会报错。
在这里插入图片描述
远程仓库分为三种:中央仓库私服其他公共库

  • 中央仓库是默认配置,Maven下载jar包的地方。
  • 私服是另一种特殊的远程仓库,为了节省带宽和时间,在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库。内部的项目还能部署到私服上供其他项目使用。当Maven需要下载构件时,它会先去私服中找,如果私服中没有,则从外部远程仓库下载,并缓存在私服上,再为Maven提供服务。
  • 其他公共库,例如阿里云仓库,如:
    在这里插入图片描述
Maven环境下构件多模块项目

使用Maven提供的多模块构建的特征性完成Maven环境下多个模块的项目的管理与构建:

  • 模块 maven_parent——基模块,就是场所的parent(pom)
  • 模块 maven_dao——数据库的访问层,例如jdbc操作(jar)
  • 模块 maven_service——项目的业务逻辑层(jar)
  • 模块 maven_controller——用来接收请求,响应数据(war)

(先简单了解一下就行,后面学习框架的时候就会理解了)

Maven的打包操作

对于Maven项目,我们可以通过用pom.xml配置的方式来实现打包时的环境选择。
1)建立对应的目录结构
使用idea创建项目时,目录结构可能会缺失,需要我们手动添加对应的目录:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2)添加Profile配置
在这里插入图片描述
3)设置资源文件配置
把以下的代码放在build标签对中,其中env指的是profile中<env><\env>标签中的值,具体是哪一个模块下的值,是由打包时的命令决定的。
在这里插入图片描述
4)执行打包操作
package -Pdev表示在打包时会去找id为dev的profile。
在这里插入图片描述
执行后得到的打包文件最终在src/target。

Maven依赖的基本概念

依赖的基本配置
根元素project下的dependencies可以包含多个dependence元素,以声明多个依赖,每个依赖都应该包含以下元素:

  • groupId, artifactId, Version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖;
  • Type:依赖的类型,大部分情况下不需要声明,默认为jar。
  • Scope:依赖范围(compile, test, provided, runtime, system)。
  • Optional:表级依赖是否可选。
  • Exclusive:用来排除传递性依赖。

依赖范围

  • compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。典型的例子是spring-core,在编译、测试和运行的时候都需要使用该依赖。
  • test:测试依赖范围。使用此依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此类依赖。典型的例子是JUnit,它只有在编译测试代码及运行测试的时候才需要。
  • provided:已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试class-path有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于Tomcat等容器已经提供,就不需要Maven重复地引入一遍。
  • runtime:运行时依赖范围。使用此依赖范围的Maven依赖,对于测试和运行class-path有效,但在编译主代码时无效。典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
  • system:系统依赖范围。该依赖与三种classpath的关系,和provided依赖范围完全一致。但是,使用system范围的依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建。一般不使用。
  • 依赖范围由弱到强是:test->runtime->provided->compile。

传递性依赖
传递性依赖机制让我们在使用某个jar的时候不需要考虑它依赖了什么,也不需要但因引入多余的依赖。Maven会解析各个直接依赖的POM,将哪些必要的间接依赖,以传递性依赖的形式引入到当前项目中。
注意:传递性依赖有可能产生冲突,如:
在这里插入图片描述
如果A下同时存在两个不同version的C,会发生冲突,此时应该选择同时满足条件的版本。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中文编程开发语言编程实际案例:程序控制灯电路以及桌球台球室用这个程序计时计费

中文编程开发语言编程实际案例&#xff1a;程序控制灯电路以及桌球台球室用这个程序计时计费 上图为&#xff1a;程序控制的硬件设备电路图 上图为&#xff1a;程序控制灯的开关软件截图&#xff0c;适用范围比如&#xff1a;台球厅桌球室的计时计费管理&#xff0c;计时的时候…

RedHat8升级GLIBC_2.29,解决ImportError: /lib64/libm.so.6: version `GLIBC_2.29

问题背景 在做大模型微调训练时&#xff0c;执行python脚本时出现如下报错&#xff1a; 查看当前服务器版本&#xff0c;确实没有GLIBC_2.29的 strings /lib64/libm.so.6 | grep GLIBC_ GLIBC_2.2.5 GLIBC_2.4 GLIBC_2.15 GLIBC_2.18 GLIBC_2.23 GLIBC_2.24 GLIBC_2.25 GLIB…

MySQL的优化利器:索引条件下推,千万数据下性能提升273%

MySQL的优化利器&#xff1a;索引条件下推&#xff0c;千万数据下性能提升273%&#x1f680; 前言 上个阶段&#xff0c;我们聊过MySQL中字段类型的选择&#xff0c;感叹不同类型在千万数据下的性能差异 时间类型&#xff1a;MySQL字段的时间类型该如何选择&#xff1f;千万…

[Go版]算法通关村第十八关青铜——透析回溯的模版

目录 认识回溯思想回溯的代码框架从 N 叉树说起有的问题暴力搜索也不行回溯 递归 局部枚举 放下前任Go代码【LeetCode-77. 组合】回溯热身-再论二叉树的路径问题题目&#xff1a;二叉树的所有路径Go 代码 题目&#xff1a;路径总和 IIGo 代码 回溯是最重要的算法思想之一&am…

【Jenkins 安装】

一&#xff1a;安装文件夹准备 在/home/admin 界面下新建三个文件夹&#xff0c;用来安装tomcat、maven 1.打开&#xff0c;/home/admin目录 cd /home/admin 2.新建三个文件夹 mkdir tomcat mkdir maven 二&#xff1a;安装tomcat 1.打开tomcat目录进行tomcat的安装 访问:h…

LSKA(大可分离核注意力):重新思考CNN大核注意力设计

文章目录 摘要1、简介2、相关工作3、方法4、实验5、消融研究6、与最先进方法的比较7、ViTs和CNNs的鲁棒性评估基准比较8、结论 摘要 https://arxiv.org/pdf/2309.01439.pdf 大型可分离核注意力&#xff08;LSKA&#xff09;模块的视觉注意力网络&#xff08;VAN&#xff09;已…

SpringDoc API文档工具集成SpringBoot - Swagger3

1、引言 之前在Spring Boot项目中一直使用的是SpringFox提供的Swagger库&#xff0c;发现已经超过3年没出新版本了&#xff01;SpringDoc是一款可以结合Spring Boot使用的API文档生成工具&#xff0c;基于OpenAPI 3&#xff0c;是一款更好用的Swagger库&#xff01;值得一提的是…

高速下载b站视频的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

JAVA 链式编程和建造者模式的使用(lombok的使用)

0.说明 0.1 链式编程 链式编程的原理是返回一个this对象&#xff0c;也就是返回对象本身&#xff0c;从而达到链式效果。这样可以减少一些代码量&#xff0c;是java8新增的内容。 此处主要介绍在新建对象使用链式编程更加方便的创建对象。链式编程的一些常见用法可以看这个&a…

C++笔记之初始化二维矩阵的方法

C笔记之初始化二维矩阵的方法 —— 2023年5月20日 上海 code review! 文章目录 C笔记之初始化二维矩阵的方法一.常见方法1. 使用数组2. 使用向量3. 使用数组的动态分配4. 使用嵌套的 std::vector 并使用resize方法5. 初始化固定大小的 std::array 二.C中使用vector初始化二维矩…

CSS3属性详解(一)文本 盒模型中的 box-ssize 属性 处理兼容性问题:私有前缀 边框 背景属性 渐变 前端开发入门笔记(七)

CSS3是用于为HTML文档添加样式和布局的最新版本的层叠样式表&#xff08;Cascading Style Sheets&#xff09;。下面是一些常用的CSS3属性及其详细解释&#xff1a; border-radius&#xff1a;设置元素的边框圆角的半径。可以使用四个值设置四个不同的圆角半径&#xff0c;也可…

基于Java的新闻发布管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

华为云HECS云服务器docker环境下安装nacos

华为云HECS云服务器&#xff0c;安装docker环境&#xff0c;查看如下文章。 华为云HECS安装docker-CSDN博客 一、拉取镜像 docker pull nacos/nacos-server二、宿主机创建挂载目录 执行如下命令&#xff1a; mkdir -p /usr/local/nacos/logs mkdir -p /usr/local/nacos/con…

基于指数分布优化的BP神经网络(分类应用) - 附代码

基于指数分布优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于指数分布优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.指数分布优化BP神经网络3.1 BP神经网络参数设置3.2 指数分布算法应用 4.测试结果…

模型保存和加载

1、sklearn模型的保存和加载API from sklearn.externals import joblib 保存&#xff1a;joblib.dump(rf, ‘test.pkl’)加载&#xff1a;estimator joblib.load(‘test.pkl’) 2、决策树的模型保存加载案例 保存&#xff1a; import joblib from sklearn.model_selectio…

OpenCV #以图搜图:感知哈希算法(Perceptual hash algorithm)的原理与实验

1. 介绍 感知哈希算法&#xff08;Perceptual Hash Algorithm&#xff0c;简称pHash&#xff09; 是哈希算法的一种&#xff0c;主要用来做相似图片的搜索工作。 2. 原理 感知哈希算法&#xff08;pHash&#xff09;首先将原图像缩小成一个固定大小的像素图像&#xff0c;然后…

【模式识别】贝叶斯决策模型理论总结

贝叶斯决策模型理论 一、引言二、贝叶斯定理三、先验概率和后验概率3.1 先验概率3.2 后验概率 四、最大后验准则五、最小错误率六、最小化风险七、最小最大决策八、贝叶斯决策建模参考 一、引言 在概率计算中&#xff0c;我们常常遇到这样的一类问题&#xff0c;某事件的发生可…

MobileNetV3

相对重量级网络而言&#xff0c;轻量级网络的特点是参数少、计算量小、推理时间短。更适用于存储空间和功耗受限的场景&#xff0c;例如移动端嵌入式设备等边缘计算设备。因此轻量级网络受到了广泛的关注&#xff0c;其中MobileNet可谓是其中的佼佼者。MobileNetV3经过了V1和V2…

iOS 配置通用链接(Universal Link)服务端和开发者后台都配置好了,还是跳转不到App

目录 一、什么是 Universal Link&#xff1f; 1.背景介绍 2.特点 3.运行机制原理&流程图 二、配置教程 1.第一步&#xff1a;开启 Associated Domains 服务 1.1 开通 Associated Domains 2.第二步&#xff1a;服务器配置 apple-app-site-association&#xff08;AAS…

RISC-V架构——中断处理和中断控制器介绍

1、ARM架构中断机制介绍 本文不是从零开始讲解中断&#xff0c;对于中断的基本知识不再赘述&#xff0c;对中断不是很了解可以先学习ARM中断的文章。参考博客&#xff1a;《ARM架构的外部中断介绍(S5PV210芯片)》&#xff1b; 2、RIAC_V架构的中断控制器架构 &#xff08;1&…