Maven深入浅出

本文详细介绍Maven的基础概念、安装配置步骤、依赖管理方法及其在项目构建中的应用。涵盖Maven仓库(包括中央仓库和私服)、项目配置文件pom.xml解析、依赖范围说明以及常见命令的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Maven总结

 

学习目标: Maven简介、Maven仓库、Maven的安装和配置、Maven的使用

 

1.何为Maven

Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、依赖管理和项目信息管理。

2.Maven是优秀的构建工具

自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。是跨平台的,无论是Windows上,还是LinuxMac上,都使用相同命令。

3.Maven不仅仅是构建工具,也是依赖管理工具、项目信息管理工具。

4.Maven仓库

Maven仓库就是放置所有JAR文件(WARZIPPOM等等)的地方,所有Maven项目可以从同一个Maven仓库中获取自己所需要的依赖JAR

Maven仓库分类

 

5.Maven仓库——中央仓库

查询中央仓库地址   http://search.maven.org

6.Maven仓库——私服    

私服地址  http://10.10.8.201:8081/nexus/index.html

私服:一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。

私服优点:节省自己的外网带宽、加速Maven构建、部署第三方构件、提高稳定性,增强控制、降低中央仓库的负荷。

 

 工作当中要用的地址:

 <mirror>

      <id>alimaven</id>

      <name>aliyun maven</name>

      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>

      <mirrorOf>central</mirrorOf>        

    </mirror>

7.Maven安装和配置

1.http://maven.apache.org/download.html下载最新的maven,解压到指定目录。

2.配置环境变量

3.控制台中执行mvnv测试是否配置成功

   出现如下字样:

 

 

4.添加需要使用的Maven位置【安装——环境准备】

   

5.设置用户settings.xml文件

 

8.Maven使用:新建一个Maven支持的web项目,选择maven-archetype-webbapp模板。

9. Maven项目目录

 

10. Maven使用

1. 新建一个Maven支持的web项目,选择 maven-archetype-webbapp模板。

2.检查项目的编码是否是utf-8,检查项目使用的jdk版本。

3.修改项目基本信息。

4.配置项目的自定义属性及项目依赖。

 

 

 

10.2项目基本信息

modelVersion:当前POM模型版本,对于Maven3必须为4.0.0

groupId:定义当前项目隶属的实际项目。

artifact:定义实际项目中的一个Maven项目(模块)。

version:定义Maven项目当前所处版本。

packaging:定义Maven项目打包方式。默认为jar

classifier:定义构建输出的一些附属构件。生成javadoc等。由 插件自动生成,不能直接定义。

 

坐标:groupId:artifact:version:packaging

构件名称:artifact-version[-classifier].packaging

10.3 依赖范围

compile(编译范围) compile是默认的范围,会被打包。

provided(已提供范围) provided依赖只有在当JDK或者 一个容器已提供该依赖之后才使用。它们不是传递性的,也不会被打包。

runtime(运行时范围) runtime依赖在运行和测试系统的 时候需要,但在编译的时候不需要。

test(测试范围)只有在测试编译和测试运行阶段可用。

system(系统范围)必须显式的提供一个对于本地系统中JAR文件的路径。注意该范围是不推荐使用。

11. Maven使用后续工作

进行项目测试、打包。命令:mvn clean deploy

发布版本。

命令: mvn release:prepare 准备发布

  mvn release:rollback 回退release:prepare操作

mvn release:perform 执行版本发布

 

12.Maven常用命令

mvn archetype:generate :创建 Maven项目

mvn compile :编译源代码

mvn package : 依据项目生成 jar文件

mvn install :在本地 Repository中安装 jar  

mvn deploy:将jar包发布到远程仓库

mvn eclipse:eclipse :生成 Eclipse项目文件

13.项目开发阶段

1创建项目

  项目类型 1 javase项目2 javaee项目

2编码阶段

   编码+添加依赖jar+TOMCAT配置

3编译项目

  jdkjavac

4运行项目(找到项目的main方法)

  jdkjava命令

5打包发布

14.maven融合了四个阶段(控制依赖jar仓库)

<dependency>

   <groupId>公司名(cn.easytop</groupId>

   <artifactId>项目名</artifactId>

   <version>版本号</version>

</dependency>

 

SNAPSHOT(开发阶段(不稳定))

RELEASE (发布阶段(稳定))

15. 学习命令是作为开发工具的基础,这样会很容易上手。

16. Maven原理图

 

第二部 maven的深入

1. pom.xml决定了这个项目的类型 这个文件是整个maven项目的灵魂。

插件的理解:表示在maven构建中执行的jar名称 插件名 -maven-plugin命名,可以通过jar包中plugins.xml中找到所有的配置定义

插件:其实就是临时加上去的东西,比如游戏的外挂。

2.<scope>system</scope>作用  

介绍 scope各个值的参考

 

compile:默认的scope。任何定义在compile scope下的依赖将会在所有的class paths下可用。maven工程会将其打包到最终的arifact中。如果你构建一个WAR类型的artefact,那么在compile scope下引用的JAR文件将会被集成到WAR文件内。  

  

provided:这个scope假定对应的依赖会由运行这个应用的JDK或者容器来提供。最好的例子就是servlet API。任何在provided scope下定义的依赖在构建时的类路径里是可用的,但是不会被打包到最终的artifact中。如果是一个WAR的文件,servlet API在构建时的类路径里是可用的,但是并不会被打包到WAR文件中。  

  

runtime:在runtime scope下定义的依赖只会在运行期可用,而在构建期的类路径下不可用。这些依赖将会被打包到最终的artifact中。比如你有一个基于web的应用需要在运行时访问MySQL数据库。你的代码没有任何MySQL数据库驱动的硬依赖。你的代码仅仅是基于JDBC API来编写,在构建期并不需要MySQL数据库驱动。然而,在运行期,就需要相应的驱动来操作MySQL数据库了。因此,这个驱动应该被打包到最终的artifact中。  

  

test:只用于测试变异的依赖(比如JUnit),execution必须定义在test scope下。这些依赖不会被打包到最终的artefact中。  

  

system:于provided scope很像。唯一的区别在于,在system scope中,你需要告诉Mave如何去找到这个依赖。如果你要引用的依赖在Maven仓库中不存在时,就可以用这个scope。不推荐使用system依赖。  

  

import:从其它的pom文件中导入依赖设置。

3.<!-- 依赖 当前的项目依赖那些jar -->

与它相关的所有jar包,全部下载下来

 

4.端口号 字符集(解决乱码问题)

maven插件 表示在maven构建构成中执行的jar名称 插件名-maven-plugin命名

可以通过 jar包中plugins中找到所有的配置定义

5.项目的关系继承:

在创建项目时,选中pom类型,就是父类型。

特点:

只要是在《dependencies》中依赖的jar包,一定会出现在子类中,适合项目开发,而在《dependencyManagement》中出现的,在其子类中可以不出现,可以通过《parent》来找到父类,并通过《dependencies》来选择父类中出现的jar包,适合框架开发。

 

### ESP32-CAM 实现镜头翻转的函数及方法 在 ESP32-CAM 开发板中,实现镜头翻转的功能主要通过调用摄像头相关的 API 函数来完成。具体来说,可以使用 `camera_fb_t` 结构体中的参数或者直接调用特定的摄像头控制函数来实现垂直或水平翻转。 以下为关键点和示例代码: #### 1. 配置摄像头初始化结构体 在初始化摄像头时,需要配置 `camera_config_t` 结构体,并通过 `esp_camera_init(&config)` 函数完成初始化[^2]。初始化完成后,可以通过设置摄像头寄存器来实现翻转功能。 ```c #include "esp_camera.h" // 配置摄像头 camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; config.pin_d0 = Y2_GPIO_NUM; config.pin_d1 = Y3_GPIO_NUM; config.pin_d2 = Y4_GPIO_NUM; config.pin_d3 = Y5_GPIO_NUM; config.pin_d4 = Y6_GPIO_NUM; config.pin_d5 = Y7_GPIO_NUM; config.pin_d6 = Y8_GPIO_NUM; config.pin_d7 = Y9_GPIO_NUM; config.pin_xclk = XCLK_GPIO_NUM; config.pin_pclk = PCLK_GPIO_NUM; config.pin_vsync = VSYNC_GPIO_NUM; config.pin_href = HREF_GPIO_NUM; config.pin_sscb_sda = SIOD_GPIO_NUM; config.pin_sscb_scl = SIOC_GPIO_NUM; config.pin_pwdn = PWDN_GPIO_NUM; config.pin_reset = RESET_GPIO_NUM; config.xclk_freq_hz = 20000000; config.pixel_format = PIXFORMAT_JPEG; // 初始化摄像头 esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { // 错误处理 } ``` #### 2. 调用翻转函数 ESP32-CAM 提供了专门的函数用于设置摄像头的翻转方向,包括垂直翻转(`vflip`)和水平翻转(`hmirror`)。这些函数可以直接通过摄像头控制接口调用。 - **垂直翻转**:`esp_camera_set_vflip(1)` 表示启用垂直翻转。 - **水平翻转**:`esp_camera_set_hmirror(1)` 表示启用水平翻转。 以下是完整的代码示例: ```c #include "esp_camera.h" void setup() { // 初始化串口通信 Serial.begin(115200); // 初始化摄像头配置 camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; config.pin_d0 = Y2_GPIO_NUM; config.pin_d1 = Y3_GPIO_NUM; config.pin_d2 = Y4_GPIO_NUM; config.pin_d3 = Y5_GPIO_NUM; config.pin_d4 = Y6_GPIO_NUM; config.pin_d5 = Y7_GPIO_NUM; config.pin_d6 = Y8_GPIO_NUM; config.pin_d7 = Y9_GPIO_NUM; config.pin_xclk = XCLK_GPIO_NUM; config.pin_pclk = PCLK_GPIO_NUM; config.pin_vsync = VSYNC_GPIO_NUM; config.pin_href = HREF_GPIO_NUM; config.pin_sscb_sda = SIOD_GPIO_NUM; config.pin_sscb_scl = SIOC_GPIO_NUM; config.pin_pwdn = PWDN_GPIO_NUM; config.pin_reset = RESET_GPIO_NUM; config.xclk_freq_hz = 20000000; config.pixel_format = PIXFORMAT_JPEG; // 初始化摄像头 esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { Serial.printf("Camera init failed with error 0x%x", err); return; } // 设置垂直翻转 esp_camera_set_vflip(1); // 启用垂直翻转 // 设置水平翻转 esp_camera_set_hmirror(1); // 启用水平翻转 } void loop() { // 获取一帧图像 camera_fb_t *fb = esp_camera_fb_get(); if (!fb) { Serial.println("Camera capture failed"); return; } // 处理图像数据 Serial.printf("Captured image: %d bytes\n", fb->len); // 释放图像缓存 esp_camera_fb_return(fb); delay(1000); // 每秒拍摄一次 } ``` #### 3. 注意事项 - 在调用翻转函数之前,必须确保摄像头已经成功初始化。 - 翻转功能仅影响图像的方向,会改变图像的分辨率或格式。 - 如果需要恢复到默认状态,可以将翻转参数设置为 `0`,例如 `esp_camera_set_vflip(0)`。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值