Linux - Linux服务器安装字体fonts;Java服务验证码报错Caused by: java.lang.NullPointerException at (FontConfiguration
2、Linux给`/usr/share/fonts` 文件夹赋予root权限在Linux中,给某个文件或文件夹赋予root权限,通常意味着更改其所有者为root用户。你可以使用命令来更改所有者。以下是一个命令示例,它会将名为 '/usr/share/fonts' 的文件夹的所有者更改为root用户:这里,是你要更改权限的文件夹的路径。部分指定了所有者,而指定了组。如果你还想要给文件夹内的所有文件和
Java服务部署到Linux服务器验证码接口报错

org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.InternalError: java.lang.reflect.InvocationTargetException
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1085)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:655)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.InternalError: java.lang.reflect.InvocationTargetException
at java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:86)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.desktop/sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
at java.desktop/sun.font.SunFontManager.getInstance(SunFontManager.java:247)
at java.desktop/sun.font.FontDesignMetrics.getMetrics(FontDesignMetrics.java:265)
at java.desktop/sun.java2d.SunGraphics2D.getFontMetrics(SunGraphics2D.java:856)
at com.wf.captcha.SpecCaptcha.graphicsImage(SpecCaptcha.java:76)
at com.wf.captcha.SpecCaptcha.out(SpecCaptcha.java:45)
at com.wf.captcha.base.Captcha.toBase64(Captcha.java:127)
at com.wf.captcha.SpecCaptcha.toBase64(SpecCaptcha.java:50)
at cn.ls.module.mis.service.impl.LoginServiceImpl.captcha(LoginServiceImpl.java:80)
at cn.ls.module.mis.controller.LoginController.getAuthCode(LoginController.java:46)
at cn.ls.module.mis.controller.LoginController$$FastClassBySpringCGLIB$$ebb3de28.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708)
at cn.ls.module.mis.controller.LoginController$$EnhancerBySpringCGLIB$$c754068f.getAuthCode(<generated>)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1070)
... 46 more
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
at java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:84)
... 78 more
Caused by: java.lang.NullPointerException
at java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1262)
at java.desktop/sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:225)
at java.desktop/sun.awt.FontConfiguration.init(FontConfiguration.java:107)
at java.desktop/sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:719)
at java.desktop/sun.font.SunFontManager$2.run(SunFontManager.java:367)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.desktop/sun.font.SunFontManager.<init>(SunFontManager.java:312)
at java.desktop/sun.awt.FcFontManager.<init>(FcFontManager.java:35)
at java.desktop/sun.awt.X11FontManager.<init>(X11FontManager.java:56)
... 83 more
这是一个字体相关的 Java 运行时错误。问题出现在生成验证码时,Java 无法加载系统字体,导致了 NullPointerException。这通常发生在 Linux 服务器或缺少中文字体的环境中
cd /usr/share/fonts
如没有,创建文件夹
sudo mkdir /usr/share/fonts
# 1. 检查系统版本
cat /etc/redhat-release
# 2. 更新yum缓存
sudo yum clean all
sudo yum makecache
# 3. 安装fontconfig
sudo yum install -y fontconfig
# 4. 安装常用字体
sudo yum install -y dejavu-sans-fonts dejavu-serif-fonts
# 5. 重新生成字体缓存
fc-cache -fv
1、打开「终端」导航到 `/usr/share/fonts` 目录;如果没有,就创建一个
cd /usr/share/fonts
或者
sudo mkdir /usr/share/fonts
2、Linux给`/usr/share/fonts` 文件夹赋予root权限
在Linux中,给某个文件或文件夹赋予root权限,通常意味着更改其所有者为root用户。你可以使用chown命令来更改所有者。
以下是一个命令示例,它会将名为 '/usr/share/fonts' 的文件夹的所有者更改为root用户:
sudo chown root:root /usr/share/fonts
这里,/path/to/example_folder是你要更改权限的文件夹的路径。root:部分指定了所有者,而root指定了组。
如果你还想要给文件夹内的所有文件和子文件夹赋予相同的权限,可以使用-R(递归)选项:
sudo chown -R root:root /path/to/example_folder
3、将字体文件上传到 Linux 服务器。你可以使用 SCP 或 SFTP 等工具将字体文件从本地计算机上传到 Linux 服务器上 Font字体下载
或者使用以下命令将下载好的字体文件(ttf、otf 等)复制到 `fonts` 目录中:
sudo cp ~/Downloads/*.ttf /usr/share/fonts
4、运行以下命令更新字体缓存,让系统识别新安装的字体:
sudo fc-cache -f -v
如果该命令不存在,执行以下命令
sudo fc-cache -f -v
sudo: fc-cache:找不到命令
报错解释: 这个错误表明sudo命令试图以超级用户权限执行fc-cache命令,但是系统中没有找到fc-cache这个命令。
fc-cache是一个用于字体配置的工具,通常它是fontconfig包的一部分,属于字体渲染和管理工具。
解决方法: 确认你的系统上是否安装了fontconfig包。如果没有安装,你需要根据你的操作系统安装它。
【1】对于Debian/Ubuntu系统,可以使用以下命令安装:
sudo apt-get update sudo apt-get install fontconfig
【2】对于Red Hat/CentOS系统,可以使用以下命令安装:
sudo yum install fontconfig
【3】对于Fedora系统,可以使用以下命令安装:
sudo dnf install fontconfig
【4】对于Arch Linux,可以使用以下命令安装:
sudo pacman -S fontconfig
【5】对于macOS,如果你使用Homebrew,可以使用以下命令安装: brew install fontconfig
如果fontconfig已经安装,可能是fc-cache不在环境变量的PATH中。可以尝试直接使用完整路径运行fc-cache,例如: sudo /usr/bin/fc-cache -f -v 或者,检查fc-cache的实际安装位置并将其添加到PATH环境变量中。
如果你不确定fc-cache的确切位置,可以使用find命令来搜索它: sudo find / -name fc-cache 2>/dev/null
找到fc-cache后,使用其完整路径运行命令
sudo apt-get update
sudo apt-get install fontconfig
再重新执行更新命
sudo fc-cache -f -v
5、检查是否安装成功
字体安装完成后,可以通过 `fc-list` 命令验证新字体是否成功安装
fc-list | grep "思源黑体"
或者
fc-list
可参考:
所有评论(0)