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,会发生冲突,此时应该选择同时满足条件的版本。
相关文章:

Maven学习
Maven介绍 Maven是Apache的一个开源项目,主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。 Maven可以让团队能够更科学的构建项目,我们可以用配置文件的方式,对项目的名称、描述、项目版本号、项目依赖等信息进行描述…...

《动手学深度学习 Pytorch版》 10.2 注意力汇聚:Nadaraya-Watson 核回归
import torch from torch import nn from d2l import torch as d2l1964 年提出的 Nadaraya-Watson 核回归模型是一个简单但完整的例子,可以用于演示具有注意力机制的机器学习。 10.2.1 生成数据集 根据下面的非线性函数生成一个人工数据集,其中噪声项 …...

测试C#调用Windows Media Player组件
新建基于.net framework的Winform项目,可以通过添加引用的方式选择COM组件中的Windows Media Player组件,如下图所示: 也可以在VS2022的工具箱空白处点右键,选择“选择项…”菜单。 在弹出的选择工具箱项窗口中…...
面试经典150题——Day20
文章目录 一、题目二、题解 一、题目 14. Longest Common Prefix Write a function to find the longest common prefix string amongst an array of strings. If there is no common prefix, return an empty string “”. Example 1: Input: strs [“flower”,“flow”…...

[SQL开发笔记]AND OR运算符复杂表达式开发实例
结合 AND & OR实例:通过圆括号使用and或or来组成复杂的表达式 目标数据库及表:使用 DRobot数据库,"T_Drobot" 表 假设我们需要查询"T_Drobot" 表,并从"T_Drobot"表中查询选取creator为 "…...

如何将本地 PDF 文件进行翻译
在日常工作和学习中,我们经常会遇到需要翻译 PDF 文件的情况。比如,我们需要将一份英文的技术文档翻译成中文,或者将一份中文的法律文件翻译成英文。 传统上,我们可以使用专业翻译软件或服务来翻译 PDF 文件。但是,这…...
Node.js的readline模块 命令行交互的模块
Node.js是一个非常流行的JavaScript运行时环境,它提供了许多内置模块来帮助我们开发应用程序。其中之一是readline模块,它提供了一种简单的方法来读取用户输入并进行交互。 本文将详细介绍readline模块的API和使用案例,并附有代码注释。 re…...

前沿重器[36] | ACL23-基于检索的大语言模型-报告阅读
前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享,从中抽取关键精华的部分和大家分享,和大家一起把握前沿技术。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。(算起来,专项启动已经…...
2023秋招笔试算法Python3题解
诸神缄默不语-个人CSDN博文目录 签两方了,感觉秋招已经结束了,所以发布一下之前写的笔试编程题题解。 不全。可能有些题我会继续补。 不保证能过。 后续依然有可能继续刷算法题,但是就另外专门写博文来解析了。 打码是因为原则上其实是不让公…...

uniapp--点击上传图片到oss再保存数据给后端接口
项目采用uniapp与uview2.0组件库 --1.0的也可以参考一下,大差不差 一、项目要求与样式图 点击上传n张图片到oss,然后点击提交给后端 二、思路 1、打开上传按钮,弹出框内出现上传图片和提交按钮 2、点击上传图片区域,打开本地图…...
创建Secret(使用kubectl)
创建Secret(使用kubectl) 假设某个 Pod 需要访问数据库。在您执行 kubectl 命令所在机器的当前目录,创建文件 ./username.txt 文件和 ./password.txt 暂存数据库的用户名和密码,后续我们根据这两个文件配置 kubernetes secrets。…...

Notepad++正则查询替换操作
Notepad编辑器查找功能非常强大,本处记录一些实战中常用到复杂查询替换操作。 注意:如果是重要文件,替换操作前最好备份;当前一个操作后也可以用ctrlz恢复。 查找重复行 用查找(ctrlf)功能,用正则表达式模式匹配。 查…...
Hive特殊函数的使用
Hive特殊函数的使用 with ascastget_json_objectunix_timestampfrom_unixtime with as 在Hive中,WITH AS是一种子查询的用法,用于在查询的开头定义一个临时表达式。它的语法结构如下: WITH [表达式名称] AS (子查询表达式 )在这个结构中,[表…...

Unity Spine 指定导入新Spine动画的默认材质
指定导入新Spine动画的默认材质 找到Spine的Editor导入配置如何修改方法一: 你可以通过脚本 去修改Assets/Editor/SpineSettings.asset文件方法二:通过面板手动设置 找到Spine的Editor导入配置 通常在 Assets/Editor/SpineSettings.asset 配置文件对应着 Edit/Prefe…...

lvs负载均衡集群
目录 一、集群: 1、集群的目的: 2、集群的类型: 3、集群的可靠性指标: 4、设计集群时需要考虑的原则: 二、lvs集群: 1、lvs集群中的术语: 2、lvs访问的大致流程: 三、lvs的…...

MySQL---表的增查改删(CRUD基础)
文章目录 什么是CRUD?新增(Create)单行数据 全列插入多行数据 指定列插入 查询(Retrieve)全列查询指定列查询查询字段为表达式起别名查询去重查询排序查询条件查询分页查询 修改(Update)删除&…...

听GPT 讲Rust源代码--library/std(2)
File: rust/library/std/src/sys_common/wtf8.rs 在Rust源代码中,rust/library/std/src/sys_common/wtf8.rs这个文件的作用是实现了UTF-8编码和宽字符编码之间的转换,以及提供了一些处理和操作UTF-8编码的工具函数。 下面对这几个结构体进行一一介绍&…...

力扣第1005题 K 次取反后最大化的数组和 c++ 贪心 双思维
题目 1005. K 次取反后最大化的数组和 简单 相关标签 贪心 数组 排序 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组: 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以…...

Swoole 4.8版本的安装
1、从github拉取安装包 Release v4.8.13 swoole/swoole-src GitHub 2、解压压缩包 tar -zxvf ./v4.8.13.tar.gzcd ./swoole-src-4.8.13 3、执行安装命令 phpize && \ ./configure && \ make && sudo make install 4、检查swoole模块是否安装完成…...

ChatGPT和Copilot协助Vue火速搭建博客网站
AI 对于开发人员的核心价值 网上会看到很多 AI 的应用介绍或者教程 使用 AI 聊天,咨询问题 —— 代替搜索引擎使用 AI 写各种的电商文案(淘宝、小红书)使用 AI 做一个聊天机器人 —— 这最多算猎奇、业余爱好、或者搞个套壳产品来收费 以上…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...