最近工作中遇到了这个问题,在这里写一篇博客记录一下。
目录
简介
什么是applet?
Java Applet 是一种使用 Java 编程语言编写的程序,它可以嵌入到网页中并在用户的浏览器上运行。Applet 通常用于实现更丰富、交互性更强的网络应用。
目前由于安全问题已经被废弃。
需要解决什么问题?
由于applet已经被废弃,现在主流的浏览器已经不再支持,目前需要firefox52版本 or 奇安信 or 360浏览器才能支持运行,同时需要安装icedtea的1.6版本,让applet和本地通信。
使用支持applet的浏览器的情况下,ubuntu2004上applet无法运行,但是在1604上可以正常运行。
icedtea是什么?
icedtea是一个openjdk开发的用于运行applet的组件,可以作为libnpjp2.so的替代。
oracle8的jre里自带一个插件libnpjp2.so,这个插件可以用来开发Java applet。
不过oracle8的jre只提供amd版本,不提供arm版本,导致使用了oracle的jre开发的applet的业务系统无法在arm上运行,本次解决的就是这个问题。
ps:libnpjp2.so只在oracle的jre里有,jdk里没有,原因不明
icedtea的版本选择
icedtea的下载地址在这里:icedtea-web package : Ubuntu
里面2004的只有1.8版本,不过这个版本是无法使用的,因为icedtea从1.7版本就删除了对浏览器上applet的支持。
所以这里我们选择1804里1.6.2-3.1ubuntu3这个版本。
浏览器选择
firefox自从52版本之后就放弃了对applet的支持,所以我们这里选择52及以下的版本firefox。
或者这里可以选择一些国产浏览器,奇安信或者360,这些浏览器保留了对applet的支持。
如何判断安装成功?
安装完成后如果在浏览器插件页面找到了icedtea字样的插件,说明安装成功。
之后需要安装openjdk-8-jre作为启动环境,因为applet的启动需要依赖jre。
sudo apt install openjdk-8-jre
测试一下
测试网页在这里:Applet Demo
里面有一大堆applet的demo,选哪个都行。
测试了之后会发现,applet是无法正常显示的,这个时候我们可以打开icedtea的debug开关,查看一下日志信息。
分析
先打开icedtea的设置页面,然后按照红字进行勾选,然后关闭浏览器重新打开applet的demo,即可看到日志。
itweb-settings
通过分析日志发现日志最终会卡在plugin_callback,应该是没有收到回应导致的无法显示。
不过用同样的jdk,icedtea和浏览器,在1804上可以正常运行,所以这是OS导致的问题。
最终通过重新编译icedtea(在1604上)打印报错信息确认了是glib的接口阻塞了。
经排查,是这个commit导致了applet阻塞。
真正导致applet无法运行的就是红框代码,新增了对0x00的校验,而applet通信的部分格式就是以0x00结尾,因此无法通过校验。
因此在回退这个commit之后重新编译glib,安装了新的glib之后applet可以正常运行。
另一种方法
最近发现运行applet还有另一种方法,就是使用浏览器的插件“cheerp applet runner”。
安装这个插件后重新打开使用applet的网页,然后点击这个插件,就可以看到applet正常运行。
该插件非商业使用免费。