当前位置: 首页 > news >正文

优化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

  1. 选做:通过添加 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories 命令替换默认的Alpine Linux软件包源为阿里云镜像站,显著提升软件包下载速度。
  2. 选做:更新软件包索引:RUN apk update
  3. 核心:在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并提速镜像构建

在开发和部署应用时&#xff0c;经常会遇到在本地环境运行正常&#xff0c;但迁移到Docker容器后出现特定错误的情况。本篇博客将聚焦于解决一个具体问题&#xff1a;当使用Docker部署包含Excel生成功能的Java应用程序时&#xff0c;遇到ExcelGenerateException的排查与解决方法…...

你了解RabbitMQ、RocketMQ和Kafka吗?

是的&#xff0c;我了解 RabbitMQ、RocketMQ 和 Kafka。以下是对这三种消息队列系统的详细介绍&#xff1a; RabbitMQ 概念 RabbitMQ 是一个由 Pivotal 开发的开源消息代理&#xff0c;基于 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议。它支持多种…...

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)

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xff1b;否则&#…...

Java程序递归及mybatis递归查询

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

苹果电脑安装双系统步骤 教你苹果电脑如何装双系统

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

Axios-入门

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

Python22 Pandas库

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

不同表格式下的小文件治理方式(开源RC file/ORC/Text非事务表、事务表、Holodesk表格式..)

友情链接&#xff1a; 小文件治理系列之为什么会出现小文件问题&#xff0c;小文件过多问题的危害以及不同阶段下的小文件治理最佳解决手段 小文件过多的解决方法&#xff08;不同阶段下的治理手段&#xff0c;SQL端、存储端以及计算端&#xff09; 概览 在前两篇博文中&am…...

0.7 模拟电视标准 PAL 简介

0.7 模拟电视标准PAL PAL 是一种用于模拟电视的彩色编码系统&#xff0c;全名为逐行倒相&#xff08;Phase Alternating Line&#xff09;。它是三大模拟彩色电视标准之一&#xff0c;另外两个标准是 NTSC 和 SECAM。“逐行倒相”的意思是每行扫描线的彩色信号会跟上一行倒相&…...

vue项目中封装element分页组件

我们都知道封装组件是为了方便在项目中使用&#xff0c;全局封装之后哪个模块使用直接复制就行了&#xff0c;分页在后台项目中用到的地方也是很多的&#xff0c;所以我们就全局封装一下分页组件&#xff0c;以后也方便在项目中使用&#xff0c;接下来封装的这个分页也是elemen…...

linux下docker安装与镜像容器管理

linux下docker安装与镜像容器管理 原文链接&#xff1a;linux下docker安装与镜像容器管理 导言 ubuntu22.04-docker engine安装&#xff0c;以及镜像容器管理 docker非常简单介绍 docker就是一个虚拟化容器&#xff0c;image是镜像&#xff0c;就是一个dockerfile指明这个镜…...

【Unity】RPG2D龙城纷争(六)关卡编辑器之角色编辑

更新日期:2024年6月26日。 项目源码:第五章发布(正式开始游戏逻辑的章节) 索引 简介一、角色编辑模式1.将字段限制为只读2.创建角色(刷角色)3.预览所有角色4.编辑选中角色属性5.移动角色位置6.移除角色简介 上一篇完成的关卡编辑器已支持创建关卡环境(主要由地块单元组…...

【鸿蒙】鸿蒙的Stage和 FA 有什么区别

鸿蒙的Stage模型和FA&#xff08;Feature Ability&#xff09;模型在多个方面存在显著的区别。以下是它们之间的主要差异点&#xff1a; 设计思想和出发点&#xff1a; Stage模型&#xff1a;设计基于为复杂应用而开发的出发点&#xff0c;旨在提供一个更好的开发方式&#xff…...

JAVA小知识29:IO流(上)

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

大学生毕业季,寄物流快递避雷指南

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

如何提高项目风险的处理效率?5个重点

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

ZNB40 矢量网络分析仪

ZNB40 矢量网络分析仪 100kHz至40GHz的宽频率范围&#xff0c;具有四个端口和附加信号发生器 概述 R&SZNB40 提供 100 kHz 至 40 GHz 的宽频率范围&#xff0c;具有四个端口和附加信号发生器。 罗德与施瓦茨带四个端口和附加内部信号源的 40 GHz 中档矢量网络分析仪&…...

ingress代理前后端服务跨域

一、前言 ingress对于前后端服务的代理有不同的方式可以实现&#xff0c;前后端服务可以通过不同的域名实现流量的分流策略&#xff0c;不过这需要解决前后端域名不同产生的跨域问题&#xff0c;也可以通过不同的path实现流量的分流策略&#xff0c;该方式不会产生跨域的问题 …...

Python 使用 Thick 方式连接 Oracle Database BaseDB 23ai

Python 使用 Thick 方式连接 Oracle Database BaseDB 23ai 1. 下载Basic.zip 和SQL*Plus&#xff08;.zip&#xff09;2. 配置环境变量3. 连接 23ai 1. 下载Basic.zip 和SQL*Plus&#xff08;.zip&#xff09; 到 https://www.oracle.com/database/technologies/instant-clien…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...