在 Windows 平台上使用 openjdk 运行 awt 代码时出现 NoClassDefFoundError

Posted

技术标签:

【中文标题】在 Windows 平台上使用 openjdk 运行 awt 代码时出现 NoClassDefFoundError【英文标题】:NoClassDefFoundError when running awt codes with openjdk on windows platform 【发布时间】:2016-09-20 02:21:02 【问题描述】:

我按照http://openjdk.java.net/groups/build/ 的说明为windows 构建了一个32 位openjdk(jdk8u92),构建过程成功,没有任何问题,但是当我使用swing 和新构建的openjdk 运行程序时,这是一个简单的gui 程序,出现如下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: sun.font.SunFontManager
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:82)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
at java.awt.Font.getFont2D(Font.java:491)
at java.awt.Font.getFamily(Font.java:1220)
at java.awt.Font.getFamily_NoClientCode(Font.java:1194)
at java.awt.Font.getFamily(Font.java:1186)
at sun.swing.SwingUtilities2.displayPropertiesToCSS(SwingUtilities2.java:1478)
at javax.swing.plaf.basic.Basichtml$BasicDocument.setFontAndColor(BasicHTML.java:366)
at javax.swing.plaf.basic.BasicHTML$BasicDocument.<init>(BasicHTML.java:355)
at javax.swing.plaf.basic.BasicHTML$BasicEditorKit.createDefaultDocument(BasicHTML.java:311)
at javax.swing.plaf.basic.BasicHTML.createHTMLView(BasicHTML.java:54) 
at javax.swing.plaf.basic.BasicHTML.updateRenderer(BasicHTML.java:207)
at javax.swing.plaf.basic.BasicLabelUI.propertyChange(BasicLabelUI.java:417)
at java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:335)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:327)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:263)
at java.awt.Component.firePropertyChange(Component.java:8428)
at javax.swing.JLabel.setText(JLabel.java:330)
......

我可以在openjdk中找到sun.font.SunFontManager,但是类加载器似乎无法加载类...

有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

最后我自己找到了这个问题的根本原因:

这个问题是由于我将 openjdk 与由 gnuwin32 编译的 freetype 2.3.5_1 库链接引起的,但我的本地构建环境基于 cygwin。所以, 运行awt java代码时,freetype 2.3.5_1会报错没有找到依赖(应该是zip2.dll,gunwin32在构建freetype 2.3.5_1时添加了它),而openjdk吃了这个错误并抛出sun.font.SunFontManager is not found .

解决方案是使用visual studio在我自己的环境中构建freetype。

【讨论】:

以上是关于在 Windows 平台上使用 openjdk 运行 awt 代码时出现 NoClassDefFoundError的主要内容,如果未能解决你的问题,请参考以下文章

OpenJDK-study-002 从GitHub下载openjdk,以及Cygwin的安装

如何在Windows上获取OpenJDK 11的tools.jar?

如何在 Windows 上安装 OpenJDK 11?

windows上安装Mercurial4.4.1 克隆OPENJDK版本库

我在哪里可以获得 OpenJDK(Windows)的预构建 JavaFX 库 [关闭]

怎么安装部署OSA运维管理平台 linux 运维 服务器管理