项目5-博客系统5+程序部署(Linux基本使用)

1.Linux的基本使用

1.1 Linux 是什么

Linux 是⼀个操作系统.
和 Windows 是 "并列" 的关系.

1.2 Unix & Linux 发展历程图

1.1969−1970 年, ⻉尔实验室的 Dennis Ritchie (左) 和 Ken Tompson (右) 开发了 Unix 操作系统.

2. Unix ⽕了之后, 衍⽣出很多的分⽀. 其中有⼀⽀为 "Minix". 由荷兰的Andrew S. Tanenbaum 教授开发. 源代码开放给⼤学教学和研究⼯作. (MINIX 含义为 "⼩型的UNIX")
3. 1991 年, 还在读⼤学的 芬兰⼈ Linus Benedict Torvalds (1969年12⽉28⽇出⽣, 当时 22 岁) 基于Minix 的启发, 开发出了 Linux 的第⼀个版本
经过这么多年的发展, Linux 已经成为 世界第⼀⼤操作系统

1.3 Linux 发⾏版

Linux 严格意义来说只是⼀个 "操作系统内核".
⼀个完整的操作系统 = 操作系统内核 + 配套的应⽤程序.
由于 Linux 是⼀个完全开源免费的内核, 因此有些公司/开源组织⼜基于 Linux 内核, 提供了不同的配套程序. 这就构成了不同的 "发⾏版".
企业中主要使⽤的发⾏版是 RedHat (红帽), CentOS(RedHat的社区免费版本)和ubuntu. 但是 RedHat是收费的, CentorOS官⽅在2020年12⽉份通知: 2021年底停⽌维护CentOS8, 2024年6⽉30⽇停⽌维护CentOS7,后续将⽆法获得官⽅升级和补丁.

1.4 Linux的优势

1. 开源(意味着免费, 便宜)
2. 稳定(Linux 可以运⾏很多年, 都不会发⽣重⼤问题)
3. 安全(Linux 只有管理员或者特定⽤⼾才能访问Linux内核)
4. ⾃由(不会被强加商业产品和服务)
5. 社区⽀持(Linux 在全球社区都⾮常活跃和使⽤⼴泛, 有很多志愿者在线帮⼤家解决问题)

1.5 Linux的基础命令

Linux 虽然也有图形化界⾯, 但是在 服务器 / 嵌⼊式设备上往往都是通过命令⾏的⽅式操作的.因此学习 Linux 命令就是使⽤ Linux 的重要基础
使⽤命令相⽐于使⽤图形界⾯主要有以下好处:
节省系统资源: 运⾏图形界⾯需要让系统付出⼀些额外的资源开销. 尤其是对于配置⽐较低的嵌⼊式设备, 这⼀点⾄关重要.
节省⽹络带宽: 如果通过⽹络访问服务器, 使⽤图形界⾯需要传输⼀帧⼀帧的图像, ⽽使⽤命令只
需要传输简单的字符串.
便于批量执⾏任务: 可以通过⼀些 "脚本" 代码 (⽐如 Linux Shell) 来批量执⾏⼀些任务, 完成⼀些简单的编程⼯作. (⽐如定时备份⽂件, 删除⽂件等).

 Windows 也有命令(也就是 cmd), 只是对于普通⽤⼾来说很少使⽤.

系统编程 & ⽹络编程
Linux ⾃⾝提供了⼀些 API, 供程序猿调⽤来完成⼀些更复杂的编程任务(⽐如⽂件操作, 多线程编程,socket 编程等).
但是由于 Java 跨平台的特性, 这部分功能已经被 Java ⾃⾝封装好了 (流对象, Thread 对象, Socket 对象等). 所以这部分内容不必再学习了.
部署 JavaWeb 项⽬
我们⾃⼰写的 web 程序, 要想让其他的⽤⼾能够访问, 就需要发布到服务器上

所以, 对于 Java 程序员来说, 关于 Linux 重点学习 基础命令 和 项⽬部署 即可 

2. Linux 环境搭建

要想学习 Linux , 需要先有⼀个 Linux 的环境.

2.1 环境搭建⽅式

主要有四种:
1. 直接安装在物理机上. 但是Linux 桌⾯使⽤起来⾮常不友好. 所以不建议. 
2. 使⽤虚拟机软件, 将 Linux 搭建在虚拟机上. 但是由于当前的虚拟机软件(如 VMWare 之类的)存在⼀些 bug , 会导致环境上出现各种莫名其妙的问题, ⽐较折腾. 
3. 使⽤ WSL (Windows Subsystem for Linux). 这个是 Windows 近⼏年开发的新功能, 在 Windows
系统内集成了⼀个 Linux. 但是⽬前这个技术还不够成熟.
4. 使⽤云服务器, 可以直接在 腾讯云, 阿⾥云或华为云 等服务器⼚商处直接购买⼀个云服务器. 

使⽤云服务器不仅环境搭建简单, 避免折腾, 同时还有⼀个最⼤的好处, 部署在云服务器上的项⽬可以直接被外⽹访问到, 这个时候就和⼀个公司发布⼀个正式的⽹站没有任何区别. 也就能让我们⾃⼰写的程序真的去给别⼈去使⽤

2.2 使⽤云服务器 

2.3 使⽤终端软件连接到 Linux

2.3.1 终端软件

终端软件是⼀类⼯具软件, 可以和远程的主机建⽴⽹络连接, 从⽽对主机进⾏⼀些操作.
常⻅的终端软件:
• XShell
Putty
MobaXTerm
Iterm2
SecureCRT
......

3. Linux 常⽤命令

ls

语法: ls [选项] [⽬录或⽂件]
功能:对于⽬录,该命令列出该⽬录下的所有⼦⽬录与⽂件。对于⽂件,将列出⽂件名以及其他信
息。
常⽤选项:
-a 列出⽬录下的所有⽂件,包括以 . 开头的隐含⽂件。
-d 将⽬录象⽂件⼀样显⽰,⽽不是显⽰其下的⽂件。 如:ls ‒d 指定⽬录
-k 以 k 字节的形式表⽰⽂件的⼤⼩。ls ‒alk 指定⽂件
-l 列出⽂件的详细信息。
-r 对⽬录反向排序。
-t 以时间排序。
-R 列出所有⼦⽬录下的⽂件。(递归)

pwd

语法: pwd
功能:显⽰⽤⼾当前所在的⽬录

cd

Linux系统中,磁盘上的⽂件和⽬录被组成⼀棵⽬录树,每个节点都是⽬录或⽂件。
语法: cd ⽬录名
功能: 改变⼯作⽬录。将当前⼯作⽬录改变到指定的⽬录下.
举例:
# 返回上级⽬录
cd ..
# 进⼊⽤⼾家⽬录
cd ~
# 返回最近访问⽬录
cd

认识 Linux ⽬录结构

Linux 是⼀个树形⽬录结构.
⼏个特殊的⽬录:
/ 称为根⽬录
. 称为当前⽬录
.. 称为当前⽬录的上级⽬录
绝对路径 vs 相对路径
形如: /usr/share/tomcat/logs/ 以根⽬录开头的, 称为绝对路径.
形如: ./logs . 或者 .. 开头的, 称为相对路径.
使⽤ tab 键补全
我们敲的所有的 Linux 命令, 都可以使⽤ tab 键来尝试补全, 加快效率.
使⽤ ctrl + c 重新输⼊
如果命令或者⽬录敲错了, 可以 ctrl + c 取消当前的命令.

touch

语法: touch [选项]... ⽂件...
功能: touch命令参数可更改⽂档或⽬录的⽇期时间,包括存取时间和更改时间,或者新建⼀个不存在的⽂件。
举例:

touch test.txt

cat

语法:cat [选项] [⽂件]
功能: 查看⽬标⽂件的内容
常⽤选项:
-n 对输出的所有⾏编号
cat test.txt

mkdir

语法:mkdir [选项] dirname...
功能:在当前⽬录下创建⼀个名为 “dirname”的⽬录
常⽤选项:
-p, --parents 可以是⼀个路径名称。此时若路径中的某些⽬录尚不存在,加上此选项后,系统将⾃动
建⽴好那些尚不存在的⽬录,即⼀次可以建⽴多级⽬录
举例:
# 递归建⽴多个⽬录
mkdir –p test/test1

rm

语法:rm [-f-i-r-v] [dirName/dir]
功能:删除⽂件或⽬录
常⽤选项:
-f 即使⽂件属性为只读(即写保护),亦直接删除
-i 删除前逐⼀询问确认
-r 删除⽬录及其下所有⽂件
举例:

rm test.txt  

重要注意事项:
千万不要运⾏ rm -rf / , 尤其是在公司的⽣产服务器上

cp

语法:cp [选项] 源⽂件或⽬录 ⽬标⽂件或⽬录
功能: 复制⽂件或⽬录
说明: cp指令⽤于复制⽂件或⽬录,如同时指定两个以上的⽂件或⽬录,且最后的⽬的地是⼀个已经存
在的⽬录,则它会把前⾯指定的所有⽂件或⽬录复制到此⽬录中。若同时指定多个⽂件或⽬录,⽽最
后的⽬的地并⾮⼀个已存在的⽬录,则会出现错误信息
常⽤选项:
-f 或 --force 强⾏复制⽂件或⽬录, 不论⽬的⽂件或⽬录是否已经存在
-i 或 --interactive 覆盖⽂件之前先询问⽤⼾
-r递归处理,将指定⽬录下的⽂件与⼦⽬录⼀并处理。若源⽂件或⽬录的形态,不属于⽬录或符号
链接,则⼀律视为普通⽂件处理
-R 或 --recursive递归处理,将指定⽬录下的⽂件及⼦⽬录⼀并处理
举例:
cp test1.txt test2.txt

mv

语法: mv [选项] 源⽂件或⽬录 ⽬标⽂件或⽬录
功能:
1. 视mv命令中第⼆个参数类型的不同(是⽬标⽂件还是⽬标⽬录),mv命令将⽂件重命名或将其移
⾄⼀个新的⽬录中。
2. 当第⼆个参数类型是⽂件时,mv命令完成⽂件重命名,此时,源⽂件只能有⼀个(也可以是源⽬
录名),它将所给的源⽂件或⽬录重命名为给定的⽬标⽂件名。
3. 当第⼆个参数是已存在的⽬录名称时,源⽂件或⽬录参数可以有多个,mv命令将各参数指定的源
⽂件均移⾄⽬标⽬录中。
常⽤选项
-f :force 强制的意思,如果⽬标⽂件已经存在,不会询问⽽直接覆盖
-i :若⽬标⽂件 (destination) 已经存在时,就会询问是否覆盖!
举例
mv test1.txt test2.txt

tail

语法: tail [必要参数] [选择参数] [⽂件]
功能:⽤于显⽰指定⽂件末尾内容,不指定⽂件时,作为输⼊信息进⾏处理。常⽤查看⽇志⽂件。
选项:
-f 循环读取
-n<⾏数> 显⽰⾏数
举例:
tail -10 t1.txt

vim

vim 是⼀个知名的⽂本编辑器. 使⽤ vim 可以进⾏⽂本编辑了.
vim 就相当于 Windows 的记事本. 只不过功能⽐记事本强⼤⼀些.
1) 创建⽂件 / 打开⽂件
vim [ ⽂件名 ]
2) 进⼊插⼊模式
vim 打开⽂件后默认是普通模式. 普通模式下键盘的按键表⽰⼀些特殊功能的快捷键. (例如按下 j 并不
是输⼊字⺟ "j", ⽽是表⽰光标往下移动⼀⾏). 需要进⼊插⼊模式才能进⾏⽂本编辑.
使⽤ i 键可以进⼊到插⼊模式. (左下⻆提⽰ --INSERT-- ) 然后就可以像记事本⼀样正常编辑了.
3) 保存
在插⼊模式下不能保存⽂件, 需要先回到 普通模式 . 按下 Esc 回到普通模式.
在普通模式下输⼊ :w , 再按下回⻋, 即可保存⽂件.
4) 退出
在插⼊模式下不能退出, 需要先回到 普通模式.
退出时, 分以下情况:
① ⽂件未修改: 输⼊ :q , 再按下回⻋, 即可退出
② ⽂件修改并保存: 使⽤ :wq 同时执⾏保存和退出.
③ ⽂件修改, 但不希望保存: 使⽤ :wq! 进⾏强制退出
grep
语法:grep [参数]... [⽂件]...
功能:⽤于查找⽂件中是否包含指定字符串, 并显⽰对应的⾏.
选项:
-n<⾏数> 显⽰的⾏数
-w 全字匹配. 要求整个单词都完全相同的结果才能匹配出来, ⽽不仅仅是⼀个单词的⼀部分.
-r 递归查找. 可以搜索多级⽬录下的所有⽂件.
--color ⾼亮查找到的结果
--include 指定查找某些⽂件
--exclude 指定排除某些⽂件
举例:
grep "hello" Hello.java

 ps

语法:ps [参数]...
功能:⽤于查看当前系统上运⾏的进程
选项:
a 显⽰⼀个终端的所有进程
u 以⽤⼾为主的格式来显⽰程序状况
x 显⽰所有程序, 不⽌是会话中的进程
e 显⽰所有进程, 包括系统守护进程
f 显⽰完整格式输出
举例:
ps aux # 显⽰系统上所有的进程
ps aux | grep " 进程名 "
ps aux | grep " 进程 id"

netstat

语法:netstat [参数]...
功能:查看系统上的⽹络状态.
选项:
-a 显⽰所有正在或不在侦听的套接字
-n 显⽰数字形式地址⽽不是去解析主机、端⼝或⽤⼾名
-p 显⽰套接字所属进程的PID和名称
举例:
netstat -anp
netstat -anp | grep " 进程名 "
netstat -anp | grep " 端⼝号 "

管道

管道是⼀种古⽼的 "进程间通信" ⽅式. 在 Linux 指令中可以使⽤ | 作为管道标记.
意思是将前⼀个指令标准输出的内容, 作为第⼆个指令的标准输⼊内容.
举例:
ps -ef|grep "java"
ps -ef|head -10
tail -f log.txt|grep "Exception"

4. 搭建 Java 部署环境

4.1 apt

apt(Advanced Packaging Tool), Linux软件包管理⼯具. ⽤于在Ubuntu、Debian和相关Linux发⾏版
上安装、更新、删除和管理deb软件包.
⼤多数apt命令必须以具有sudo权限的⽤⼾⾝份运⾏.

4.1.1 apt常⽤命令

列出所有软件包
apt list
这个命令输出所有包的列表, 内容⽐较多, 可以使⽤grep命令过滤输出.
apt list |grep "java"
...
未完

5.部署 Web 项⽬到 Linux

5.1 什么是部署

⼯作中涉及到的 "环境"
开发环境: 开发⼈员写代码⽤的机器.
测试环境: 测试⼈员测试程序使⽤的机器.
⽣产环境(线上环境): 最终项⽬发布时所使⽤的机器. 对稳定性要求很⾼.
把程序安装到⽣产环境上, 这个过程称为 "部署". 也叫 "上线".
⼀旦程序部署成功, 那么这个程序就能被外⽹中千千万万的普通⽤⼾访问到.
换句话说, 如果程序有 BUG, 这个 BUG 也就被千千万万的⽤⼾看到了.
部署过程⾄关重要, 属于程序开发中最重要的⼀环. ⼀旦部署出现问题, 极有可能导致严重的事故(服务器不可⽤之类的).
为了防⽌部署出错, ⼀般公司内部都有⼀些⾃动化部署⼯具(如 Jenkins 等). 当前我们先使⽤⼿⼯部署的⽅式来完成部署.

5.2 环境配置

程序正常运⾏, 需要保证环境和程序都要正确, 我们需要先设置环境

数据准备

按照之前的数据库建表脚本, 在服务器上运⾏, 建⽴相同的表结构.
进入数据库

mysql -root -p

建库
-- 建表SQL
create database if not exists java_blog_spring charset utf8mb4;
USE java_blog_spring;
-- 用户表
DROP TABLE IF EXISTS java_blog_spring.user;
CREATE TABLE java_blog_spring.user(`id` INT NOT NULL AUTO_INCREMENT,`user_name` VARCHAR ( 128 ) NOT NULL,`password` VARCHAR ( 128 ) NOT NULL,`github_url` VARCHAR ( 128 ) NULL,`delete_flag` TINYINT ( 4 ) NULL DEFAULT 0,`create_time` DATETIME DEFAULT now(),`update_time` DATETIME DEFAULT now(),PRIMARY KEY ( id ),
UNIQUE INDEX user_name_UNIQUE ( user_name ASC )) ENGINE = INNODB DEFAULT
CHARACTER
SET = utf8mb4 COMMENT = '用户表';
-- 博客表
drop table if exists java_blog_spring.blog;
CREATE TABLE java_blog_spring.blog (`id` INT NOT NULL AUTO_INCREMENT,`title` VARCHAR(200) NULL,`content` TEXT NULL,`user_id` INT(11) NULL,`delete_flag` TINYINT(4) NULL DEFAULT 0,`create_time` DATETIME DEFAULT now(),`update_time` DATETIME DEFAULT now(),PRIMARY KEY (id))
ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '博客表';
-- 新增用户信息
insert into java_blog_spring.user (user_name, password,github_url)values
("lay","107","https://www.weibo.com/u/2706896955?c=spr_qdhz_bd_360ss_weibo_mr");
insert into java_blog_spring.user (user_name, password,github_url)
values("muyierf","123456","https://gitee.com/muyierf");
insert into java_blog_spring.blog (title,content,user_id) values("第1篇博
客","lay的筑梦之旅",1);
insert into java_blog_spring.blog (title,content,user_id) values("第1篇博
客","muyierf的第一篇博客",2);

出现问题:Invalid default value for ‘create_time‘

通过搜索,发现是因为MySQL版本低

选择了删除升级版本的做法

Centos7下彻底删除Mysql, 重新安装Mysql_centos7删除mysql重新安装-CSDN博客

Centos7完全卸载MySQL & 安装 & 启动_centos7卸载mysql重新安装-CSDN博客

程序配置⽂件修改

实际⼯作中, 开发环境, 测试环境以及⽣产环境的配置都是不⼀样的
⽐如mysql的⽤⼾名和密码
我们可以针对不同的环境, 设置不同的配置

多平台⽂件配置

针对不同平台创建不同的配置⽂件, 要求名字为application-XXX.yml或者application-XXX.properties
以下以application-XXX.yml为例
固定格式, 只有后⾯的字⺟可以修改
在配置⽂件⾥写不同的内容
application-dev.yml

application-prod.yml

 在主配置⽂件 application.yml 中指定配置⽂件, 并删除数据库相关配置

5.3 构建项⽬并打包

在本地使⽤maven进⾏打包
1. 如果Test代码中有与环境配置相关的操作(⽐如数据库相关的操作), 打包会失败, 点击下图①处的图标, 可以跳过测试
2. 点击clean->package

5.3 上传Jar包到服务器, 并运⾏

1. 上传Jar包

直接拖动打好的jar包到xshell窗⼝即可完成⽂件的上传

 java -jar demo-0.0.1-SNAPSHOT.jar

端口被占有了 

看服务器端口有没有开放

1.先看本机的应用是否启动成功

curl http://127.0.0.1:9090/blog_login.html

开放的话就可以获取页面内容

 有该页面就启动成功!!!

(排除服务已启动)

2.端口号的的问题

阿里云服务器开放端口的正确方式(超详细图文教程)_阿里云开放端口-CSDN博客

无法通过公网访问阿里云服务器下的tomcat部署的项目_为什么通过公网ip访问不了tomcat-CSDN博客 ps -ef|grep java 查看进程
kill -9杀死进程

部署成功!!!

重新测试,发现css加载不出来,重新clean解决问题。

经过测试,发现添加博客接口有问题,执行一次添加一篇博客操作,却添加了两条信息。

经检查接口/add有错误,执行了两次语句

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++进阶】RAII思想&智能指针

智能指针 一&#xff0c;为什么要用智能指针&#xff08;内存泄漏问题&#xff09;内存泄漏 二&#xff0c;智能指针的原理2.1 RAII思想2.2 C智能指针发展历史 三&#xff0c;更靠谱的shared_ptr3.1 引用计数3.2 循环引用3.3 定制删除器 四&#xff0c;总结 上一节我们在讲抛异…

嵌入式单片机 TTL电平、232电平、485电平的区别和联系

一、简介 TTL、232和485是常见的串口通信标准&#xff0c;它们在电平和通信方式上有所不同&#xff0c; ①一般情况下TTL电平应用于单片机外设&#xff0c;属于MCU/CPU等片外外设&#xff1b; ②232/485电平应用于产品整体对外的接口&#xff0c;一般是片外TTL串口转232/485…

MYSQL执行过程和顺序详解

一、前言 1.1、说明 就MySQL在执行过程、sql执行顺序&#xff0c;以及一些相关关键字的注意点方面的学习分享内容。 在参考文章的基础上&#xff0c;会增加自己的理解、看法&#xff0c;希望本文章能够在您的学习中提供帮助。 如有错误的地方&#xff0c;欢迎指出纠错&…

使用spring-ai快速对接ChatGpt

什么是spring-ai Spring AI 是一个与 Spring 生态系统紧密集成的项目&#xff0c;旨在简化在基于 Spring 的应用程序中使用人工智能&#xff08;AI&#xff09;技术的过程。 简化集成&#xff1a;Spring AI 为开发者提供了方便的工具和接口&#xff0c;使得在 Spring 应用中集…

网络篇09 | 运输层 udp

网络篇09 | 运输层 udp 01 简介UDP 是面向报文的 02 报文协议 01 简介 UDP 只在 IP 的数据报服务之上增加了一些功能&#xff1a;复用和分用、差错检测 UDP 的主要特点&#xff1a;无连接。发送数据之前不需要建立连接。 使用尽最大努力交付。即不保证可靠交付。 面向报文。…

【c 语言】函数前面的返回类型

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

【数据结构(六)】队列

❣博主主页: 33的博客❣ ▶️文章专栏分类:数据结构◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你学更多数据结构知识 目录 1.前言2.概念3.队列的使用4.循环队列5.双端队列6.经典习题6.1队列实现栈6.2栈实现队…

Windows Edge 兼容性问题修复:提升用户体验的关键步骤

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

【设计模式】聊聊观察者设计模式原理及应用

原理 观察者模式属于行为模式&#xff0c;行为模式主要解决类和对象之间交互问题。 含义&#xff1a;在对象之间定义一个一对多的依赖&#xff0c;当一个对象状态改变时&#xff0c;所有依赖的对象会自动通知。 被依赖的对象被观察者(Observable) &#xff0c;依赖的对象观察…

MCU最小系统的电源模块设计和复位模块的设计

最小操作系统就是一个电路&#xff0c;这个电路里面必须要的东西&#xff08;如人需要喝水吃饭温度等情况&#xff0c;才能或者&#xff09; 现在我们要解决这三个问题 这里V开头的&#xff0c;都是电源管脚 这里解释一下&#xff1a; 这里要注意哪些是电路电压&#xff0c;哪…

API接口京东开放平台item_get-获得京东商品详情API接口根据商品ID查询商品标题价格描述等详情数据

京东商品详情API接口可以提供以下方面的信息&#xff1a; 商品基础信息&#xff1a;包括商品的标题、价格、描述、图片等基本信息&#xff0c;这是构建电商平台的基础数据。商品分类信息&#xff1a;帮助用户更好地了解商品所属的类别&#xff0c;便于商品筛选和查找。商品销售…

YOLOv5目标检测优化点(添加小目标头检测)

文章目录 1、前言2、如何计算参数3、YOLOv5小目标改进-13.1、结构文件3.2、结构图3.3、参数对比3.3.1、yolov5l.yaml 解析表3.3.2、 yolov5l-4P.yaml 解析表 4、YOLOv5小目标改进-24.1、结构文件4.2、结构图 5、YOLOv5小目标改进-35.1、结构文件 6、YOLOv5小目标改进-46.1、结构…