6 maven工具的使用、maven项目中使用日志
文章目录
- 前言
- 一、maven:一款管理和构建java项目的工具
- 1 基本概念
- 2 maven的安装与配置
- (1)maven的安装
- (2)IDEA集成Maven配置
- 当前项目工程设置 maven
- 全局设置
- (3)创建一个maven项目
- 3 pom.xml文件
- 4 导入maven项目
- 5 依赖管理
- (1)依赖配置
- (2)依赖传递
- 特性1:坐标引入一个jar包会将其需要的依赖jar包一起引入进来
- 特性2:坐标引入项目中其他模块(在本项目一个模块中将另一个项目当依赖引进来)
- (3)排除指定依赖
- (4)依赖范围
- (5)生命周期(编译、打包)
- 二、maven中使用日志
- 三、maven进阶:高级使用
前言
一、maven:一款管理和构建java项目的工具
1 基本概念
参考视频
-
什么是maven?
Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建。
POM: project object model -
官网:http://maven.apache.org/
-
Maven的作用?
-
依赖管理
方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题。 -
统一项目结构
提供标准、统一的项目结构

-
项目构建
标准跨平台(Linux、Windows、MacOS)的自动化项目构建方式
maven提供了指令可以快速的将项目进行 编译、打包这些工作
-
-
工作原理:
参考视频

- 仓库: 用于存储资源,管理各种jar包。
- 本地仓库: 自己计算机上的一个目录。
- 中央仓库: 由Maven团队维护的全球唯一的。仓库地址: https://repo1.maven.org/maven2/
- 远程仓库(私服): 一般由公司团队搭建的私有仓库。
- 仓库: 用于存储资源,管理各种jar包。
2 maven的安装与配置
(1)maven的安装
参考视频:安装很简单,直接跟着视频来做就可以了
- 安装步骤:
最好去官网下载最新版本装,不然有可能有插件要求的maven版本太低,我使用是装的3.9.9版本的- 解压 apache-maven-3.6.1-bin.zip
下载地址:https://maven.apache.org/download.cgi - 配置本地仓库: 修改 conf/settings.xml中的<localRepository>为一个指定目录

- 配置阿里云私服:修改 conf/settings.xml中的<mirrors>标签,为其添加如下子标签:
这个阿里云已经失效,我们改为华为云 - 配置环境变量: MAVEN HOME为maven的解压目录,并将其bin目录加入PATH环境变量
- 解压 apache-maven-3.6.1-bin.zip
<!-- 配置华为的Maven镜像 --><mirror><id>huaweicloud</id><mirrorOf>*</mirrorOf><url>https://mirrors.huaweicloud.com/repository/maven/</url></mirror><!-- 配置官方的Maven镜像 --><mirror><id>central</id><name>Maven Central</name><url>https://repo1.maven.org/maven2/</url><mirrorOf>central</mirrorOf></mirror>
(2)IDEA集成Maven配置
当前项目工程设置 maven
1、创建一个空的项目



2、选择 IDEA中 File => Settings => Build,Execution,Deployment => Build Tools => Maven

3、设置IDEA使用本地安装的Maven,并修改配置文件及本地仓库路径

Maven home path :指定当前Maven的安装目录
User settings file :指定当前Maven的settings.xml配置文件的存放路径
Local repository :指定Maven的本地仓库的路径 (如果指定了settings.xml, 这个目录会自动读取出来, 可以不用手动指定)
4、配置工程的编译版本为17
- Maven默认使用的编译版本为5(版本过低)


上述配置的maven环境,只是针对于当前工程的,如果我们再创建一个project,又恢复成默认的配置了。 要解决这个问题, 我们就需要配置全局的maven环境。
全局设置
1、进入到IDEA欢迎页面

2、打开 All settings , 选择 Build,Execution,Deployment => Build Tools => Maven

3、配置工程的编译版本为17


这里所设置的maven的环境信息,并未指定任何一个project,此时设置的信息就属于全局配置信息。 以后,我们再创建project,默认就是使用我们全局配置的信息。
(3)创建一个maven项目
1、创建一个空的项目

2、创建模块,选择Maven,点击Next

创建出来的目录如下:

3、手动创建main和test目录下的:resources文件夹

这样就创建了一个完整的maven项目目录

3 pom.xml文件
创建了一个maven项目或者模块就会生成一个pom.xml文件,这个文件就可以看做这个项目的一个配置文件
这个配置文件就可以指定maven的坐标和jar包的依赖管理
<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"><modelVersion>4.0.0</modelVersion><groupId>cn.hjblogs</groupId> <!--包名,也可以理解为组织名--><artifactId>test_model</artifactId> <!--项目名或者模块名--><version>1.0-SNAPSHOT</version> <!--版本号--><packaging>jar</packaging> <name>test_model</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency></dependencies>
</project>
-
什么是坐标?
Maven 中的坐标是资源的唯一标识,通过该坐标可以唯一定位资源位置
使用坐标来定义项目或引入项目中需要的依赖。 -
Maven 坐标主要组成
groupld:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itheima)
artifactld:定义当前Maven项目名称(通常是模块名称,例如 order-service、goods-service)
version:定义当前项目版本号

4 导入maven项目
参考视频
5 依赖管理
(1)依赖配置
参考视频
- 依赖:指当前项目运行所需要的jar包,一个项目中可以引入多个依赖
- 配置:
- 在 pom.xml中编写<dependencies>标签
- 在<dependencies>标签中 使用<dependency>引入坐标
- 定义坐标的 groupld,artifactld,version
- 点击刷新按钮,引入最新加入的坐标

- 注意
-
如果引入的依赖,在本地仓库不存在,将会连接远程仓库/中央仓库,然后下载依赖。(这个过程会比较耗时,耐心等待)
-
下面这个网址可以找到各种jar包依赖的maven坐标,我们直接去找即可
https://mvnrepository.com/artifact/ch.qos.logback/logback-classic/1.2.3 -
<scope>test</scope>:这个处理junit这些只有测试会用到的依赖,不要加;
如果不知道应不应该加,一句话不加一定不会有问题,加了可能会有问题
如果某个依赖仅用于编写和运行测试代码,比如测试框架(JUnit、Mockito 等),那么可以将其作用范围设置为 test,这样可以减小最终构建产物的大小,避免不必要的依赖被打包进去。如果某个依赖是项目正常运行所必需的,那么应该使用默认的 compile 范围。
-

如果右上角小按钮没有:可以下面

刷新等待下载完成,红色报错信息消失就是配置好了,我们可以尝试一下。

(2)依赖传递
参考视频
- 依赖具有传递性
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源

特性1:坐标引入一个jar包会将其需要的依赖jar包一起引入进来

可以看到,我只引入了一个logback-classic,自动就将另外两个 logback-core、slf4j这两个包也一起拉进来了
特性2:坐标引入项目中其他模块(在本项目一个模块中将另一个项目当依赖引进来)
-
创建了两个meaven模块:test_model和test_model02
通过下面这样就可以在test_model中引入了test_model02,并且test_model02中原理引入的jar包这些也会被引入到test_model
这就是maven的依赖传递的强大之处 -
注意,千万不要循环依赖了

下面这个显示图就可以展示依赖图:


(3)排除指定依赖
参考视频
在依赖传递中,我们有时候会有一些依赖冲突问题,那么我们可以将冲突的版本依赖排除出去
- 排除依赖
排除依赖指主动断开依赖的资源,被排除的资源无需指定版本。

(4)依赖范围
参考视频
依赖的jar包,默认情况下,可以在任何地方使用。可以通过<scope>…</scope>设置其作用范围
- 作用范围:
- 主程序范围有效。(main文件夹范围内)
- 测试程序范围有效。(test文件夹范围内)
- 是否参与打包运行。(package指令范围内)

<scope>…</scope>设置其作用范围

(5)生命周期(编译、打包)
参考视频
Maven的生命周期就是为了对所有的maven项目构建过程进行抽象和统一

- Maven中有3套相互独立的生命周期
- clean:清理工作
- default:核心工作,如:编译、测试、打包、安装、部署等
- site:生成报告、发布站点等
每套生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。

我们只关注其中的五个
- 生命周期阶段
- clean:移除上一次构建生成的文件(就是删除运行产生的target这个文件夹:将上一次编译的所有字节码文件删除了就)
- compile:编译项目源代码(编译成字节码文件,会发现生成了一个target文件夹)
- test:使用合适的单元测试框架运行测试(junit)(就是运行当前项目中的所有单元测试里面的方法)
- package:将编译后的文件打包,如:jar、war等(将模块打包成jar文件放在target文件夹下)
- install:安装项目到本地仓库(就是将打包好的jar包安装到maven的本地仓库中)
在IDEA中的maven面板中可以看到

- 执行指定生命周期的两种方式
- 在idea中,右侧的maven工具栏,选中对应的生命周期,双击执行
- 在命令行中,通过命令执行

二、maven中使用日志
- step1:
现在pom文件中导入依赖
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version>
</dependency>
- step2:在 src/main/resources 下添加 Logback 配置文件 logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"><!-- 日志存放路径 --><property name="log.path" value="logs/rtvc-pattern" /><!-- 日志输出格式 --><property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" /><!-- 控制台输出 --><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${log.pattern}</pattern></encoder></appender><!-- 系统日志输出 --><appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/info.log</file><!-- 循环政策:基于时间创建日志文件 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志文件名格式 --><fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 60天 --><maxHistory>60</maxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>DEBUG</level><!-- 匹配时的操作:接收(记录) --><!-- <onMatch>ACCEPT</onMatch> --><!-- 不匹配时的操作:拒绝(不记录) --><!-- <onMismatch>DENY</onMismatch> --></filter></appender><appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/error.log</file><!-- 循环政策:基于时间创建日志文件 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志文件名格式 --><fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 60天 --><maxHistory>60</maxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>ERROR</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch></filter></appender><!-- 系统模块日志级别控制 --><logger name="com.cxmt" level="info" /><!-- Spring日志级别控制 --><logger name="org.springframework" level="warn" /><root level="info"><appender-ref ref="console" /></root><!--系统操作日志--><root level="info"><appender-ref ref="file_info" /><appender-ref ref="file_error" /></root>
</configuration>
- step3:代码中使用
特别注意这两个包别导错了,自动导包可能会导入成其他的
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
package cn.hjblogs;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** Hello world!**/public class App
{private static final Logger logger = LoggerFactory.getLogger(App.class);public static void main( String[] args ){logger.info("Hello World!111122");logger.error("Hello World!111122");logger.info("Logback configuration is loaded.");logger.error("This is a test error log.");logger.info("Logback configuration is loaded.");logger.error("This is a test error log.");logger.info("Logback configuration is loaded.");logger.error("This is a test error log.");}
}

可以看到控制台就会生成日志,本地相对路径对应的目录下也会生成logs文件下面记录日志。
如果部署到服务器上,服务器上的部署的当前工作目录也会生成这个logs目录,下面记录日志;这个是一种很重要的定位bug手段。
三、maven进阶:高级使用
相关文章:
6 maven工具的使用、maven项目中使用日志
文章目录 前言一、maven:一款管理和构建java项目的工具1 基本概念2 maven的安装与配置(1)maven的安装(2)IDEA集成Maven配置当前项目工程设置 maven全局设置 (3)创建一个maven项目 3 pom.xml文件…...
js滚动到页面最底部
setTimeout(()> { //延后执行,等页面渲染结束let container document.querySelector(.raise-flag-content); //找到当前divif (container) {container.scrollTop container.scrollHeight - (container.clientHeight - 400 );}})container.scrollTop container…...
Node.js包管理工具npm
目录 什么是 npm npm 主要功能 安装配置 npm 环境 package.json 版本范围规则 使用 npm npm 版本和帮助命令 npm 包相关命令 安装包 卸载包 升级第三方包 升级自己开发的包 查看已安装的包 清除缓存和修复 package.json 相关 运行命令脚本 全局配置 npm 包发布…...
基本数据结构--平衡二叉搜索树之红黑树示例代码
红黑树的规则。红黑树的每个节点有颜色(红或黑),满足以下性质: 每个节点是红或黑。根节点是黑的。叶子节点(NIL节点)是黑的。红节点的子节点必须是黑的。从任一节点到其所有后代叶子节点的路径包含相同数量…...
GB/T 43698-2024 《网络安全技术 软件供应链安全要求》标准解读
一、43698-2024标准图解 https://mmbiz.qpic.cn/sz_mmbiz_png/rwcfRwCticvgeBPR8TWIPywUP8nGp4IMFwwrxAHMZ9Enfp3wibNxnfichT5zs7rh2FxTZWMxz0je9TZSqQ0lNZ7lQ/640?wx_fmtpng&fromappmsg 标准在线预览: 国家标准|GB/T 43698-2024 相关标准: &a…...
Python内置函数map(), list(), len(), iter(), hex(), hash()的详细解析,包括功能、语法、示例及注意事项
1. map(function, iterable, ...) 功能:对可迭代对象中的每个元素应用指定函数,返回一个迭代器。 参数: function:要执行的函数(可以是lambda表达式)。 iterable:一个或多个可迭代对象&#x…...
CF 278A.Circle Line
题目分析 输入n个数据作为路径,求从a到b的最短距离,需要将其相成一个圆圈,既可以从小往大走又可以从大往小走 思路分析 依然将数据存为数组,通过下标进行操作,既然说了有两种方式那就计算两种方式哪个更快就输出谁 代…...
DeepSeek模型构建与训练
在完成数据预处理之后,下一步就是构建和训练深度学习模型。DeepSeek提供了简洁而强大的API,使得模型构建和训练变得非常直观。无论是简单的全连接网络,还是复杂的卷积神经网络(CNN)或循环神经网络(RNN),DeepSeek都能轻松应对。本文将带你一步步构建一个深度学习模型,并…...
本地部署deepseek简单教程
部署deepseek,首先需要知道deepseek官网地址:DeepSeek 第一步:Ollama 去ollama下载对应的版本,我的电脑是window 在这里可以看到关于deepseek相关 第二步,下载完ollama无脑下一步就可以 这样属于安装成功 第三步&…...
3.1 可视化算子编程语言
HuggingFists的VO编程语言与常见的其它编程语言有一定的区别。其语言由两种不同的语法特征构成。一部分以可视化算子作为语法基础(简称:VO-O),辅助使用者可视化的完成数据处理/分析流程的编写;一部分采用表达式语法(简称:VO-E)&am…...
UnityShader学习笔记——多种光源
——内容源自唐老狮的shader课程 目录 1.光源类型 2.判断光源类型 2.1.在哪判断 2.2.如何判断 3.光照衰减 3.1.基本概念 3.2.unity中的光照衰减 3.3.光源空间变换矩阵 4.点光源衰减计算 5.聚光灯衰减计算 5.1.聚光灯的cookie(灯光遮罩) 5.2.聚…...
电脑右下角小喇叭没反应怎么回事,快速解决方案
当电脑右下角的小喇叭(音量图标)没有反应时,可以尝试以下快速解决方案: 一、基础检查与操作 检查键盘音量键: 按下键盘上的音量增加或减少键,或尝试Fn音量键(部分笔记本需组合键)&a…...
chrome-base 如何实现一个BindOnce
考虑一个问题: worker_thread.task_runner()->PostDelayedTask(FROM_HERE, base::BindOnce(&Ref::Foo, ref, 1), base::Milliseconds(1000)); BindOnce 是如何实现的呢? 翻看源码:base\functional\bind.h 写的 非常简洁 // Bind a…...
HTML学习之CSS三种引入方式
HTML学习之CSS三种引入方式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>…...
Mysql基于binlog主从同步配置
主配置: 修改配置文件:/etc/my.cnf 添加server-id1 重启MySQL服务:systemctl restart mysqld 创建用户并授权: mysql> create user rep192.168.79.% identified with mysql_native_password by 123456; Query OK, 0 rows aff…...
Docker Desktop安装到其他盘
Docker Desktop 默认安装到c盘,占用空间太大了,想给安装到其他盘,网上找了半天的都不对 正确安装命令: start /w "" "Docker Desktop Installer.exe" install --installation-dirF:\docker命令执行成功&am…...
NetCore Consul动态伸缩+Ocelot 网关 缓存 自定义缓存 + 限流、熔断、超时 等服务治理
网关 OcelotGeteway 网关 Ocelot配置文件 {//单地址多实例负载均衡Consul 实现动态伸缩"Routes": [{// 上游 》》 接受的请求//上游请求方法,可以设置特定的 HTTP 方法列表或设置空列表以允许其中任何方法"UpstreamHttpMethod": [ "Get", &quo…...
ubuntu 本地部署deepseek r1 蒸馏模型
本文中的文件路径或网络代理需要根据自身环境自行删改 一、交互式chat页面 1.1 open-webui 交互窗口部署:基于docker安装,且支持联网搜索 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台,旨在完全离线操作。它支持各种 LLM…...
go语言中的反射
为什么会引入反射 有时我们需要写一个函数,这个函数有能力统一处理各种值类型,而这些类型可能无法共享同一个接口,也可能布局未知,也有可能这个类型在我们设计函数时还不存在,这个时候我们就可以用到反射。 空接口可…...
旅行社项目展示微信小程序功能模块和开发流程
旅行社当前旅游线路的程序(微信小程序),旨在帮助旅行社更高效地管理线下活动预订,同时为客户提供便捷的报名和查看功能。适用于短途游、团队建设等活动,支持在线预订、缴费及订单管理,可根据用户需求定制更多个性化服务,为公司提升品牌知名度与客户体验。通过简洁明了的…...
JUC学习笔记02
文章目录 JUC笔记2练习题:手写线程池代码解释:AdvancedThreadPool 类:WorkerThread 内部类:AdvancedThreadPoolExample 类: 线程池的思考CPU密集型IO密集型 练习题:手写自动重试机练习题:手写定…...
【论文翻译】DeepSeek-V3论文翻译——DeepSeek-V3 Technical Report——第一部分:引言与模型架构
论文原文链接:DeepSeek-V3/DeepSeek_V3.pdf at main deepseek-ai/DeepSeek-V3 GitHub 特别声明,本文不做任何商业用途,仅作为个人学习相关论文的翻译记录。本文对原文内容直译,一切以论文原文内容为准,对原文作者表示…...
python编程-类结构,lambda语法,原始字符串
一个类的基本结构包括以下部分: 类名:用来描述具有相同属性和方法的对象的集合。 属性:类变量或实例变量,用于处理类及其实例对象的相关数据。 方法:在类中定义的函数,用于执行特定操作。 构造器ÿ…...
C++:代码常见规范1
头文件包含 (1)先系统头文件,后用户头文件:这是一个良好的编程习惯。系统头文件通常包含标准库的定义,而用户头文件则包含项目特定的定义。将系统头文件放在前面可以避免因用户头文件中的定义与系统头文件冲突而导致的问题。 #include <…...
C++(进阶五)--STL--用一颗红黑树封装map和set
目录 1.红黑树源码(简略版) 2.模板参数的控制 3.红黑树的结点 4.迭代器的实现 正向迭代器 反向迭代器 5.set的模拟实现 6.map的模拟实现 7.封装完成后的代码 RBTree.h mymap.h myset.h 1.红黑树源码(简略版) 下面我们…...
DeepSeek服务器繁忙问题的原因分析与解决方案
一、引言 随着人工智能技术的飞速发展,DeepSeek 等语言模型在众多领域得到了广泛应用。然而,在春节这段时间的使用过程中,用户常常遭遇服务器繁忙的问题,这不仅影响了用户的使用体验,也在一定程度上限制了模型的推广和…...
《手札·开源篇》数字化转型助力永磁电机企业降本增效:快速设计软件如何让研发效率提升40%?
数字化转型助力永磁电机企业降本增效:快速设计软件如何让研发效率提升40%? 一、痛点:传统研发模式正在吃掉企业的利润 永磁电机行业面临两大挑战: 研发周期长:一款新电机从设计到量产需6-12个月,电磁计算…...
飞算JavaAI :AI + 时代下的行业趋势引领者与推动者
在科技飞速发展的当下,AI 时代正以前所未有的速度重塑着各个行业的格局,而软件开发领域更是这场变革的前沿阵地。在众多创新力量之中,飞算JavaAI 脱颖而出,宛如一颗璀璨的新星,凭借其独树一帜的特性与强大功能&#x…...
【重新认识C语言----结构体篇】
目录 -----------------------------------------begin------------------------------------- 引言 1. 结构体的基本概念 1.1 为什么需要结构体? 1.2 结构体的定义 2. 结构体变量的声明与初始化 2.1 声明结构体变量 2.2 初始化结构体变量 3. 结构体成员的访…...
解决错误:CondaHTTPError: HTTP 000 CONNECTION FAILED for url
解决错误:CondaHTTPError: HTTP 000 CONNECTION FAILED for url 查看channels:vim ~/.condarcshow_channel_urls: true channels:- http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/- http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/…...
