优化Docker部署:解决Java应用ExcelGenerateException并提速镜像构建
在开发和部署应用时,经常会遇到在本地环境运行正常,但迁移到Docker容器后出现特定错误的情况。本篇博客将聚焦于解决一个具体问题:当使用Docker部署包含Excel生成功能的Java应用程序时,遇到ExcelGenerateException的排查与解决方法。
1. 问题现象
- 本地环境:应用程序能够顺利生成Excel文件,无任何异常。
- Docker环境:部署相同的应用程序后,在执行Excel生成操作时,系统抛出ExcelGenerateException。
例如:
Dockerfile文件:
FROM java:8-alpine
COPY ./docker-demo.jar /tmp/demo-0.0.1-SNAPSHOT.jar
EXPOSE 8090
ENTRYPOINT java -jar /tmp/demo-0.0.1-SNAPSHOT.jar
部署后报错:
com.alibaba.excel.exception.ExcelGenerateException: Create workbook failureat com.alibaba.excel.context.WriteContextImpl.<init>(WriteContextImpl.java:88) ~[easyexcel-3.0.0-beta1.jar!/:na]at com.alibaba.excel.write.ExcelBuilderImpl.<init>(ExcelBuilderImpl.java:36) ~[easyexcel-3.0.0-beta1.jar!/:na]at com.alibaba.excel.ExcelWriter.<init>(ExcelWriter.java:39) ~[easyexcel-3.0.0-beta1.jar!/:na]at com.alibaba.excel.write.builder.ExcelWriterBuilder.build(ExcelWriterBuilder.java:104) ~[easyexcel-3.0.0-beta1.jar!/:na]at com.zjp.demo.service.impl.ExportImpl.export(ExportImpl.java:632) ~[classes!/:na]at com.zjp.demo.service.impl.ExportImpl$$FastClassBySpringCGLIB$$93118298.invoke(<generated>) ~[classes!/:na]at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:704) ~[spring-aop-5.3.23.jar!/:5.3.23]at com.zjp.demo.service.impl.ExportImpl$$EnhancerBySpringCGLIB$$df7a6b3d.riskSurveyExport(<generated>) ~[classes!/:na]at com.zjp.demo.controller.StatisController.riskSurveyExport(StatisController.java:97) ~[classes!/:na]at com.zjp.demo.controller.StatisController$$FastClassBySpringCGLIB$$3f0e2a16.invoke(<generated>) ~[classes!/:na]at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) ~[spring-aop-5.3.23.jar!/:5.3.23]at com.zjp.demo.aop.LogRecordAspect.doAround(LogRecordAspect.java:65) ~[classes!/:na]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_212]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_212]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_212]at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_212]at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) ~[spring-aop-5.3.23.jar!/:5.3.23]at com.zjp.demo.controller.StatisController$$EnhancerBySpringCGLIB$$bebb4c75.riskSurveyExport(<generated>) ~[classes!/:na]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_212]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_212]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_212]at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_212]at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.23.jar!/:5.3.23]at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.23.jar!/:5.3.23]at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.23.jar!/:5.3.23]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.23.jar!/:5.3.23]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.23.jar!/:5.3.23]at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.23.jar!/:5.3.23]at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1071) ~[spring-webmvc-5.3.23.jar!/:5.3.23]at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964) ~[spring-webmvc-5.3.23.jar!/:5.3.23]at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.23.jar!/:5.3.23]at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.23.jar!/:5.3.23]at javax.servlet.http.HttpServlet.service(HttpServlet.java:668) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.23.jar!/:5.3.23]at javax.servlet.http.HttpServlet.service(HttpServlet.java:772) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:211) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.inforsuite.websocket.server.WsFilter.doFilter(WsFilter.java:53) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:180) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91) [spring-web-5.3.23.jar!/:5.3.23]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.23.jar!/:5.3.23]at com.cvicse.bixi.kernel.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:180) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96) [spring-boot-actuator-2.6.13.jar!/:2.6.13]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.23.jar!/:5.3.23]at com.cvicse.bixi.kernel.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:180) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) [spring-web-5.3.23.jar!/:5.3.23]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.23.jar!/:5.3.23]at com.cvicse.bixi.kernel.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:180) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.StandardWrapperValve.invoke(StandardWrapperValve.java:178) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.StandardContextValve.invoke(StandardContextValve.java:92) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:527) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.StandardHostValve.invoke(StandardHostValve.java:133) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.StandardEngineValve.invoke(StandardEngineValve.java:77) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.connector.BixiConnectorAdapter.service(BixiConnectorAdapter.java:341) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.http11.Http11Processor.service(Http11Processor.java:363) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.AbstractProcessorLight.process(AbstractProcessorLight.java:64) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:958) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.inforsuite.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1757) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.inforsuite.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.inforsuite.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1196) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.inforsuite.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:664) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.inforsuite.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at java.lang.Thread.run(Thread.java:748) [na:1.8.0_212]
Caused by: java.lang.NullPointerException: nullat sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264) ~[na:1.8.0_212]at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219) ~[na:1.8.0_212]at sun.awt.FontConfiguration.init(FontConfiguration.java:107) ~[na:1.8.0_212]at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774) ~[na:1.8.0_212]at sun.font.SunFontManager$2.run(SunFontManager.java:431) ~[na:1.8.0_212]at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_212]at sun.font.SunFontManager.<init>(SunFontManager.java:376) ~[na:1.8.0_212]at sun.awt.FcFontManager.<init>(FcFontManager.java:35) ~[na:1.8.0_212]at sun.awt.X11FontManager.<init>(X11FontManager.java:57) ~[na:1.8.0_212]at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_212]at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_212]at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_212]at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_212]at java.lang.Class.newInstance(Class.java:442) ~[na:1.8.0_212]at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83) ~[na:1.8.0_212]at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_212]at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74) ~[na:1.8.0_212]at java.awt.Font.getFont2D(Font.java:491) ~[na:1.8.0_212]at java.awt.Font.canDisplayUpTo(Font.java:2060) ~[na:1.8.0_212]at java.awt.font.TextLayout.singleFont(TextLayout.java:470) ~[na:1.8.0_212]at java.awt.font.TextLayout.<init>(TextLayout.java:531) ~[na:1.8.0_212]at org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:273) ~[poi-4.1.2.jar!/:4.1.2]at org.apache.poi.xssf.streaming.AutoSizeColumnTracker.<init>(AutoSizeColumnTracker.java:117) ~[poi-ooxml-4.1.2.jar!/:4.1.2]at org.apache.poi.xssf.streaming.SXSSFSheet.<init>(SXSSFSheet.java:82) ~[poi-ooxml-4.1.2.jar!/:4.1.2]at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:684) ~[poi-ooxml-4.1.2.jar!/:4.1.2]at org.apache.poi.xssf.streaming.SXSSFWorkbook.<init>(SXSSFWorkbook.java:247) ~[poi-ooxml-4.1.2.jar!/:4.1.2]at org.apache.poi.xssf.streaming.SXSSFWorkbook.<init>(SXSSFWorkbook.java:211) ~[poi-ooxml-4.1.2.jar!/:4.1.2]at org.apache.poi.xssf.streaming.SXSSFWorkbook.<init>(SXSSFWorkbook.java:186) ~[poi-ooxml-4.1.2.jar!/:4.1.2]at com.alibaba.excel.util.WorkBookUtil.createWorkBook(WorkBookUtil.java:42) ~[easyexcel-3.0.0-beta1.jar!/:na]at com.alibaba.excel.context.WriteContextImpl.<init>(WriteContextImpl.java:86) ~[easyexcel-3.0.0-beta1.jar!/:na]... 83 common frames omitted
2. 原因分析
该异常通常源于容器环境中缺少必要的字体配置和支持库,影响了如Apache POI等Excel处理库的正常运作。
3. 解决策略:修改Dockerfile
- 选做:通过添加 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories 命令替换默认的Alpine Linux软件包源为阿里云镜像站,显著提升软件包下载速度。
- 选做:更新软件包索引:RUN apk update
- 核心:在Dockerfile中,通过添加 RUN apk add --no-cache fontconfig ttf-dejavu 命令找到或添加一个合适的环节来安装fontconfig和ttf-dejavu包。这些包提供了必要的字体支持,有助于避免Excel生成时的异常。
最终修改方案为:
FROM java:8-alpine# 更换默认软件源为阿里云镜像站
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories# 更新软件包索引
RUN apk update# 安装字体和配置库
RUN apk add --no-cache fontconfig ttf-dejavuCOPY ./docker-demo.jar /tmp/demo-0.0.1-SNAPSHOT.jar
EXPOSE 8090
ENTRYPOINT java -jar /tmp/demo-0.0.1-SNAPSHOT.jar
相关文章:
优化Docker部署:解决Java应用ExcelGenerateException并提速镜像构建
在开发和部署应用时,经常会遇到在本地环境运行正常,但迁移到Docker容器后出现特定错误的情况。本篇博客将聚焦于解决一个具体问题:当使用Docker部署包含Excel生成功能的Java应用程序时,遇到ExcelGenerateException的排查与解决方法…...
你了解RabbitMQ、RocketMQ和Kafka吗?
是的,我了解 RabbitMQ、RocketMQ 和 Kafka。以下是对这三种消息队列系统的详细介绍: RabbitMQ 概念 RabbitMQ 是一个由 Pivotal 开发的开源消息代理,基于 AMQP(Advanced Message Queuing Protocol)协议。它支持多种…...

python实现可视化大屏(django+pyechars)
1.实现效果图 2.对数据库进行迁移 python manage.py makemigrations python manage.py migrate 3.登录页面 {% load static%} <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport"…...
Leetcode 力扣 125. 验证回文串 (抖音号:708231408)
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s,如果它是 回文串 ,返回 true ;否则&#…...

Java程序递归及mybatis递归查询
之前项目组有个需求,定时同步机构的信息。已知三方接口由于返回数据量很大,所以最后需要三方提供一个可根据机构编号获取当前机构及子机构信息的接口。而不是一次性返回全部机构信息! 由于这次需求也用到了递归,所以记录下&#…...

苹果电脑安装双系统步骤 教你苹果电脑如何装双系统
许多人刚买来苹果电脑时,对苹果的IOS操作系统比较陌生,显得非常不适应,都会去想吧苹果电脑去安装一个自己熟悉的Windows系统,方便自己办公娱乐,那么苹果电脑安装双系统的步骤怎么样呢 小编给大家介绍下吧。 许多人刚买…...

Axios-入门
介绍 Axios对原生Ajax进行了封装,简化书写,快速开发 官网:Axios中文文档 | Axios中文网 (axios-http.cn) 入门 1引入Axios的js文件 <script src"js/axios.js"></script> 2使用Axios发送请求,并获取响应…...

Python22 Pandas库
Pandas 是一个Python数据分析库,它提供了高性能、易于使用的数据结构和数据分析工具。这个库适用于处理和分析输入数据,常见于统计分析、金融分析、社会科学研究等领域。 1.Pandas的核心功能 Pandas 库的核心功能包括: 1.数据结构ÿ…...

不同表格式下的小文件治理方式(开源RC file/ORC/Text非事务表、事务表、Holodesk表格式..)
友情链接: 小文件治理系列之为什么会出现小文件问题,小文件过多问题的危害以及不同阶段下的小文件治理最佳解决手段 小文件过多的解决方法(不同阶段下的治理手段,SQL端、存储端以及计算端) 概览 在前两篇博文中&am…...

0.7 模拟电视标准 PAL 简介
0.7 模拟电视标准PAL PAL 是一种用于模拟电视的彩色编码系统,全名为逐行倒相(Phase Alternating Line)。它是三大模拟彩色电视标准之一,另外两个标准是 NTSC 和 SECAM。“逐行倒相”的意思是每行扫描线的彩色信号会跟上一行倒相&…...
vue项目中封装element分页组件
我们都知道封装组件是为了方便在项目中使用,全局封装之后哪个模块使用直接复制就行了,分页在后台项目中用到的地方也是很多的,所以我们就全局封装一下分页组件,以后也方便在项目中使用,接下来封装的这个分页也是elemen…...
linux下docker安装与镜像容器管理
linux下docker安装与镜像容器管理 原文链接:linux下docker安装与镜像容器管理 导言 ubuntu22.04-docker engine安装,以及镜像容器管理 docker非常简单介绍 docker就是一个虚拟化容器,image是镜像,就是一个dockerfile指明这个镜…...
【Unity】RPG2D龙城纷争(六)关卡编辑器之角色编辑
更新日期:2024年6月26日。 项目源码:第五章发布(正式开始游戏逻辑的章节) 索引 简介一、角色编辑模式1.将字段限制为只读2.创建角色(刷角色)3.预览所有角色4.编辑选中角色属性5.移动角色位置6.移除角色简介 上一篇完成的关卡编辑器已支持创建关卡环境(主要由地块单元组…...
【鸿蒙】鸿蒙的Stage和 FA 有什么区别
鸿蒙的Stage模型和FA(Feature Ability)模型在多个方面存在显著的区别。以下是它们之间的主要差异点: 设计思想和出发点: Stage模型:设计基于为复杂应用而开发的出发点,旨在提供一个更好的开发方式ÿ…...

JAVA小知识29:IO流(上)
IO流是指在计算机中进行输入和输出操作的一种方式,用于读取和写入数据。IO流主要用于处理数据传输,可以将数据从一个地方传送到另一个地方,例如从内存到硬盘,从网络到内存等。IO流在编程中非常常见,特别是在文件操作和…...

大学生毕业季,寄物流快递避雷指南
随着毕业季的来临,大学生们纷纷开始整理自己的行李,准备离开校园,踏入社会。 在这个过程中,寄送快递成为了一个不可或缺的环节。然而,在寄送快递的过程中,如果不注意一些细节,很容易遭遇各种“…...

如何提高项目风险的处理效率?5个重点
提高项目风险的处理效率,有助于迅速识别和应对风险,减少风险导致的延误,降低成本,提升项目质量,确保项目按时交付。如果项目风险处理效率较低,未能及时发现和处理风险,导致问题累积,…...

ZNB40 矢量网络分析仪
ZNB40 矢量网络分析仪 100kHz至40GHz的宽频率范围,具有四个端口和附加信号发生器 概述 R&SZNB40 提供 100 kHz 至 40 GHz 的宽频率范围,具有四个端口和附加信号发生器。 罗德与施瓦茨带四个端口和附加内部信号源的 40 GHz 中档矢量网络分析仪&…...
ingress代理前后端服务跨域
一、前言 ingress对于前后端服务的代理有不同的方式可以实现,前后端服务可以通过不同的域名实现流量的分流策略,不过这需要解决前后端域名不同产生的跨域问题,也可以通过不同的path实现流量的分流策略,该方式不会产生跨域的问题 …...
Python 使用 Thick 方式连接 Oracle Database BaseDB 23ai
Python 使用 Thick 方式连接 Oracle Database BaseDB 23ai 1. 下载Basic.zip 和SQL*Plus(.zip)2. 配置环境变量3. 连接 23ai 1. 下载Basic.zip 和SQL*Plus(.zip) 到 https://www.oracle.com/database/technologies/instant-clien…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)
注:文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件:STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...