Tomcat 内核详解 - Web服务器机制
详细介绍
Apache Tomcat 是一个开源的Web服务器和Servlet容器,它实现了Java Servlet、JavaServer Pages (JSP) 和WebSocket规范。Tomcat的核心设计围绕着几个关键组件,它们共同构成了处理HTTP请求、管理Web应用部署和执行Servlet逻辑的基础架构。
Apache Tomcat,作为一款流行的开源Web服务器和Servlet容器,是许多Java Web应用程序的首选部署平台。它遵循Java Servlet、JavaServer Pages (JSP)、Expression Language和WebSocket规范,提供了一个强大而灵活的环境来运行Java Web应用。以下是Tomcat内核的几个核心组件及其工作原理的详细解析:
1. 连接器(Connectors)
连接器负责监听网络端口上的HTTP(或HTTPS)请求,并将这些请求转换为Tomcat内部能够处理的形式。Tomcat支持多种连接器类型,最常用的是基于Java NIO(非阻塞I/O)的org.apache.coyote.http11.Http11NioProtocol和传统的阻塞I/O模型的org.apache.coyote.http11.Http11AprProtocol(需要APR库支持)。连接器处理请求的生命周期包括接收、解码、响应编码和发送。
2. 协议处理器(Protocol Handlers)
连接器内部使用协议处理器来处理特定协议的请求,如HTTP/1.1。协议处理器将原始的Socket通信转换为Tomcat能够处理的Request对象,并在处理完成后生成Response对象。
3. 引擎(Engine)
引擎是连接器之上的一个层次,它代表了处理请求的顶级容器。引擎可以配置多个虚拟主机(Hosts),并负责将接收到的请求分配给适当的虚拟主机处理。
4. 虚拟主机(Hosts)
虚拟主机代表了运行在服务器上的一个逻辑Web服务器,每个Host可以有自己的应用部署、日志配置和文档根目录。在多租户或多个应用共享同一台物理服务器的情况下,虚拟主机提供了隔离和管理的便利。
5. 上下文(Contexts)
上下文代表了部署在Tomcat上的一个Web应用,是Tomcat处理请求的最小单位。每个上下文对应一个特定的Web应用,包括Servlet、JSP页面、静态资源等。每个上下文都有自己的部署描述符(WEB-INF/web.xml),用于配置应用的初始化参数、Servlet映射等。
6. Servlet容器
Tomcat的Servlet容器负责Servlet的生命周期管理,包括装载、初始化、服务请求和销毁。它根据web.xml中的配置来创建Servlet实例,并在接收到请求时调用相应的Servlet方法。
7. 类加载器(Class Loaders)
Tomcat为每个Web应用提供独立的类加载器,这有助于实现应用之间的隔离,允许不同应用使用相同类库的不同版本,同时也支持热部署和重载。
8. 线程池(Thread Pools)
Tomcat使用线程池来管理处理请求的工作线程,通过配置可以调整线程池的大小、超时等参数,以优化性能和资源利用率。
9. 安全组件
包括认证(Authentication)、授权(Authorization)和SSL/TLS支持,通过配置可以实现基本的Web应用安全防护。
Tomcat的内核设计围绕着高度模块化的组件,这些组件协同工作,为Java Web应用提供了一个高效、灵活且可扩展的运行环境。开发者可以通过配置这些组件来优化应用性能、管理资源、确保安全,以及实现复杂的应用部署架构。
使用场景
1. 开发与测试环境
- 快速原型开发:由于其轻量级和易部署的特性,Tomcat是开发新Java Web项目的理想选择。开发者可以迅速搭建开发环境,进行代码编写、调试和初步测试。
- 单元测试与集成测试:在持续集成/持续部署(CI/CD)流程中,Tomcat常被用作运行自动化测试的服务器,以验证应用的功能性和性能。
2. Web应用部署
- 企业内部系统:如CRM系统、ERP系统、企业门户等,这些系统通常面向企业内部用户,要求较高的安全性及稳定性,Tomcat凭借其良好的稳定性和扩展性成为首选。
- 电子商务网站:对于处理高并发交易、商品展示和用户管理等功能的电商网站,Tomcat配合合理的架构设计能够有效支撑业务需求。
- 内容管理系统(CMS):如WordPress(通过Java桥接技术)、Joomla等,虽然原生不是为Java设计,但通过特定插件或适配层,也能在Tomcat上部署和运行。
3. 微服务架构
- 微服务应用服务器:在微服务架构中,每个服务都可以独立部署和扩展。Tomcat因其轻量级,常被用作单个微服务的运行容器,便于管理和部署。
- API Gateway:虽然Tomcat主要用于Web应用,但在某些场景下,它也可以作为API网关,托管RESTful API服务,尤其是当这些API与Java后端服务紧密集成时。
4. 教育与学习
- 教学平台:在大学和在线课程中,Tomcat经常被用于教授Java Web开发的基础知识,因为它直接关联Java生态系统,且易于学生理解和操作。
- 实验环境:学生和初学者可以在虚拟机或本地安装Tomcat,实践Servlet、JSP、Spring MVC等技术的学习。
5. 云服务与容器化
- 云部署:在AWS、Azure、Google Cloud等云平台上,Tomcat可以轻松部署到云服务器或容器服务中,支持弹性伸缩和自动部署。
- Docker容器:Tomcat非常适合容器化部署,通过Docker镜像,应用可以快速、一致地在任何支持Docker的环境中运行。
6. 开源社区项目
- 开源软件:许多开源的Java Web应用选择Tomcat作为默认或推荐的运行环境,因为它的普及度和社区支持丰富。
实际开发中的使用详情
在实际开发中,Apache Tomcat的使用涉及多个方面,包括但不限于配置、部署、调试、性能调优和安全管理。以下是一些具体的操作和注意事项:
1. 安装与配置
- 下载安装:从Apache官方网站下载最新稳定版的Tomcat,解压即可使用,无需安装。
- 修改配置文件:主要配置文件包括
server.xml(定义连接器、引擎、主机等)、web.xml(全局Web应用配置)、context.xml(上下文配置模板)。根据实际需求调整端口、连接器类型、JDBC资源、日志级别等。 - 环境变量设置:可选地,设置JAVA_HOME环境变量指向正确的Java安装路径,以确保Tomcat使用期望的JDK版本。
2. 应用部署
- 直接放置:将打包好的WAR文件直接放入
webapps目录,Tomcat会自动解压部署。 - 管理界面:通过Tomcat的Web管理界面进行应用的部署、停止、重启和删除操作。
- 配置文件部署:在
conf\Catalina\localhost目录下创建以应用名命名的XML文件,手动配置应用的上下文路径、参数等。
3. 日志管理
- 日志配置:修改
conf\logging.properties来调整日志输出级别、格式和目标。 - 查看日志:Tomcat的日志文件通常位于
logs目录下,包括catalina.out(主要日志)、localhost.*.log(本地主机日志)、manager.log(管理界面日志)等。
4. 性能调优
- 调整线程池:在
conf\server.xml中,通过修改Executor元素来调整线程池的大小、最大线程数、超时时间等。 - 优化连接器:调整连接器的参数,如最大连接数、接受缓冲区大小、NIO/NIO2/APR的选择等,以匹配应用需求和硬件资源。
- JVM调优:通过调整启动脚本中的JVM参数,如-Xms、-Xmx来优化内存分配,使用G1或ZGC垃圾收集器以提高响应速度。
5. 安全管理
- 用户权限:配置
conf\tomcat-users.xml,定义管理、部署、监控等角色的用户及其权限。 - HTTPS配置:在
conf\server.xml中配置SSL证书,启用HTTPS以加密通信。 - 限制访问:使用
conf\web.xml中的security-constraint标签来限制特定资源的访问。
6. 故障排查
- 查看日志:遇到问题时,首先检查日志文件,寻找错误信息或异常堆栈。
- 使用JMX监控:Tomcat支持JMX,可以远程监控和管理Tomcat的各项指标,如线程池状态、内存使用情况等。
- 分析线程堆栈:当应用挂起或响应缓慢时,使用
jstack命令获取Java进程的线程堆栈信息,定位死锁或长时间运行的任务。
7. 开发工具集成
- IDE集成:大多数Java IDE(如IntelliJ IDEA、Eclipse)都支持与Tomcat集成,便于开发、调试和热部署。
- 持续集成:在CI/CD流程中,通过Maven或Gradle插件配置,自动化部署应用到Tomcat服务器。
注意事项
- 资源管理:确保应用资源(如数据库连接)得到正确管理和释放,避免内存泄漏。
- 并发和线程池配置:根据应用负载调整Tomcat的线程池大小,避免资源耗尽或响应慢。
- 安全性:关闭不必要的服务(如管理界面),配置SSL,定期更新Tomcat版本以修复安全漏洞。
优缺点
优点
- 开源免费:Tomcat作为Apache软件基金会的项目,是完全开源且免费的,降低了企业的部署成本。
- 轻量级:相比于其他重量级应用服务器(如WebLogic、WebSphere),Tomcat启动速度快,资源占用少,适合小型到中型项目。
- 易于部署和配置:Tomcat的安装和配置过程相对简单,通过修改几个配置文件就能满足大部分需求。
- 灵活性和可扩展性:支持多种连接器、自定义配置、JMX管理等,易于根据项目需求进行定制和扩展。
- 广泛的社区支持:拥有庞大的开发者社区,遇到问题时容易找到解决方案或技术支持。
- 良好的Java EE支持:虽然不如一些商业服务器全面,但Tomcat对Servlet、JSP、WebSocket等Java EE技术标准的支持足够满足多数应用需求。
- 容器化友好:Tomcat轻量级的特性使其很适合容器化部署,与Docker、Kubernetes等技术兼容性好。
缺点
- 管理界面简单:相较于商业服务器,Tomcat的管理界面功能较为基础,对于大规模部署和复杂管理需求可能不够用。
- 性能和稳定性:对于高并发、大流量的场景,虽然通过优化可以达到不错的表现,但相比于专为高负载设计的商业服务器,Tomcat在处理极端情况下的性能和稳定性可能略显不足。
- 缺乏高级特性:缺少一些商业服务器提供的高级功能,如集群管理、高级负载均衡、事务处理等。
- 安全配置:默认配置下,Tomcat的安全性较低,需要手动进行一系列安全加固,如禁用不安全的HTTP方法、配置HTTPS、限制访问等。
- JEE支持有限:虽然支持Servlet、JSP等核心标准,但对于完整的Java EE特性支持(如EJB、JMS)不如全面支持Java EE的服务器。
代码示例
Tomcat 部署及简单Servlet代码示例
1. 准备工作
首先,确保你已安装好Java开发环境(JDK)和Apache Tomcat服务器。本示例使用Tomcat 9作为演示环境。
2. 创建Servlet项目
使用IDE(如IntelliJ IDEA或Eclipse)创建一个新的Java Web项目,或者手动创建项目结构,至少需要以下结构:
myapp/|-- WEB-INF/|-- web.xml|-- src/|-- main/|-- java/|-- com.example.myapp/|-- MyServlet.java|-- webapp/|-- index.html
3. 编写Servlet代码
在MyServlet.java中编写一个简单的Servlet类:
package com.example.myapp;import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();out.println("<h1>Hello from MyServlet!</h1>");out.println("<p>This is a simple servlet example.</p>");}
}
此Servlet会在接收到GET请求时,向浏览器返回一段简单的HTML信息。
4. 配置web.xml
在WEB-INF/web.xml中配置Servlet的映射:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>MyServlet</servlet-name><servlet-class>com.example.myapp.MyServlet</servlet-class></servlet><servlet-mapping><servlet-name>MyServlet</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping></web-app>
这段配置告诉Tomcat,当接收到以/hello结尾的请求时,应该由MyServlet来处理。
5. 部署应用
- 将项目打包成WAR文件(一般IDE有自动打包功能),然后复制到Tomcat的
webapps目录下。 - 或者直接将项目目录(不打包)移动到
webapps目录下,Tomcat会自动识别并部署。
6. 启动Tomcat并测试
- 启动Tomcat服务器。
- 打开浏览器,访问
http://localhost:8080/myapp/hello(假设Tomcat运行在本地,端口为默认的8080)。
如果一切配置正确,你应该能看到Servlet响应的信息:“Hello from MyServlet!”和“这是一个简单的Servlet示例”。
注意事项
- 确保你的IDE或命令行中使用的Java版本与Tomcat兼容。
- 检查Tomcat的日志文件(通常位于
logs/catalina.out),以获取启动和运行时的错误信息。- 在开发过程中,可以利用IDE的热部署功能来快速迭代Servlet代码,而无需每次修改后都重启Tomcat服务器。
可能遇到的问题及解决方案
在使用Apache Tomcat进行Web应用开发和部署的过程中,可能会遇到各种问题。以下是一些常见的问题及其解决方案:
1. 应用部署失败
问题:将应用部署到Tomcat时,发现应用没有启动,或者在访问时显示404错误。
解决方案:
- 检查
logs/catalina.out文件,查看是否有详细的错误信息,如类找不到、配置错误等。 - 确认
web.xml中的Servlet映射是否正确。 - 确保应用的WAR包已正确解压,且目录结构符合预期。
- 检查Tomcat的
server.xml配置,确认端口没有冲突,应用的上下文路径是否正确配置。
2. 内存溢出
问题:应用运行一段时间后,Tomcat崩溃,日志中出现OutOfMemoryError。
解决方案:
- 调整JVM参数,增加堆内存大小,例如
-Xms1024m -Xmx2048m分别设置了最小和最大堆内存。 - 定期重启Tomcat服务,避免长时间运行积累内存泄漏。
- 使用工具(如VisualVM)进行内存分析,找出内存泄漏的原因并修复。
3. 性能问题
问题:在高并发访问下,Tomcat响应变慢,甚至超时。
解决方案:
- 调整连接器(Connector)配置,如增加最大线程数(
maxThreads)、调整接受缓冲区大小(acceptCount)。 - 使用异步Servlet或 Comet处理长连接,减少线程占用。
- 对应用进行性能分析,优化数据库查询、减少不必要的资源加载等。
4. 安全问题
问题:应用受到攻击,如SQL注入、跨站脚本攻击(XSS)等。
解决方案:
- 使用HTTPS,配置SSL以保护数据传输安全。
- 在
web.xml中添加合适的过滤器,如防止XSS攻击的过滤器。 - 严格限制对管理界面的访问,设置强密码,使用安全的连接器配置(如禁用HTTP TRACE方法)。
5. 类加载冲突
问题:应用部署后,出现ClassNotFoundException或NoSuchMethodError等错误。
解决方案:
- 确认应用的类库是否与Tomcat自带的类库版本冲突,必要时更换或排除冲突的库。
- 检查应用的类加载器配置,确保应用间和Tomcat本身的类加载隔离。
6. 日志过多
问题:Tomcat产生的日志文件过大,磁盘空间紧张。
解决方案:
- 调整日志级别,减少不必要的日志输出。
- 设置日志滚动策略,如按时间或大小滚动日志文件,避免单个文件过大。
- 定期清理旧日志文件。
7. 端口占用
问题:启动Tomcat时提示端口已被占用。
解决方案:
- 使用
netstat -ano | findstr "端口号"(Windows)或lsof -i :端口号(Linux/Mac)查找占用端口的进程。 - 关闭占用端口的进程,或修改Tomcat的
server.xml,使用其他未被占用的端口。
针对以上问题,持续监控Tomcat的运行状态,合理配置和优化,可以显著提升应用的稳定性和性能。
相关文章:
Tomcat 内核详解 - Web服务器机制
详细介绍 Apache Tomcat 是一个开源的Web服务器和Servlet容器,它实现了Java Servlet、JavaServer Pages (JSP) 和WebSocket规范。Tomcat的核心设计围绕着几个关键组件,它们共同构成了处理HTTP请求、管理Web应用部署和执行Servlet逻辑的基础架构。 Apac…...
几个人脸库对于面部动作识别的功能比较
经粗略研究,insightface只能识别面部特征点的位置,根据这些位置不能直接推出一个人是否在睡觉。 OpenFace 是一个高级的面部行为分析工具,它能够识别和分析多种面部动作单位(Facial Action Coding System, FACS),这些动作单位是根据面部肌肉活动定义的。每个动作单位(A…...
IDEA 使用Alibaba Cloud Toolkit 实现远程 自动部署
安装插件 maven方式部署 配置服务器主机信息 配置发布到主机 单击Select 单击run 就可以将选择module的jar文件上传到服务器的指定位置了 Alibaba Cloud Toolkit 上传文件的方式部署...
蓝桥杯备战15.完全二叉树的权值
P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using namespace std; #define endl \n #define int long long const int N 2e510; int a[N]; signed main() {std::ios::sync_with_stdio(0),cin.ti…...
【前端】LayUI监听事件汇总
一、监听单选按钮事件 点击资源类型单选按钮时,请求后台接口,把接口返回的内容追加到选择资源下拉框内 HTML <div class"layui-form-item"><label class"layui-form-label">资源类型:</label><d…...
【多电压流程 Multivoltage Flow】- 5.特定工具使用建议(1.VCS NLP VC LP)
本章提供了关于使用Synopsys工具进行低功耗设计和分析的信息。它包含以下部分: • 使用VCS NLP和VC LP进行多电压验证 • 使用Design Compiler进行逻辑综合 • 使用IC Compiler进行设计规划 • 使用IC Compiler进行物理实现 • 使用IC Compiler II和Fusion Compiler进行物…...
Elasticsearch 实现word、pdf、txt、excel文档内容快速检索(保姆级教程)
本文主要讲解ES如何从提取文档中提取内容(word、pdf、txt、excel等文件类型),实现快速检索文档内容实现。 特别说明一下,为什么用7.10.0版本,因为在项目中除了精确匹配的要求,也会有模糊查询(关…...
[初学rust] 04_rust复合类型
rust复合类型 字符串 由于rust的字符串元素类型是u8(1字节),但是字符类型是unicode(4字节) 索引不能像C那样读取又由于String类型和&str类型都是utf-8编码,中文占3字节切片可能会导致崩溃 slice(切片) 切片就是对String类型中的一部分的引用,它…...
什么是Zoho CRM客户关系系统管理?
以客户为中心的商业时代,卓越的客户体验已成为企业持续增长与成功的关键,为了在这场激烈的市场竞争中脱颖而出,企业需要一套强大、灵活且智能的客户关系管理系统——Zoho CRM应运而生,它不仅是管理客户信息的工具箱,更是驱动业务增…...
青岛东软载波子公司东软载波微电子授权世强硬创代理,出货量累计超20亿颗
凭借业内独特的互联网推新模式,世强先进(深圳)科技股份有限公司(下称“世强先进”) 获得本土工业MCU企业——上海东软载波微电子有限公司(下称“东软载波微电子”,英文:essemi&#…...
YOLO损失函数——SIoU和Focal Lossr损失函数解析
1. 概述 YOLO(You Only Look Once) 系列模型以其实时目标检测能力而闻名,其有效性在很大程度上归功于其专门设计的损失函数。在本文中,这里将深入探讨YOLO演进中不可或缺的各种YOLO损失函数,并重点介绍它们在PyTorch中…...
C++:编程世界的永恒之石
在编程的广袤领域中,C犹如一块永恒的基石,历经岁月的洗礼,依旧坚固而璀璨。它的深厚底蕴、强大功能和广泛的应用领域,使其成为无数程序员心中的信仰与追求。 一、C:历史与传承的交汇点 C的历史可追溯到上世纪80年代&…...
线上3D博物馆搭建简单吗?有何优势?有哪些应用场景?
随着科技的飞速发展,传统的博物馆参观方式正在经历一场前所未有的变革,在科技的“加持”下,不少博物馆凭借强大的技术、创意和美学实践,频频“出圈”,线上3D博物馆逐渐崛起,这不仅丰富了人们的文化体验&…...
Rust 语言的“命名空间” —— mod
在Rust中,虽然没有像C中的namespace这样的显式关键字,但是Rust通过模块(mod)系统提供了一种类似命名空间的功能。模块允许你将相关的代码组织在一起,并可以通过pub关键字来控制哪些项(如函数、结构体、枚举…...
加速科技突破2.7G高速数据接口测试技术
随着显示面板分辨率的不断提升,显示驱动芯片(DDIC)的数据接口传输速率越来越高,MIPI、LVDS/mLVDS、HDMI等高速数据接口在DDIC上广泛应用。为满足高速数据接口的ATE测试需求,作为国内少数拥有完全自研的LCD Driver测试解…...
从0开始搭建一个react项目 第一 二 三天
从0开始搭建一个react项目 今天接到一个任务让我把原来用ext.js写的前端换成react写的,我好慌的,因为我就是一个小白,之前只做过简单的二次开发功能。唉,我只是一个领着微薄薪水的小实习生,为什么要有这个任务&#x…...
LSTM与GAN创新结合!模型性能起飞,准确率超98%
今天来聊一个深度学习领域非常具有创新性的研究方向:LSTM结合GAN。 LSTM擅长处理和记忆长期的时间依赖关系,而GAN可以学习复杂的数据分布并生成逼真的数据样本。通过充分结合两者的优势,我们可以增强模型对复杂数据的处理能力,提…...
E2E测试学习
一、什么是E2E测试 e2e(end to end),也叫端到端测试,是一种用于测试应用程序流是否从头到尾按设计执行的方法。 执行端到端测试的目的是识别系统依赖关系,并确保在各种系统组件和系统之间传递正确的信息。端到端测试的目的是测试 整个软件的…...
基于死区补偿的永磁同步电动机矢量控制系统simulink仿真模型
整理了基于死区补偿的永磁同步电动机矢量控制系统simulink仿真,该模型使用线性死区补偿的PMSM矢量控制算法进行仿真,使用Foc电流双闭环 。 1.模块划分清晰,补偿前后仿真有对比,易于学习; 2.死区补偿算法的线性区区域可调; 3.自…...
GSCoolink GSV6125 替LT6711A HDMI2.0转Type-C/DP1.4
GSCoolink GSV6125 在 Type C/Dp monitor,线材,VR/AR,系统均有大量的应用机会,且目前只有龙迅LT6711A 竞争对手。 Gscoolink GSV6125是一款高性能、低功耗的HDMI 2.0转Type-C/DP1.4转换器。通过集成增强型微控制器,GS…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...
Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...
