若依系统部署在linux系统 验证码报错:FontConfiguration.getVersion报空指针异常

文章讨论了一名开发者在Linux系统上部署后端服务时遇到的空指针异常问题,该异常与sun.awt.FontConfiguration相关。文章提到了OpenJDK和OracleJDK的区别,并指出问题可能源于OpenJDK的字体配置。解决方案包括手动安装字体库(如fontconfig)或切换到OracleJDK。
摘要由CSDN通过智能技术生成

最近遇到一个问题:若依前后端分离后端服务部署到linnux系统后访问/capthaImage 报空指针异常!
报错如下:
在这里插入图片描述
首先看问题sun.awt.FontConfiguration.getVersion();
这是jdk的问题啊!
首先查看linux系统的jdk信息

openjdk version "1.8.0_41"
OpenJDK Runtime Environment (build 1.8.0_41-b04)
OpenJDK 64-Bit Server VM (build 25.40-b25, mixed mode)

这用的openjdk啊,我本地开发使用的是oraclejdk。

这里简单介绍下openjdk与oraclejdk区别

OpenJDKJava最早由SUN公司(Sun Microsystems,发起于美国斯坦福大学,SUN是Stanford University Network的缩写)发明,2006年SUN公司将Java开源,此时的JDK即为OpenJDK。OpenJDK是Java SE的开源实现,他由SUN和Java社区提供支持,2009年Oracle收购了Sun公司,自此Java的维护方之一的SUN也变成了Oracle。大多数JDK都是在OpenJDK的基础上编写实现的,比如IBM J9,Azul Zulu,Azul Zing和Oracle JDK。几乎现有的所有JDK都派生自OpenJDK,他们之间不同的是许可证,OpenJDK根据许可证GPL v2发布。Oracle JDK根据Oracle二进制代码许可协议获得许可。Oracle JDKOracle JDK之前被称为SUN JDK,显而易见,这是在2009年Oracle收购SUN公司之前,收购后被命名为Oracle JDK。实际上,Oracle JDK是基于OpenJDK源代码构建的,因此Oracle JDK和OpenJDK之间没有重大的技术差异。某次大会上,曾用下图证实了OpenJDK 7和Oracle JDK 7在程序上是非常接近的,两者共用了大量相同的代码,图中提示了两者共同代码的占比要远高于图形上看到的比例,所以我们编译的OpenJDK基本上可以认为性能、功能和执行逻辑上都和官方的Oracle JDK是一致的,两者区别再粗暴些地说,OpenJDK是开源的,Oracle JDK是官方的,从网站就能看出一些端倪,OpenJDK界面如此粗糙(OpenJDK),朋友们可能从中看出了SUN的影子,
命令行中使用java -version,可以看到JDK的版本,如果是Oracle JDK,会显示,

[root@localhost ~]# java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

其中Java HotSpot™ 64-Bit Server VM表明,此JDK的JVM是Oracle的64位HotSpot虚拟机,运行在Server模式下。Java™ SE Runtime Environment (build 1.8.0_162-b12)是Java运行时环境(即JRE)的版本信息。如果是OpenJDK,会显示,

[root@localhost ~]# java -version
openjdk version "11-ea" 2018-09-25
OpenJDK Runtime Environment (build 11-ea+28)
OpenJDK 64-Bit Server VM (build 11-ea+28, mixed mode, sharing)

主要的Linux发行版(例如这些常见的Ubuntu、Fedora和Red Hat Enterprise Linux)提供OpenJDK或其变体作为系统默认的Java SE的实现。注意:使用yum install jdk安装成的是OpenJDK。
另外几点不同,授权协议的不同:

  1. OpenJDK采用GPL V2协议放出,而Oracle
    JDK则采用JRL放出。两者协议虽然都是开放源代码的,但是在使用上的不同在于GPL V2允许在商业上使用,而JRL只允许个人研究使用。
  2. OpenJDK不包含Deployment(部署)功能:部署的功能包括:Browser Plugin、Java Web Start、以及Java控制面板,这些功能在OpenJDK中是找不到的。
  3. OpenJDK源代码不完整:这个很容易想到,在采用GPL协议的OpenJDK中,SUN JDK的一部分源代码因为产权的问题无法开放给OpenJDK使用,其中最主要的部份就是JMX中的可选元件SNMP部份的代码。因此这些不能开放的源代码 将它作成plug,以供OpenJDK编译时使用,你也可以选择不要使用plug。而Icedtea则为这些不完整的部分开发了相同功能的源代码(OpenJDK6),促使OpenJDK更加完整。部分源代码用开源代码替换:由于产权的问题,很多产权不是SUN的源代码被替换成一些功能相同的开源代码,比如说字体栅格化引擎,使用Free Type代替。
  4. OpenJDK只包含最精简的JDK:OpenJDK不包含其他的软件包,比如Rhino Java DB JAXP…,并且可以分离的软件包也都是尽量的分离,但是这大多数都是自由软件,你可以自己下载加入。不能使用Java商标:这个很容易理解,在安装OpenJDK的机器上,输入“java -version”显示的是OpenJDK,但是如果是使用Icedtea补丁的OpenJDK,显示的是java。

解决问题

  1. 手动安装字体库
安装命令:yum install fontconfig
  1. 更换oraclejdk
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值