在 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上安装Mercurial4.4.1 克隆OPENJDK版本库