Linux服务器docker环境下Jasper Report报错

Jasperreports模板制作方法在网上都有很多教程,可以自行探索一下

我用的模板参考:https://blog.csdn.net/qq_34378595/article/details/119122509

jasper支持中文解决办法:https://blog.csdn.net/hwman/article/details/127294918

本地

POM依赖比较简单

<dependency><groupId>net.sf.jasperreports</groupId><artifactId>jasperreports</artifactId><version>6.20.0</version><exclusions><exclusion><artifactId>itext</artifactId><groupId>com.lowagie</groupId></exclusion></exclusions>
</dependency>
<dependency><groupId>com.lowagie</groupId><artifactId>itext</artifactId><version>2.1.7</version>
</dependency>

包结构如下图

本地测试正常运行

服务器

将项目打包成jar,上传至虚拟机,通过docker部署运行(模拟生产环境为docker)。

Dockerfile的书写:

FROM openjdk:8-jre-alpineMAINTAINER xx <xxx@xx.com>RUN echo "Asia/Shanghai" > /etc/timezoneADD jreport-0.0.1-SNAPSHOT.jar jreport.jarEXPOSE 8001ENTRYPOINT ["java","-jar","jreport.jar"]

使用docker命令docker build -t jasper . 将上传的jar生成docker镜像文件

[root@localhost wtdoc]# docker build -t jreport .
Sending build context to Docker daemon   47.3MB
Step 1/6 : FROM openjdk:8-jre-alpine---> f7a292bbb70c
Step 2/6 : MAINTAINER xx <xxx@xx.com>---> Using cache---> 0c3374f0d2a9
Step 3/6 : RUN echo "Asia/Shanghai" > /etc/timezone---> Running in b414068e4f7b
Removing intermediate container b414068e4f7b---> d09deeea8e1b
Step 4/6 : ADD jreport-0.0.1-SNAPSHOT.jar jreport.jar---> aca70e09a1b2
Step 5/6 : EXPOSE 8001---> Running in 8f39a8521d5b
Removing intermediate container 8f39a8521d5b---> 3bc85535733c
Step 6/6 : ENTRYPOINT ["java","-jar","jreport.jar"]---> Running in 1d48ab69ae5b
Removing intermediate container 1d48ab69ae5b---> 01fee132e458
Successfully built 01fee132e458
Successfully tagged jreport:latest

启动生成的镜像

[root@localhost wtdoc]# docker run -d --name jreport -p 8001:8001 jreport
ffe118ab87e76692c40187c5e374003f6bc3cfc1a768ca49f4de19eb5aa696d8

访问地址,会出现报错信息

nested exception is net.sf.jasperreports.engine.JRRuntimeException: Error initializing graphic environment.] with root cause

查阅资料发现需要设置启动参数(使用headless模式)

修改Dockerfile,在ENTRYPOINT内添加"-Djava.awt.headless=true"

FROM openjdk:8-jre-alpineMAINTAINER xx <xxx@xx.com>RUN echo "Asia/Shanghai" > /etc/timezoneADD jreport-0.0.1-SNAPSHOT.jar jreport.jarEXPOSE 8001ENTRYPOINT ["java","-jar","-Djava.awt.headless=true","jreport.jar"]

删除生成的容器和镜像,重新docker build;启动之后访问地址

同样未能生成PDF,报错

2022-12-09 16:35:54.099 ERROR 1 --- [nio-8001-exec-3] n.s.j.engine.util.JRStyledTextParser     : Error while loading available fontsjava.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]
...

加载字体报错空指针,考虑到已经加了字体到项目中,会不会是Linux没有识别。于是使用java -jar 单纯跑了一次jar包,访问地址能正常生成PDF。

因此怀疑是docker的问题。

docker是独立的,我这里拉取的镜像是alpine。

百度一番,准备给docker环境加中文环境试试。

alpine使用的是apk进行包管理。

于是再次修改Dockerfile


FROM openjdk:8-jre-alpineMAINTAINER xx <xxx@xx.com>RUN echo "http://mirrors.aliyun.com/alpine/v3.12/main" > /etc/apk/repositories \
&& echo "http://mirrors.aliyun.com/alpine/v3.12/community" >> /etc/apk/repositories \
&& echo "http://mirrors.aliyun.com/alpine/v3.12/releases" >> /etc/apk/repositoriesCOPY simhei.ttf /usr/share/fonts/my-fonts/simhei.ttf
COPY STSONG.TTF /usr/share/fonts/my-fonts/STSONG.TTFRUN apk add --update ttf-dejavu fontconfig && rm -rf /var/cache/apk/*RUN mkfontscale && mkfontdir && fc-cacheRUN echo "Asia/Shanghai" > /etc/timezoneADD jreport-0.0.1-SNAPSHOT.jar jreport.jarEXPOSE 8001ENTRYPOINT ["java","-jar","-Djava.awt.headless=true","jreport.jar"]

解释

RUN echo :修改alpin的源为阿里的国内源,下载更快
COPY :将ttf字体文件复制进docker的目标路径之下(没试过不复制,解决问题为主要)
(我将ttf放在Dockerfile同级目录的,因此没有路径在文件名之前)
RUN apk add --update ttf-dejavu fontconfig && rm -rf /var/cache/apk/*
:apk add是alpine的软件安装命令,装了两个东西 ttf-dejavu和fontconfig
rm -rf:删除缓存,减小体积
RUN mkfontscale && mkfontdir && fc-cache: 加载(应该是)

再次删除上次的容器和镜像重新打包生成新的镜像

[root@localhost wtdoc]# docker build -t jreport .
Sending build context to Docker daemon  68.75MB
Step 1/11 : FROM openjdk:8-jre-alpine---> f7a292bbb70c
Step 2/11 : MAINTAINER xx <xxx@xx.com>---> Using cache---> 0c3374f0d2a9
Step 3/11 : RUN echo "http://mirrors.aliyun.com/alpine/v3.12/main" > /etc/apk/repositories && echo "http://mirrors.aliyun.com/alpine/v3.12/community" >> /etc/apk/repositories && echo "http://mirrors.aliyun.com/alpine/v3.12/releases" >> /etc/apk/repositories---> Running in dfa474da1a48
Removing intermediate container dfa474da1a48---> 8517eb8d0926
Step 4/11 : COPY simhei.ttf /usr/share/fonts/my-fonts/simhei.ttf---> c1dea2768721
Step 5/11 : COPY STSONG.TTF /usr/share/fonts/my-fonts/STSONG.TTF---> c581ce616a34
Step 6/11 : RUN apk add --update ttf-dejavu fontconfig && rm -rf /var/cache/apk/*---> Running in f38d804136a8
fetch http://mirrors.aliyun.com/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
fetch http://mirrors.aliyun.com/alpine/v3.12/community/x86_64/APKINDEX.tar.gz
fetch http://mirrors.aliyun.com/alpine/v3.12/releases/x86_64/APKINDEX.tar.gz
ERROR: http://mirrors.aliyun.com/alpine/v3.12/releases: No such file or directory
WARNING: Ignoring APKINDEX.48707b5e.tar.gz: No such file or directory
(1/7) Installing expat (2.2.10-r4)
(2/7) Installing libuuid (2.37.4-r0)
(3/7) Installing fontconfig (2.13.1-r2)
(4/7) Installing encodings (1.0.5-r0)
(5/7) Installing libfontenc (1.1.4-r0)
(6/7) Installing mkfontscale (1.2.1-r1)
(7/7) Installing ttf-dejavu (2.37-r1)
Executing busybox-1.29.3-r10.trigger
Executing fontconfig-2.13.1-r2.trigger
Executing mkfontscale-1.2.1-r1.trigger
OK: 104 MiB in 60 packages
Removing intermediate container f38d804136a8---> 0c5e6ae91946
Step 7/11 : RUN mkfontscale && mkfontdir && fc-cache---> Running in 2c347b6e6b25
Removing intermediate container 2c347b6e6b25---> 3caace61027f
Step 8/11 : RUN echo "Asia/Shanghai" > /etc/timezone---> Running in e198e22230ac
Removing intermediate container e198e22230ac---> ecb4dfe0b234
Step 9/11 : ADD jreport-0.0.1-SNAPSHOT.jar jreport.jar---> 7a261b65edcf
Step 10/11 : EXPOSE 8001---> Running in 66b1b646627a
Removing intermediate container 66b1b646627a---> 1d99a3412ff8
Step 11/11 : ENTRYPOINT ["java","-jar","-Djava.awt.headless=true","jreport.jar"]---> Running in 94e285a053e5
Removing intermediate container 94e285a053e5---> e09e4cb4211a
Successfully built e09e4cb4211a
Successfully tagged jreport:latest

ERROR什么的不存在,写进去了三个源,有一个源没有APKINDEX.tar.gz,能下载就行,此时新的镜像生成成功,启动测试

至此,docker环境下jasperreport中文不生成pdf的问题解决。

Linux服务器docker环境下Jasper Report报错相关推荐

  1. .Net Core通过NPOI在CentOS 7(Docker)环境中导出Excel报错The type initializer for ‘Gdip‘ 的问题

    一.前言 今天在AspNetCore5.0环境中做了一个导出Excel的功能,在开发机器上(windows10)调试正常,但是部署到centos7容器(容器基础环境mcr.microsoft.com/ ...

  2. 嵌入式Linux开发,Ubuntu22下交叉编译内核报错: multiple definition of `yylloc‘; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0

    一.问题描述 嵌入式Linux开发,Ubuntu22下交叉编译内核报错: /usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x10): multiple ...

  3. tp5+linux+apache php7.1.30环境下,上传图片报错:mkdir():permission denied

    做了个自己的博客,后台上传图片的时候报错如图: 首先反应是权限问题,runtime和uploads文件夹已经给了777权限了,超出菜鸟的解决范围,果断百度,但是百度了一堆,全部是关于runtime的, ...

  4. [NodeJS] Jest 环境下 Axios 请求报错: Cross origin http://localhost forbidden

    文章目录 问题概述 解决方案 参考 本博客站点已全量迁移至 DevDengChao 的博客 https://blog.dengchao.fun , 后续的新内容将优先在自建博客站进行发布, 欢迎大家访 ...

  5. x64环境下_findnext()函数报错——0xC0000005: 写入位置 0xFFFFFFFFDF47C5A0 时发生访问冲突

    最近在搞单目相机位姿估计,相机标定参考了[OpenCV3学习笔记 ]相机标定函数 calibrateCamera( ) 使用详解(附相机标定程序和数据)提供的代码. /* @param File_Di ...

  6. linux服务器挂载移动硬盘后移动文件报错

    执行mv命令: mv -f 2020 -/-/-/bx/pp/ 报错信息: mv: inter-device move failed: '2020' to '-/-/-/bx/pp/2020'; un ...

  7. 解决 QRibbon 在VS+Qt 环境下的编码报错问题 “文本后缀无效; 未找到文文本运算符或文本运算符模板“

    一.问题 在使用QRibbon时编译报错 "文本后缀无效; 未找到文文本运算符或文本运算符模板",是因为编码问题,需要将程序文件进行编码设置 二.解决方案 1.Visual Stu ...

  8. centos m4安装linux,Centos Docker环境下安装Dcm4che归档服务

    本文实现了搭建一个最小的基于Dcm4che+Docker的归档服务,能够实现影像DICOM的归档,调阅,转发功能,其搭建参考于GitHub 开源项目说明:dcm4che/dcm4chee-arc-li ...

  9. ThinkPHP框架在linux服务器nginx环境下跑出现溢出缓存问题解决方法

    问题描述: :( Allowed memory size of 1916796928 bytes exhausted (tried to allocate 3086655745 bytes) 错误位置 ...

最新文章

  1. java中的易混问题收集
  2. cf366C Dima and Salad (dp)
  3. wxWidgets:wxGridUpdateLocker类用法
  4. VC++取MD5算法记录下以后用得到(转)
  5. cygwin 编译 android vlc,Cygwin 编译 VLC 问题
  6. (摘要)100个伟大的商业理念:理念35:引爆流行
  7. python网页爬虫菜鸟教程_Python爬虫实践(7)-抓取菜鸟教程python学习路线-工具-站长头条...
  8. Java常见笔试题(99.9%必问)
  9. 什么是计算机病毒?是怎么产生的?
  10. 树莓派接入VGA显示器画面不全偏左的问题与VGA转HDMI连接显示器无法输出声音的解决
  11. 阿里巴巴国际站首页地址怎复制链接店铺PC自己外贸平台装修链接我的全球旺铺装修全屏代码装修设置复制链接
  12. String 占位符
  13. E4A安卓app制作——初识易安卓(一)
  14. 在ios10+的safair中实现视频的自动播放
  15. c# 编写水准测量平差程序
  16. 网易数读所有精致图片,Python百行代码搞定!
  17. 一分钟一个Pandas小技巧(一)
  18. 测试两个主机之间的连通性_网络连通性测试工具—PING
  19. hive数据备份方案
  20. MySQL常用系统名字

热门文章

  1. c++primer(第五版) 第十五章 面向对象程序设计习题答案
  2. python自学-class14(down)-窗口界面的设计基础
  3. MapReduce的核心资料索引 [转]
  4. 美国计算机科学排名前三大学,美国计算机科学专业大学排名(2021 USNEWS)
  5. windows系统bat批处理 微信多开,软件多开
  6. C#——获取银行卡所属银行,验证银行卡号是否正确
  7. 最真挚的告白与道歉信(代码实现)
  8. noip初赛问题解析
  9. 最近遇到的异常与错误总结
  10. 无线授时服务器接LED屏,实现ipad远程无线控制led大屏幕分以下几个步骤!