文章目录
前言
mavenjava_9">一、maven:一款管理和构建java项目的工具
1 基本概念
参考视频
-
什么是maven?
Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建。
POM: project object model -
官网:http://maven.apache.org/
-
Maven的作用?
-
依赖管理
方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题。 -
统一项目结构
提供标准、统一的项目结构
-
项目构建
标准跨平台(Linux、Windows、MacOS)的自动化项目构建方式
maven提供了指令可以快速的将项目进行 编译、打包这些工作
-
-
工作原理:
参考视频
maven_39">2 maven的安装与配置
maven_40">(1)maven的安装
参考视频:安装很简单,直接跟着视频来做就可以了
- 安装步骤:
最好去官网下载最新版本装,不然有可能有插件要求的maven版本太低,我使用是装的3.9.9版本的
<!-- 配置华为的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_72">当前项目工程设置 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,默认就是使用我们全局配置的信息。
maven_136">(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:定义当前项目版本号
maven_197">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),阶段是有顺序的,后面的阶段依赖于前面的阶段。
我们只关注其中的五个
- 生命周期阶段
- 执行指定生命周期的两种方式
- 在idea中,右侧的maven工具栏,选中对应的生命周期,双击执行
- 在命令行中,通过命令执行
maven_295">二、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;
java">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手段。